diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 14:20:12 -0700 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 14:20:12 -0700 |
commit | 9512135df14f8293b9bc5e8fb22d4279dee5ff66 (patch) | |
tree | 83fb778ed53ba10c46734968f538aa0a57d376a1 /fs/nfs/nfs4state.c | |
parent | cee54fc944422c44e476736c045a9e8053cb0644 (diff) | |
download | op-kernel-dev-9512135df14f8293b9bc5e8fb22d4279dee5ff66.zip op-kernel-dev-9512135df14f8293b9bc5e8fb22d4279dee5ff66.tar.gz |
NFSv4: Fix a potential CLOSE race
Once the state_owner and lock_owner semaphores get removed, it will be
possible for other OPEN requests to reopen the same file if they have
lower sequence ids than our CLOSE call.
This patch ensures that we recheck the file state once
nfs_wait_on_sequence() has completed waiting.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r-- | fs/nfs/nfs4state.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index f535c21..59c93f3 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -518,7 +518,11 @@ void nfs4_close_state(struct nfs4_state *state, mode_t mode) newstate |= FMODE_WRITE; if (state->state == newstate) goto out; - if (nfs4_do_close(inode, state, newstate) == -EINPROGRESS) + if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { + state->state = newstate; + goto out; + } + if (nfs4_do_close(inode, state, newstate) == 0) return; } out: |