NFSv4: Fix CLOSE races with OPEN
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 14 Nov 2016 16:19:55 +0000 (11:19 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 18 Nov 2016 18:35:58 +0000 (13:35 -0500)
commit3e7dfb1659c2888fc0152ec2b02a5e932397bb0a
tree301cbdf7e52009221b137a1d028a1b916d38e167
parent23ea44c2150d14b97518435a65cc74111804fbeb
NFSv4: Fix CLOSE races with OPEN

If the reply to a successful CLOSE call races with an OPEN to the same
file, we can end up scribbling over the stateid that represents the
new open state.
The race looks like:

  Client Server
  ====== ======

  CLOSE stateid A on file "foo"
CLOSE stateid A, return stateid C
  OPEN file "foo"
OPEN "foo", return stateid B
  Receive reply to OPEN
  Reset open state for "foo"
  Associate stateid B to "foo"

  Receive CLOSE for A
  Reset open state for "foo"
  Replace stateid B with C

The fix is to examine the argument of the CLOSE, and check for a match
with the current stateid "other" field. If the two do not match, then
the above race occurred, and we should just ignore the CLOSE.

Reported-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c