diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-12-15 13:56:18 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-12-15 14:49:09 -0500 |
commit | e8794440849d1d15fa11251ef1622e6160614874 (patch) | |
tree | b5b1f08c90cec2a95a3285ead92aaee3c41dcd68 /fs | |
parent | 65a0c14954493802de01968a73b849f9fc4b4d1a (diff) |
NFSv4.1: Try to deal with NFS4ERR_SEQ_MISORDERED.
If the server returns NFS4ERR_SEQ_MISORDERED, it could be a sign
that the slot was retired at some point. Retry the attempt after
reinitialising the slot sequence number to 1.
Also add a handler for NFS4ERR_SEQ_FALSE_RETRY. Just bump the slot
sequence number and retry...
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index b0963aeceeda..9003b8f6b77f 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -467,11 +467,19 @@ static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res * | |||
467 | * The slot id we used was probably retired. Try again | 467 | * The slot id we used was probably retired. Try again |
468 | * using a different slot id. | 468 | * using a different slot id. |
469 | */ | 469 | */ |
470 | if (rpc_restart_call_prepare(task)) { | 470 | goto retry_nowait; |
471 | task->tk_status = 0; | 471 | case -NFS4ERR_SEQ_MISORDERED: |
472 | ret = 0; | 472 | /* |
473 | } | 473 | * Could this slot have been previously retired? |
474 | break; | 474 | * If so, then the server may be expecting seq_nr = 1! |
475 | */ | ||
476 | if (slot->seq_nr == 1) | ||
477 | break; | ||
478 | slot->seq_nr = 1; | ||
479 | goto retry_nowait; | ||
480 | case -NFS4ERR_SEQ_FALSE_RETRY: | ||
481 | ++slot->seq_nr; | ||
482 | goto retry_nowait; | ||
475 | default: | 483 | default: |
476 | /* Just update the slot sequence no. */ | 484 | /* Just update the slot sequence no. */ |
477 | ++slot->seq_nr; | 485 | ++slot->seq_nr; |
@@ -481,6 +489,12 @@ out: | |||
481 | dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); | 489 | dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); |
482 | nfs41_sequence_free_slot(res); | 490 | nfs41_sequence_free_slot(res); |
483 | return ret; | 491 | return ret; |
492 | retry_nowait: | ||
493 | if (rpc_restart_call_prepare(task)) { | ||
494 | task->tk_status = 0; | ||
495 | ret = 0; | ||
496 | } | ||
497 | goto out; | ||
484 | out_retry: | 498 | out_retry: |
485 | if (!rpc_restart_call(task)) | 499 | if (!rpc_restart_call(task)) |
486 | goto out; | 500 | goto out; |