]> git.baikalelectronics.ru Git - kernel.git/commit
nfsd: fix race with open / open upgrade stateids
authorAndrew Elble <aweits@rit.edu>
Fri, 6 Nov 2015 01:42:43 +0000 (20:42 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 10 Nov 2015 14:29:45 +0000 (09:29 -0500)
commit7b03e6ec414352073d5a107a8367de1a08f8a87a
tree1470204738456cc407010bf070efc134e0490141
parentfdbdee80f3475f585b7afcb593e8559e11996432
nfsd: fix race with open / open upgrade stateids

We observed multiple open stateids on the server for files that
seemingly should have been closed.

nfsd4_process_open2() tests for the existence of a preexisting
stateid. If one is not found, the locks are dropped and a new
one is created. The problem is that init_open_stateid(), which
is also responsible for hashing the newly initialized stateid,
doesn't check to see if another open has raced in and created
a matching stateid. This fix is to enable init_open_stateid() to
return the matching stateid and have nfsd4_process_open2()
swap to that stateid and switch to the open upgrade path.
In testing this patch, coverage to the newly created
path indicates that the race was indeed happening.

Signed-off-by: Andrew Elble <aweits@rit.edu>
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c