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: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
4ae93560b1
commit
21b874c873
1 changed files with 14 additions and 1 deletions
|
@ -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)
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue