aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r--fs/nfs/nfs4proc.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 7dd8aca31c29..6ca0c8e7a945 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2226,9 +2226,13 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
2226 ret = _nfs4_proc_open(opendata); 2226 ret = _nfs4_proc_open(opendata);
2227 if (ret != 0) { 2227 if (ret != 0) {
2228 if (ret == -ENOENT) { 2228 if (ret == -ENOENT) {
2229 d_drop(opendata->dentry); 2229 dentry = opendata->dentry;
2230 d_add(opendata->dentry, NULL); 2230 if (dentry->d_inode)
2231 nfs_set_verifier(opendata->dentry, 2231 d_delete(dentry);
2232 else if (d_unhashed(dentry))
2233 d_add(dentry, NULL);
2234
2235 nfs_set_verifier(dentry,
2232 nfs_save_change_attribute(opendata->dir->d_inode)); 2236 nfs_save_change_attribute(opendata->dir->d_inode));
2233 } 2237 }
2234 goto out; 2238 goto out;
@@ -2614,23 +2618,23 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
2614 is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags); 2618 is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
2615 is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags); 2619 is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
2616 is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags); 2620 is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
2617 /* Calculate the current open share mode */
2618 calldata->arg.fmode = 0;
2619 if (is_rdonly || is_rdwr)
2620 calldata->arg.fmode |= FMODE_READ;
2621 if (is_wronly || is_rdwr)
2622 calldata->arg.fmode |= FMODE_WRITE;
2623 /* Calculate the change in open mode */ 2621 /* Calculate the change in open mode */
2622 calldata->arg.fmode = 0;
2624 if (state->n_rdwr == 0) { 2623 if (state->n_rdwr == 0) {
2625 if (state->n_rdonly == 0) { 2624 if (state->n_rdonly == 0)
2626 call_close |= is_rdonly || is_rdwr; 2625 call_close |= is_rdonly;
2627 calldata->arg.fmode &= ~FMODE_READ; 2626 else if (is_rdonly)
2628 } 2627 calldata->arg.fmode |= FMODE_READ;
2629 if (state->n_wronly == 0) { 2628 if (state->n_wronly == 0)
2630 call_close |= is_wronly || is_rdwr; 2629 call_close |= is_wronly;
2631 calldata->arg.fmode &= ~FMODE_WRITE; 2630 else if (is_wronly)
2632 } 2631 calldata->arg.fmode |= FMODE_WRITE;
2633 } 2632 } else if (is_rdwr)
2633 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
2634
2635 if (calldata->arg.fmode == 0)
2636 call_close |= is_rdwr;
2637
2634 if (!nfs4_valid_open_stateid(state)) 2638 if (!nfs4_valid_open_stateid(state))
2635 call_close = 0; 2639 call_close = 0;
2636 spin_unlock(&state->owner->so_lock); 2640 spin_unlock(&state->owner->so_lock);