summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4state.c
diff options
context:
space:
mode:
authorTrond Myklebust2012-03-07 19:49:12 +0100
committerTrond Myklebust2012-03-07 19:49:12 +0100
commitcf470c3e004efe16d73dc8ba9b29bdc9a5327cda (patch)
tree57f8f72ef5af7d33d760570bd8d78e9b0face719 /fs/nfs/nfs4state.c
parentNFSv4.1 handle DS stateid errors (diff)
downloadkernel-qcow2-linux-cf470c3e004efe16d73dc8ba9b29bdc9a5327cda.tar.gz
kernel-qcow2-linux-cf470c3e004efe16d73dc8ba9b29bdc9a5327cda.tar.xz
kernel-qcow2-linux-cf470c3e004efe16d73dc8ba9b29bdc9a5327cda.zip
NFSv4: Don't free the nfs4_lock_state until after the release_lockowner
Otherwise we can end up with sequence id problems if the client reuses the owner_id before the server has processed the release_lockowner Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r--fs/nfs/nfs4state.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index a58d02a0c27d..7adc46b4c7f8 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -784,7 +784,7 @@ out_free:
return NULL;
}
-static void nfs4_free_lock_state(struct nfs4_lock_state *lsp)
+void nfs4_free_lock_state(struct nfs4_lock_state *lsp)
{
struct nfs_server *server = lsp->ls_state->owner->so_server;
@@ -842,8 +842,10 @@ void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
if (list_empty(&state->lock_states))
clear_bit(LK_STATE_IN_USE, &state->flags);
spin_unlock(&state->state_lock);
- if (lsp->ls_flags & NFS_LOCK_INITIALIZED)
- nfs4_release_lockowner(lsp);
+ if (lsp->ls_flags & NFS_LOCK_INITIALIZED) {
+ if (nfs4_release_lockowner(lsp) == 0)
+ return;
+ }
nfs4_free_lock_state(lsp);
}