Commit bb22629e authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: nfs4_open_confirm must not set the open_owner as confirmed on error

RFC3530 states that the open_owner is confirmed if and only if the client
sends an OPEN_CONFIRM request with the appropriate sequence id and stateid
within the lease period.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 3392c349
...@@ -741,10 +741,10 @@ static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) ...@@ -741,10 +741,10 @@ static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
if (data->rpc_status == 0) { if (data->rpc_status == 0) {
memcpy(data->o_res.stateid.data, data->c_res.stateid.data, memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
sizeof(data->o_res.stateid.data)); sizeof(data->o_res.stateid.data));
nfs_confirm_seqid(&data->owner->so_seqid, 0);
renew_lease(data->o_res.server, data->timestamp); renew_lease(data->o_res.server, data->timestamp);
data->rpc_done = 1; data->rpc_done = 1;
} }
nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status);
nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid); nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid);
} }
...@@ -759,7 +759,6 @@ static void nfs4_open_confirm_release(void *calldata) ...@@ -759,7 +759,6 @@ static void nfs4_open_confirm_release(void *calldata)
/* In case of error, no cleanup! */ /* In case of error, no cleanup! */
if (!data->rpc_done) if (!data->rpc_done)
goto out_free; goto out_free;
nfs_confirm_seqid(&data->owner->so_seqid, 0);
state = nfs4_opendata_to_nfs4_state(data); state = nfs4_opendata_to_nfs4_state(data);
if (!IS_ERR(state)) if (!IS_ERR(state))
nfs4_close_state(&data->path, state, data->o_arg.open_flags); nfs4_close_state(&data->path, state, data->o_arg.open_flags);
...@@ -886,7 +885,6 @@ static void nfs4_open_release(void *calldata) ...@@ -886,7 +885,6 @@ static void nfs4_open_release(void *calldata)
/* In case we need an open_confirm, no cleanup! */ /* In case we need an open_confirm, no cleanup! */
if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
goto out_free; goto out_free;
nfs_confirm_seqid(&data->owner->so_seqid, 0);
state = nfs4_opendata_to_nfs4_state(data); state = nfs4_opendata_to_nfs4_state(data);
if (!IS_ERR(state)) if (!IS_ERR(state))
nfs4_close_state(&data->path, state, data->o_arg.open_flags); nfs4_close_state(&data->path, state, data->o_arg.open_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment