Commit 21b874c8 authored by Trond Myklebust's avatar Trond Myklebust

NFSv4.1/pnfs: Handle LAYOUTGET return values correctly

According to RFC5661 section 18.43.3, if the server cannot satisfy
the loga_minlength argument to LAYOUTGET, there are 2 cases:
1) If loga_minlength == 0, it returns NFS4ERR_LAYOUTTRYLATER
2) If loga_minlength != 0, it returns NFS4ERR_BADLAYOUT
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 4ae93560
...@@ -7780,11 +7780,20 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata) ...@@ -7780,11 +7780,20 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
switch (task->tk_status) { switch (task->tk_status) {
case 0: case 0:
goto out; goto out;
/*
* NFS4ERR_BADLAYOUT means the MDS cannot return a layout of
* length lgp->args.minlength != 0 (see RFC5661 section 18.43.3).
*/
case -NFS4ERR_BADLAYOUT:
goto out_overflow;
/* /*
* NFS4ERR_LAYOUTTRYLATER is a conflict with another client * NFS4ERR_LAYOUTTRYLATER is a conflict with another client
* (or clients) writing to the same RAID stripe * (or clients) writing to the same RAID stripe except when
* the minlength argument is 0 (see RFC5661 section 18.43.3).
*/ */
case -NFS4ERR_LAYOUTTRYLATER: case -NFS4ERR_LAYOUTTRYLATER:
if (lgp->args.minlength == 0)
goto out_overflow;
/* /*
* NFS4ERR_RECALLCONFLICT is when conflict with self (must recall * NFS4ERR_RECALLCONFLICT is when conflict with self (must recall
* existing layout before getting a new one). * existing layout before getting a new one).
...@@ -7840,6 +7849,10 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata) ...@@ -7840,6 +7849,10 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
rpc_restart_call_prepare(task); rpc_restart_call_prepare(task);
out: out:
dprintk("<-- %s\n", __func__); dprintk("<-- %s\n", __func__);
return;
out_overflow:
task->tk_status = -EOVERFLOW;
goto out;
} }
static size_t max_response_pages(struct nfs_server *server) static size_t max_response_pages(struct nfs_server *server)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment