nfsd: fix error handling for clients that fail to return the layout
authorJeff Layton <jlayton@redhat.com>
Thu, 20 Oct 2016 16:21:34 +0000 (12:21 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 1 Nov 2016 19:47:43 +0000 (15:47 -0400)
Currently, when the client continually returns NFS4ERR_DELAY on a
CB_LAYOUTRECALL, we'll give up trying to retransmit after two lease
periods, but leave the layout in place.

What we really need to do here is fence the client in this case. Have it
fall through to that code in that case instead of into the
NFS4ERR_NOMATCHING_LAYOUT case.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4layouts.c

index 42aace4fc4c807ec9f41e590e777f8f8f94d7803..596205d939a1f43f1faa292d31680377045a8589 100644 (file)
@@ -686,10 +686,6 @@ nfsd4_cb_layout_done(struct nfsd4_callback *cb, struct rpc_task *task)
                        return 0;
                }
                /* Fallthrough */
-       case -NFS4ERR_NOMATCHING_LAYOUT:
-               trace_layout_recall_done(&ls->ls_stid.sc_stateid);
-               task->tk_status = 0;
-               return 1;
        default:
                /*
                 * Unknown error or non-responding client, we'll need to fence.
@@ -702,6 +698,10 @@ nfsd4_cb_layout_done(struct nfsd4_callback *cb, struct rpc_task *task)
                else
                        nfsd4_cb_layout_fail(ls);
                return -1;
+       case -NFS4ERR_NOMATCHING_LAYOUT:
+               trace_layout_recall_done(&ls->ls_stid.sc_stateid);
+               task->tk_status = 0;
+               return 1;
        }
 }