nfs41: layout return on close in delegation return
If file is not opened by anyone, we do layout return on close in delegation return. Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
fe08c54691
commit
039b756a2d
1 changed files with 16 additions and 1 deletions
|
@ -5030,6 +5030,9 @@ struct nfs4_delegreturndata {
|
||||||
unsigned long timestamp;
|
unsigned long timestamp;
|
||||||
struct nfs_fattr fattr;
|
struct nfs_fattr fattr;
|
||||||
int rpc_status;
|
int rpc_status;
|
||||||
|
struct inode *inode;
|
||||||
|
bool roc;
|
||||||
|
u32 roc_barrier;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
||||||
|
@ -5043,7 +5046,6 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
||||||
switch (task->tk_status) {
|
switch (task->tk_status) {
|
||||||
case 0:
|
case 0:
|
||||||
renew_lease(data->res.server, data->timestamp);
|
renew_lease(data->res.server, data->timestamp);
|
||||||
break;
|
|
||||||
case -NFS4ERR_ADMIN_REVOKED:
|
case -NFS4ERR_ADMIN_REVOKED:
|
||||||
case -NFS4ERR_DELEG_REVOKED:
|
case -NFS4ERR_DELEG_REVOKED:
|
||||||
case -NFS4ERR_BAD_STATEID:
|
case -NFS4ERR_BAD_STATEID:
|
||||||
|
@ -5051,6 +5053,8 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
||||||
case -NFS4ERR_STALE_STATEID:
|
case -NFS4ERR_STALE_STATEID:
|
||||||
case -NFS4ERR_EXPIRED:
|
case -NFS4ERR_EXPIRED:
|
||||||
task->tk_status = 0;
|
task->tk_status = 0;
|
||||||
|
if (data->roc)
|
||||||
|
pnfs_roc_set_barrier(data->inode, data->roc_barrier);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (nfs4_async_handle_error(task, data->res.server, NULL) ==
|
if (nfs4_async_handle_error(task, data->res.server, NULL) ==
|
||||||
|
@ -5064,6 +5068,10 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
||||||
|
|
||||||
static void nfs4_delegreturn_release(void *calldata)
|
static void nfs4_delegreturn_release(void *calldata)
|
||||||
{
|
{
|
||||||
|
struct nfs4_delegreturndata *data = calldata;
|
||||||
|
|
||||||
|
if (data->roc)
|
||||||
|
pnfs_roc_release(data->inode);
|
||||||
kfree(calldata);
|
kfree(calldata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5073,6 +5081,10 @@ static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
|
||||||
|
|
||||||
d_data = (struct nfs4_delegreturndata *)data;
|
d_data = (struct nfs4_delegreturndata *)data;
|
||||||
|
|
||||||
|
if (d_data->roc &&
|
||||||
|
pnfs_roc_drain(d_data->inode, &d_data->roc_barrier, task))
|
||||||
|
return;
|
||||||
|
|
||||||
nfs4_setup_sequence(d_data->res.server,
|
nfs4_setup_sequence(d_data->res.server,
|
||||||
&d_data->args.seq_args,
|
&d_data->args.seq_args,
|
||||||
&d_data->res.seq_res,
|
&d_data->res.seq_res,
|
||||||
|
@ -5116,6 +5128,9 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
|
||||||
nfs_fattr_init(data->res.fattr);
|
nfs_fattr_init(data->res.fattr);
|
||||||
data->timestamp = jiffies;
|
data->timestamp = jiffies;
|
||||||
data->rpc_status = 0;
|
data->rpc_status = 0;
|
||||||
|
data->inode = inode;
|
||||||
|
data->roc = list_empty(&NFS_I(inode)->open_files) ?
|
||||||
|
pnfs_roc(inode) : false;
|
||||||
|
|
||||||
task_setup_data.callback_data = data;
|
task_setup_data.callback_data = data;
|
||||||
msg.rpc_argp = &data->args;
|
msg.rpc_argp = &data->args;
|
||||||
|
|
Loading…
Add table
Reference in a new issue