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 | linux-9512135df14f8293b9bc5e8fb22d4279dee5ff66.tar.gz linux-9512135df14f8293b9bc5e8fb22d4279dee5ff66.tar.bz2 linux-9512135df14f8293b9bc5e8fb22d4279dee5ff66.zip |
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 f535c219cf3a..59c93f37e1b2 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: |