Commit 42375c2b authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker
Browse files

NFSv4/pnfs: Give nfs4_proc_layoutreturn() a flags argument



Replace the boolean in nfs4_proc_layoutreturn() with a set of flags that
will allow us to craft a version that is appropriate for reboot
recovery.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent bbbff6d5
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -10048,7 +10048,7 @@ static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
	.rpc_release = nfs4_layoutreturn_release,
};

int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, unsigned int flags)
{
	struct rpc_task *task;
	struct rpc_message msg = {
@@ -10071,7 +10071,7 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
			&task_setup_data.rpc_client, &msg);

	lrp->inode = nfs_igrab_and_active(lrp->args.inode);
	if (!sync) {
	if (flags & PNFS_FL_LAYOUTRETURN_ASYNC) {
		if (!lrp->inode) {
			nfs4_layoutreturn_release(lrp);
			return -EAGAIN;
@@ -10079,6 +10079,8 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
		task_setup_data.flags |= RPC_TASK_ASYNC;
	}
	if (!lrp->inode)
		flags |= PNFS_FL_LAYOUTRETURN_PRIVILEGED;
	if (flags & PNFS_FL_LAYOUTRETURN_PRIVILEGED)
		nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
				   1);
	else
@@ -10087,7 +10089,7 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
	task = rpc_run_task(&task_setup_data);
	if (IS_ERR(task))
		return PTR_ERR(task);
	if (sync)
	if (!(flags & PNFS_FL_LAYOUTRETURN_ASYNC))
		status = task->tk_status;
	trace_nfs4_layoutreturn(lrp->args.inode, &lrp->args.stateid, status);
	dprintk("<-- %s status=%d\n", __func__, status);
+11 −7
Original line number Diff line number Diff line
@@ -1279,7 +1279,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
		       const nfs4_stateid *stateid,
		       const struct cred **pcred,
		       enum pnfs_iomode iomode,
		       bool sync)
		       unsigned int flags)
{
	struct inode *ino = lo->plh_inode;
	struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
@@ -1306,7 +1306,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
	if (ld->prepare_layoutreturn)
		ld->prepare_layoutreturn(&lrp->args);

	status = nfs4_proc_layoutreturn(lrp, sync);
	status = nfs4_proc_layoutreturn(lrp, flags);
out:
	dprintk("<-- %s status: %d\n", __func__, status);
	return status;
@@ -1340,7 +1340,8 @@ static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
		spin_unlock(&inode->i_lock);
		if (send) {
			/* Send an async layoutreturn so we dont deadlock */
			pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
			pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
					       PNFS_FL_LAYOUTRETURN_ASYNC);
		}
	} else
		spin_unlock(&inode->i_lock);
@@ -1407,7 +1408,8 @@ _pnfs_return_layout(struct inode *ino)
	send = pnfs_prepare_layoutreturn(lo, &stateid, &cred, NULL);
	spin_unlock(&ino->i_lock);
	if (send)
		status = pnfs_send_layoutreturn(lo, &stateid, &cred, IOMODE_ANY, true);
		status = pnfs_send_layoutreturn(lo, &stateid, &cred, IOMODE_ANY,
						0);
out_wait_layoutreturn:
	wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN, TASK_UNINTERRUPTIBLE);
out_put_layout_hdr:
@@ -1548,7 +1550,7 @@ bool pnfs_roc(struct inode *ino,
		return true;
	}
	if (layoutreturn)
		pnfs_send_layoutreturn(lo, &stateid, &lc_cred, iomode, true);
		pnfs_send_layoutreturn(lo, &stateid, &lc_cred, iomode, 0);
	pnfs_put_layout_hdr(lo);
	return false;
}
@@ -2595,7 +2597,8 @@ pnfs_mark_layout_for_return(struct inode *inode,
		return_now = pnfs_prepare_layoutreturn(lo, &stateid, &cred, &iomode);
		spin_unlock(&inode->i_lock);
		if (return_now)
			pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
			pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
					       PNFS_FL_LAYOUTRETURN_ASYNC);
	} else {
		spin_unlock(&inode->i_lock);
		nfs_commit_inode(inode, 0);
@@ -2711,7 +2714,8 @@ static int pnfs_layout_return_unused_byserver(struct nfs_server *server,
		}
		spin_unlock(&inode->i_lock);
		rcu_read_unlock();
		pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
		pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
				       PNFS_FL_LAYOUTRETURN_ASYNC);
		pnfs_put_layout_hdr(lo);
		cond_resched();
		goto restart;
+5 −1
Original line number Diff line number Diff line
@@ -248,6 +248,9 @@ extern const struct pnfs_layoutdriver_type *pnfs_find_layoutdriver(u32 id);
extern void pnfs_put_layoutdriver(const struct pnfs_layoutdriver_type *ld);

/* nfs4proc.c */
#define PNFS_FL_LAYOUTRETURN_ASYNC (1U << 0)
#define PNFS_FL_LAYOUTRETURN_PRIVILEGED (1U << 1)

extern size_t max_response_pages(struct nfs_server *server);
extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
				   struct pnfs_device *dev,
@@ -255,7 +258,8 @@ extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
extern struct pnfs_layout_segment *
nfs4_proc_layoutget(struct nfs4_layoutget *lgp,
		    struct nfs4_exception *exception);
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp,
				  unsigned int flags);

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