Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −1
Original line number Original line Diff line number Diff line
@@ -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)