mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 18:30:06 +00:00
nfsd: fix nfsd4_cb_recall_done error handling
For any error that is not EBADHANDLE or NFS4ERR_BAD_STATEID, nfsd4_cb_recall_done first marks the connection down, then retries until dl_retries hits zero, then marks the connection down again and sets cb_done. This changes the code to only retry for EBADHANDLE or NFS4ERR_BAD_STATEID, and factors setting cb_done into a single point in the function. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
70b2823535
commit
444b6e910d
1 changed files with 7 additions and 10 deletions
|
@ -874,24 +874,21 @@ static void nfsd4_cb_recall_done(struct rpc_task *task, void *calldata)
|
|||
return;
|
||||
switch (task->tk_status) {
|
||||
case 0:
|
||||
cb->cb_done = true;
|
||||
return;
|
||||
break;
|
||||
case -EBADHANDLE:
|
||||
case -NFS4ERR_BAD_STATEID:
|
||||
/* Race: client probably got cb_recall
|
||||
* before open reply granting delegation */
|
||||
break;
|
||||
if (dp->dl_retries--) {
|
||||
rpc_delay(task, 2*HZ);
|
||||
task->tk_status = 0;
|
||||
rpc_restart_call_prepare(task);
|
||||
return;
|
||||
}
|
||||
default:
|
||||
/* Network partition? */
|
||||
nfsd4_mark_cb_down(clp, task->tk_status);
|
||||
}
|
||||
if (dp->dl_retries--) {
|
||||
rpc_delay(task, 2*HZ);
|
||||
task->tk_status = 0;
|
||||
rpc_restart_call_prepare(task);
|
||||
return;
|
||||
}
|
||||
nfsd4_mark_cb_down(clp, task->tk_status);
|
||||
cb->cb_done = true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue