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

Commit 53e6fc86 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

pNFS: Prevent unnecessary layoutreturns after delegreturn



If we cannot grab the inode or superblock, then we cannot pin the
layout header, and so we cannot send a layoutreturn as part of an
async delegreturn call. In this case, we currently end up sending
an extra layoutreturn after the delegreturn. Since the layout was
implicitly returned by the delegreturn, that just gets a BAD_STATEID.

The fix is to simply complete the return-on-close immediately.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 1c5bd76d
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -5744,14 +5744,16 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
	nfs_fattr_init(data->res.fattr);
	data->timestamp = jiffies;
	data->rpc_status = 0;
	data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res, cred);
	data->inode = nfs_igrab_and_active(inode);
	if (data->inode) {
		data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res,
				cred);
		if (data->lr.roc) {
			data->args.lr_args = &data->lr.arg;
			data->res.lr_res = &data->lr.res;
		}
	} else if (data->lr.roc) {
		pnfs_roc_release(&data->lr.arg, &data->lr.res, 0);
		data->lr.roc = false;
	}

	task_setup_data.callback_data = data;