aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4state.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2013-05-03 16:22:55 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-05-06 17:24:27 -0400
commitc8b2d0bfd3370a5e19e64ddb23f8bc1276410b6c (patch)
tree18a26f03ce32f7707d335c2b25187c6d61c91fda /fs/nfs/nfs4state.c
parent7c1d5fae4a87d3cf3e9ffd68bcdbaf6529013009 (diff)
NFSv4.1: Ensure that we free the lock stateid on the server
This ensures that the server doesn't need to keep huge numbers of lock stateids waiting around for the final CLOSE. See section 8.2.4 in RFC5661. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r--fs/nfs/nfs4state.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 0b32f9483b7a..300d17d85c0e 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -921,6 +921,7 @@ static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_
921 */ 921 */
922void nfs4_put_lock_state(struct nfs4_lock_state *lsp) 922void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
923{ 923{
924 struct nfs_server *server;
924 struct nfs4_state *state; 925 struct nfs4_state *state;
925 926
926 if (lsp == NULL) 927 if (lsp == NULL)
@@ -932,11 +933,13 @@ void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
932 if (list_empty(&state->lock_states)) 933 if (list_empty(&state->lock_states))
933 clear_bit(LK_STATE_IN_USE, &state->flags); 934 clear_bit(LK_STATE_IN_USE, &state->flags);
934 spin_unlock(&state->state_lock); 935 spin_unlock(&state->state_lock);
936 server = state->owner->so_server;
935 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) { 937 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
936 if (nfs4_release_lockowner(lsp) == 0) 938 struct nfs_client *clp = server->nfs_client;
937 return; 939
938 } 940 clp->cl_mvops->free_lock_state(server, lsp);
939 nfs4_free_lock_state(lsp->ls_state->owner->so_server, lsp); 941 } else
942 nfs4_free_lock_state(server, lsp);
940} 943}
941 944
942static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src) 945static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)