diff options
author | Olga Kornievskaia <kolga@netapp.com> | 2016-09-23 23:24:03 +0200 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2016-09-29 18:31:48 +0200 |
commit | a865880e20ca4d2df362f61c9ef51f0fc0273131 (patch) | |
tree | 0dce927342c7f265384d82359c4b3c29004e7813 /fs | |
parent | pNFS: Fix atime updates on pNFS clients (diff) | |
download | linux-a865880e20ca4d2df362f61c9ef51f0fc0273131.tar.xz linux-a865880e20ca4d2df362f61c9ef51f0fc0273131.zip |
Retry operation on EREMOTEIO on an interrupted slot
If an operation got interrupted, then since we don't know if the
server processed it on not, we keep the seq#. Upon reuse of slot
and seq# if we get reply from the cache (ie EREMOTEIO) then we
need to retry the operation after bumping the seq#
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 5b2b07bca490..8b30cdf41848 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -755,6 +755,13 @@ static int nfs41_sequence_process(struct rpc_task *task, /* Check the SEQUENCE operation status */ switch (res->sr_status) { case 0: + /* If previous op on slot was interrupted and we reused + * the seq# and got a reply from the cache, then retry + */ + if (task->tk_status == -EREMOTEIO && interrupted) { + ++slot->seq_nr; + goto retry_nowait; + } /* Update the slot's sequence and clientid lease timer */ slot->seq_done = 1; clp = session->clp; |