nfsd4: don't destroy in-use clients
authorJ. Bruce Fields <bfields@redhat.com>
Tue, 2 Apr 2013 02:23:49 +0000 (22:23 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Apr 2013 15:48:39 +0000 (11:48 -0400)
commit221a68766973d7a3afe40a05abd8258b5de016a0
treece1770ad1f1cc7227d8b8819101875b8f36a449b
parent4f6e6c17733ecf01c05a693ced8349ccf8101fd8
nfsd4: don't destroy in-use clients

When a setclientid_confirm or create_session confirms a client after a
client reboot, it also destroys any previous state held by that client.

The shutdown of that previous state must be careful not to free the
client out from under threads processing other requests that refer to
the client.

This is a particular problem in the NFSv4.1 case when we hold a
reference to a session (hence a client) throughout compound processing.

The server attempts to handle this by unhashing the client at the time
it's destroyed, then delaying the final free to the end.  But this still
leaves some races in the current code.

I believe it's simpler just to fail the attempt to destroy the client by
returning NFS4ERR_DELAY.  This is a case that should never happen
anyway.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c
fs/nfsd/state.h