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

Commit 5a0ec8ac authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4.1: Pin the inode and super block in asynchronous layoutreturns



If we're sending an asynchronous layoutreturn, then we need to ensure
that the inode and the super block remain pinned.

Cc: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Reviewed-by: default avatarPeng Tao <tao.peng@primarydata.com>
parent 472e2594
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -7856,6 +7856,7 @@ static void nfs4_layoutreturn_release(void *calldata)
	lo->plh_block_lgets--;
	spin_unlock(&lo->plh_inode->i_lock);
	pnfs_put_layout_hdr(lrp->args.layout);
	nfs_iput_and_deactive(lrp->inode);
	kfree(calldata);
	dprintk("<-- %s\n", __func__);
}
@@ -7880,23 +7881,25 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
		.rpc_message = &msg,
		.callback_ops = &nfs4_layoutreturn_call_ops,
		.callback_data = lrp,
		.flags = RPC_TASK_ASYNC,
	};
	int status = 0;

	dprintk("--> %s\n", __func__);
	if (!sync) {
		lrp->inode = nfs_igrab_and_active(lrp->args.inode);
		if (!lrp->inode) {
			nfs4_layoutreturn_release(lrp);
			return -EAGAIN;
		}
		task_setup_data.flags |= RPC_TASK_ASYNC;
	}
	nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1);
	task = rpc_run_task(&task_setup_data);
	if (IS_ERR(task))
		return PTR_ERR(task);
	if (sync == false)
		goto out;
	status = nfs4_wait_for_completion_rpc_task(task);
	if (status != 0)
		goto out;
	if (sync)
		status = task->tk_status;
	trace_nfs4_layoutreturn(lrp->args.inode, status);
out:
	dprintk("<-- %s status=%d\n", __func__, status);
	rpc_put_task(task);
	return status;
+1 −0
Original line number Diff line number Diff line
@@ -310,6 +310,7 @@ struct nfs4_layoutreturn {
	struct nfs4_layoutreturn_res res;
	struct rpc_cred *cred;
	struct nfs_client *clp;
	struct inode *inode;
	int rpc_status;
};