aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2011-03-09 16:00:55 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-03-11 15:18:35 -0500
commitb4410c2f7f775b03da31566c05bb8d2383c7dc27 (patch)
tree7d16c41557c7aa17489a222a660ad71bd7fb370b
parent0400a6b0cb756f976bae32ae8db47bfa9853897c (diff)
NFSv4.1: Fix the handling of the SEQUENCE status bits
We want SEQUENCE status bits to be handled by the state manager in order to avoid threading issues. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/nfs4proc.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 411dc80d065..b0b1a556852 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -436,8 +436,8 @@ static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *
436 clp = res->sr_session->clp; 436 clp = res->sr_session->clp;
437 do_renew_lease(clp, timestamp); 437 do_renew_lease(clp, timestamp);
438 /* Check sequence flags */ 438 /* Check sequence flags */
439 if (atomic_read(&clp->cl_count) > 1) 439 if (res->sr_status_flags != 0)
440 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags); 440 nfs4_schedule_lease_recovery(clp);
441 break; 441 break;
442 case -NFS4ERR_DELAY: 442 case -NFS4ERR_DELAY:
443 /* The server detected a resend of the RPC call and 443 /* The server detected a resend of the RPC call and
@@ -5254,8 +5254,13 @@ static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
5254 goto out; 5254 goto out;
5255 } 5255 }
5256 ret = rpc_wait_for_completion_task(task); 5256 ret = rpc_wait_for_completion_task(task);
5257 if (!ret) 5257 if (!ret) {
5258 struct nfs4_sequence_res *res = task->tk_msg.rpc_resp;
5259
5260 if (task->tk_status == 0)
5261 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags);
5258 ret = task->tk_status; 5262 ret = task->tk_status;
5263 }
5259 rpc_put_task(task); 5264 rpc_put_task(task);
5260out: 5265out:
5261 dprintk("<-- %s status=%d\n", __func__, ret); 5266 dprintk("<-- %s status=%d\n", __func__, ret);