mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
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: Trond Myklebust <trond.myklebust@hammerspace.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
bbbff6d5ed
commit
42375c2bfa
@ -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);
|
||||
|
@ -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 @@ out_noroc:
|
||||
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 @@ restart:
|
||||
}
|
||||
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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user