|
@@ -3199,13 +3199,21 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
|
|
|
|
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
+ case -NFS4ERR_OLD_STATEID:
|
|
|
|
+ /* Did we race with OPEN? */
|
|
|
|
+ if (nfs4_refresh_open_stateid(&calldata->arg.stateid,
|
|
|
|
+ state)) {
|
|
|
|
+ task->tk_status = 0;
|
|
|
|
+ rpc_restart_call_prepare(task);
|
|
|
|
+ }
|
|
|
|
+ goto out_release;
|
|
case -NFS4ERR_ADMIN_REVOKED:
|
|
case -NFS4ERR_ADMIN_REVOKED:
|
|
case -NFS4ERR_STALE_STATEID:
|
|
case -NFS4ERR_STALE_STATEID:
|
|
case -NFS4ERR_EXPIRED:
|
|
case -NFS4ERR_EXPIRED:
|
|
nfs4_free_revoked_stateid(server,
|
|
nfs4_free_revoked_stateid(server,
|
|
&calldata->arg.stateid,
|
|
&calldata->arg.stateid,
|
|
task->tk_msg.rpc_cred);
|
|
task->tk_msg.rpc_cred);
|
|
- case -NFS4ERR_OLD_STATEID:
|
|
|
|
|
|
+ /* Fallthrough */
|
|
case -NFS4ERR_BAD_STATEID:
|
|
case -NFS4ERR_BAD_STATEID:
|
|
if (!nfs4_stateid_match(&calldata->arg.stateid,
|
|
if (!nfs4_stateid_match(&calldata->arg.stateid,
|
|
&state->open_stateid)) {
|
|
&state->open_stateid)) {
|
|
@@ -3214,6 +3222,7 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
|
|
}
|
|
}
|
|
if (calldata->arg.fmode == 0)
|
|
if (calldata->arg.fmode == 0)
|
|
break;
|
|
break;
|
|
|
|
+ /* Fallthrough */
|
|
default:
|
|
default:
|
|
if (nfs4_async_handle_error(task, server, state, NULL) == -EAGAIN) {
|
|
if (nfs4_async_handle_error(task, server, state, NULL) == -EAGAIN) {
|
|
rpc_restart_call_prepare(task);
|
|
rpc_restart_call_prepare(task);
|
|
@@ -5793,11 +5802,19 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
|
nfs4_free_revoked_stateid(data->res.server,
|
|
nfs4_free_revoked_stateid(data->res.server,
|
|
data->args.stateid,
|
|
data->args.stateid,
|
|
task->tk_msg.rpc_cred);
|
|
task->tk_msg.rpc_cred);
|
|
|
|
+ /* Fallthrough */
|
|
case -NFS4ERR_BAD_STATEID:
|
|
case -NFS4ERR_BAD_STATEID:
|
|
- case -NFS4ERR_OLD_STATEID:
|
|
|
|
case -NFS4ERR_STALE_STATEID:
|
|
case -NFS4ERR_STALE_STATEID:
|
|
task->tk_status = 0;
|
|
task->tk_status = 0;
|
|
break;
|
|
break;
|
|
|
|
+ case -NFS4ERR_OLD_STATEID:
|
|
|
|
+ if (nfs4_refresh_delegation_stateid(&data->stateid, data->inode)) {
|
|
|
|
+ task->tk_status = 0;
|
|
|
|
+ rpc_restart_call_prepare(task);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ task->tk_status = 0;
|
|
|
|
+ break;
|
|
case -NFS4ERR_ACCESS:
|
|
case -NFS4ERR_ACCESS:
|
|
if (data->args.bitmask) {
|
|
if (data->args.bitmask) {
|
|
data->args.bitmask = NULL;
|
|
data->args.bitmask = NULL;
|