|
@@ -2587,6 +2587,11 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
|
|
|
case -NFS4ERR_OLD_STATEID:
|
|
|
case -NFS4ERR_BAD_STATEID:
|
|
|
case -NFS4ERR_EXPIRED:
|
|
|
+ if (!nfs4_stateid_match(&calldata->arg.stateid,
|
|
|
+ &state->stateid)) {
|
|
|
+ rpc_restart_call_prepare(task);
|
|
|
+ goto out_release;
|
|
|
+ }
|
|
|
if (calldata->arg.fmode == 0)
|
|
|
break;
|
|
|
default:
|
|
@@ -2619,6 +2624,7 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
|
|
|
is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
|
|
|
is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
|
|
|
is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
|
|
|
+ nfs4_stateid_copy(&calldata->arg.stateid, &state->stateid);
|
|
|
/* Calculate the change in open mode */
|
|
|
calldata->arg.fmode = 0;
|
|
|
if (state->n_rdwr == 0) {
|
|
@@ -2757,7 +2763,6 @@ int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
|
|
|
calldata->inode = state->inode;
|
|
|
calldata->state = state;
|
|
|
calldata->arg.fh = NFS_FH(state->inode);
|
|
|
- calldata->arg.stateid = &state->open_stateid;
|
|
|
/* Serialization for the sequence id */
|
|
|
calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid, gfp_mask);
|
|
|
if (calldata->arg.seqid == NULL)
|