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

Commit e85d7ee4 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

pNFS: Separate handling of NFS4ERR_LAYOUTTRYLATER and RECALLCONFLICT



They are not the same error, and need to be handled differently.

Fixes: 183d9e7b ("pnfs: rework LAYOUTGET retry handling")
Cc: stable@vger.kernel.org # 4.7
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
parent 56b38a1f
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -437,6 +437,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server,
		case -NFS4ERR_DELAY:
			nfs_inc_server_stats(server, NFSIOS_DELAY);
		case -NFS4ERR_GRACE:
		case -NFS4ERR_LAYOUTTRYLATER:
		case -NFS4ERR_RECALLCONFLICT:
			exception->delay = 1;
			return 0;
@@ -7883,11 +7884,12 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
	struct inode *inode = lgp->args.inode;
	struct nfs_server *server = NFS_SERVER(inode);
	struct pnfs_layout_hdr *lo;
	int status = task->tk_status;
	int nfs4err = task->tk_status;
	int err, status = 0;

	dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status);

	switch (status) {
	switch (nfs4err) {
	case 0:
		goto out;

@@ -7919,12 +7921,11 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
			status = -EOVERFLOW;
			goto out;
		}
		/* Fallthrough */
		status = -EBUSY;
		break;
	case -NFS4ERR_RECALLCONFLICT:
		nfs4_handle_exception(server, -NFS4ERR_RECALLCONFLICT,
					exception);
		status = -ERECALLCONFLICT;
		goto out;
		break;
	case -NFS4ERR_EXPIRED:
	case -NFS4ERR_BAD_STATEID:
		exception->timeout = 0;
@@ -7955,9 +7956,13 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
			spin_unlock(&inode->i_lock);
	}

	status = nfs4_handle_exception(server, status, exception);
	err = nfs4_handle_exception(server, nfs4err, exception);
	if (!status) {
		if (exception->retry)
			status = -EAGAIN;
		else
			status = err;
	}
out:
	dprintk("<-- %s\n", __func__);
	return status;
+1 −0
Original line number Diff line number Diff line
@@ -1648,6 +1648,7 @@ pnfs_update_layout(struct inode *ino,
	atomic_dec(&lo->plh_outstanding);
	if (IS_ERR(lseg)) {
		switch(PTR_ERR(lseg)) {
		case -EBUSY:
		case -ERECALLCONFLICT:
			if (time_after(jiffies, giveup))
				lseg = NULL;