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

Commit 6c16605d authored by Peng Tao's avatar Peng Tao Committed by Tom Haynes
Browse files

nfs41: allow async version layoutreturn

parent 15eb67c1
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -7810,7 +7810,7 @@ static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
	.rpc_release = nfs4_layoutreturn_release,
	.rpc_release = nfs4_layoutreturn_release,
};
};


int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp)
int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
{
{
	struct rpc_task *task;
	struct rpc_task *task;
	struct rpc_message msg = {
	struct rpc_message msg = {
@@ -7824,16 +7824,23 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp)
		.rpc_message = &msg,
		.rpc_message = &msg,
		.callback_ops = &nfs4_layoutreturn_call_ops,
		.callback_ops = &nfs4_layoutreturn_call_ops,
		.callback_data = lrp,
		.callback_data = lrp,
		.flags = RPC_TASK_ASYNC,
	};
	};
	int status;
	int status = 0;


	dprintk("--> %s\n", __func__);
	dprintk("--> %s\n", __func__);
	nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1);
	nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1);
	task = rpc_run_task(&task_setup_data);
	task = rpc_run_task(&task_setup_data);
	if (IS_ERR(task))
	if (IS_ERR(task))
		return PTR_ERR(task);
		return PTR_ERR(task);
	if (sync == false)
		goto out;
	status = nfs4_wait_for_completion_rpc_task(task);
	if (status != 0)
		goto out;
	status = task->tk_status;
	status = task->tk_status;
	trace_nfs4_layoutreturn(lrp->args.inode, status);
	trace_nfs4_layoutreturn(lrp->args.inode, status);
out:
	dprintk("<-- %s status=%d\n", __func__, status);
	dprintk("<-- %s status=%d\n", __func__, status);
	rpc_put_task(task);
	rpc_put_task(task);
	return status;
	return status;
+6 −5
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ static LIST_HEAD(pnfs_modules_tbl);


static int
static int
pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
		       enum pnfs_iomode iomode);
		       enum pnfs_iomode iomode, bool sync);


/* Return the registered pnfs layout driver module matching given id */
/* Return the registered pnfs layout driver module matching given id */
static struct pnfs_layoutdriver_type *
static struct pnfs_layoutdriver_type *
@@ -392,7 +392,8 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg)
		spin_unlock(&inode->i_lock);
		spin_unlock(&inode->i_lock);
		pnfs_free_lseg(lseg);
		pnfs_free_lseg(lseg);
		if (need_return)
		if (need_return)
			pnfs_send_layoutreturn(lo, stateid, iomode);
			pnfs_send_layoutreturn(lo, stateid, iomode,
					       true);
		else
		else
			pnfs_put_layout_hdr(lo);
			pnfs_put_layout_hdr(lo);
	}
	}
@@ -897,7 +898,7 @@ static void pnfs_clear_layoutcommit(struct inode *inode,


static int
static int
pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
		       enum pnfs_iomode iomode)
		       enum pnfs_iomode iomode, bool sync)
{
{
	struct inode *ino = lo->plh_inode;
	struct inode *ino = lo->plh_inode;
	struct nfs4_layoutreturn *lrp;
	struct nfs4_layoutreturn *lrp;
@@ -923,7 +924,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
	lrp->clp = NFS_SERVER(ino)->nfs_client;
	lrp->clp = NFS_SERVER(ino)->nfs_client;
	lrp->cred = lo->plh_lc_cred;
	lrp->cred = lo->plh_lc_cred;


	status = nfs4_proc_layoutreturn(lrp);
	status = nfs4_proc_layoutreturn(lrp, sync);
out:
out:
	if (status) {
	if (status) {
		spin_lock(&ino->i_lock);
		spin_lock(&ino->i_lock);
@@ -989,7 +990,7 @@ _pnfs_return_layout(struct inode *ino)
	spin_unlock(&ino->i_lock);
	spin_unlock(&ino->i_lock);
	pnfs_free_lseg_list(&tmp_list);
	pnfs_free_lseg_list(&tmp_list);


	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY);
	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY, true);
out:
out:
	dprintk("<-- %s status: %d\n", __func__, status);
	dprintk("<-- %s status: %d\n", __func__, status);
	return status;
	return status;
+1 −1
Original line number Original line Diff line number Diff line
@@ -219,7 +219,7 @@ extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
				   struct pnfs_device *dev,
				   struct pnfs_device *dev,
				   struct rpc_cred *cred);
				   struct rpc_cred *cred);
extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags);
extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags);
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp);
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);


/* pnfs.c */
/* pnfs.c */
void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);