nfs41: allow async version layoutreturn
Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Tom Haynes <loghyr@primarydata.com>
This commit is contained in:
parent
15eb67c153
commit
6c16605d6e
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue