| From c489ee290bdbbace6bb63ebe6ebd4dd605819495 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Date: Wed, 30 Jan 2013 13:04:10 -0500 |
| Subject: NFSv4.1: Handle NFS4ERR_DELAY when resetting the NFSv4.1 session |
| |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| |
| commit c489ee290bdbbace6bb63ebe6ebd4dd605819495 upstream. |
| |
| NFS4ERR_DELAY is a legal reply when we call DESTROY_SESSION. It |
| usually means that the server is busy handling an unfinished RPC |
| request. Just sleep for a second and then retry. |
| We also need to be able to handle the NFS4ERR_BACK_CHAN_BUSY return |
| value. If the NFS server has outstanding callbacks, we just want to |
| similarly sleep & retry. |
| |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs4state.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/fs/nfs/nfs4state.c |
| +++ b/fs/nfs/nfs4state.c |
| @@ -1997,8 +1997,18 @@ static int nfs4_reset_session(struct nfs |
| nfs4_begin_drain_session(clp); |
| cred = nfs4_get_exchange_id_cred(clp); |
| status = nfs4_proc_destroy_session(clp->cl_session, cred); |
| - if (status && status != -NFS4ERR_BADSESSION && |
| - status != -NFS4ERR_DEADSESSION) { |
| + switch (status) { |
| + case 0: |
| + case -NFS4ERR_BADSESSION: |
| + case -NFS4ERR_DEADSESSION: |
| + break; |
| + case -NFS4ERR_BACK_CHAN_BUSY: |
| + case -NFS4ERR_DELAY: |
| + set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); |
| + status = 0; |
| + ssleep(1); |
| + goto out; |
| + default: |
| status = nfs4_recovery_handle_error(clp, status); |
| goto out; |
| } |