|
@@ -2991,7 +2991,7 @@ static const struct rpc_call_ops nfs4_delegreturn_ops = {
|
|
.rpc_release = nfs4_delegreturn_release,
|
|
.rpc_release = nfs4_delegreturn_release,
|
|
};
|
|
};
|
|
|
|
|
|
-static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
|
|
|
|
|
|
+static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
|
|
{
|
|
{
|
|
struct nfs4_delegreturndata *data;
|
|
struct nfs4_delegreturndata *data;
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
@@ -3006,7 +3006,7 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
|
|
.callback_ops = &nfs4_delegreturn_ops,
|
|
.callback_ops = &nfs4_delegreturn_ops,
|
|
.flags = RPC_TASK_ASYNC,
|
|
.flags = RPC_TASK_ASYNC,
|
|
};
|
|
};
|
|
- int status;
|
|
|
|
|
|
+ int status = 0;
|
|
|
|
|
|
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
|
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
|
if (data == NULL)
|
|
if (data == NULL)
|
|
@@ -3028,23 +3028,27 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
|
|
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 (!issync)
|
|
|
|
+ goto out;
|
|
status = nfs4_wait_for_completion_rpc_task(task);
|
|
status = nfs4_wait_for_completion_rpc_task(task);
|
|
- if (status == 0) {
|
|
|
|
- status = data->rpc_status;
|
|
|
|
- if (status == 0)
|
|
|
|
- nfs_refresh_inode(inode, &data->fattr);
|
|
|
|
- }
|
|
|
|
|
|
+ if (status != 0)
|
|
|
|
+ goto out;
|
|
|
|
+ status = data->rpc_status;
|
|
|
|
+ if (status != 0)
|
|
|
|
+ goto out;
|
|
|
|
+ nfs_refresh_inode(inode, &data->fattr);
|
|
|
|
+out:
|
|
rpc_put_task(task);
|
|
rpc_put_task(task);
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
|
|
|
|
-int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
|
|
|
|
|
|
+int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
|
|
{
|
|
{
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
struct nfs4_exception exception = { };
|
|
struct nfs4_exception exception = { };
|
|
int err;
|
|
int err;
|
|
do {
|
|
do {
|
|
- err = _nfs4_proc_delegreturn(inode, cred, stateid);
|
|
|
|
|
|
+ err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
|
|
switch (err) {
|
|
switch (err) {
|
|
case -NFS4ERR_STALE_STATEID:
|
|
case -NFS4ERR_STALE_STATEID:
|
|
case -NFS4ERR_EXPIRED:
|
|
case -NFS4ERR_EXPIRED:
|