diff options
author | Christoph Hellwig <hch@lst.de> | 2014-09-23 02:58:48 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-09-26 16:29:25 -0400 |
commit | 444b6e910d2a637cc144c74b15efd1b61bf737bb (patch) | |
tree | 53397fbe87fee6e7416a25daacde972ba3c5d19d /fs/nfsd | |
parent | 70b2823535d2d884eef2d3dab0dfd0ec3da8a019 (diff) |
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>
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4callback.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index e0be57b0f79b..795e218a2a98 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -874,24 +874,21 @@ static void nfsd4_cb_recall_done(struct rpc_task *task, void *calldata) | |||
874 | return; | 874 | return; |
875 | switch (task->tk_status) { | 875 | switch (task->tk_status) { |
876 | case 0: | 876 | case 0: |
877 | cb->cb_done = true; | 877 | break; |
878 | return; | ||
879 | case -EBADHANDLE: | 878 | case -EBADHANDLE: |
880 | case -NFS4ERR_BAD_STATEID: | 879 | case -NFS4ERR_BAD_STATEID: |
881 | /* Race: client probably got cb_recall | 880 | /* Race: client probably got cb_recall |
882 | * before open reply granting delegation */ | 881 | * before open reply granting delegation */ |
883 | break; | 882 | if (dp->dl_retries--) { |
883 | rpc_delay(task, 2*HZ); | ||
884 | task->tk_status = 0; | ||
885 | rpc_restart_call_prepare(task); | ||
886 | return; | ||
887 | } | ||
884 | default: | 888 | default: |
885 | /* Network partition? */ | 889 | /* Network partition? */ |
886 | nfsd4_mark_cb_down(clp, task->tk_status); | 890 | nfsd4_mark_cb_down(clp, task->tk_status); |
887 | } | 891 | } |
888 | if (dp->dl_retries--) { | ||
889 | rpc_delay(task, 2*HZ); | ||
890 | task->tk_status = 0; | ||
891 | rpc_restart_call_prepare(task); | ||
892 | return; | ||
893 | } | ||
894 | nfsd4_mark_cb_down(clp, task->tk_status); | ||
895 | cb->cb_done = true; | 892 | cb->cb_done = true; |
896 | } | 893 | } |
897 | 894 | ||