|
@@ -339,8 +339,7 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc
|
|
|
dprintk("%s ERROR: %d Reset session\n", __func__,
|
|
|
errorcode);
|
|
|
nfs4_schedule_session_recovery(clp->cl_session, errorcode);
|
|
|
- exception->retry = 1;
|
|
|
- break;
|
|
|
+ goto wait_on_recovery;
|
|
|
#endif /* defined(CONFIG_NFS_V4_1) */
|
|
|
case -NFS4ERR_FILE_OPEN:
|
|
|
if (exception->timeout > HZ) {
|
|
@@ -1572,9 +1571,11 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
|
|
data->timestamp = jiffies;
|
|
|
if (nfs4_setup_sequence(data->o_arg.server,
|
|
|
&data->o_arg.seq_args,
|
|
|
- &data->o_res.seq_res, task))
|
|
|
- return;
|
|
|
- rpc_call_start(task);
|
|
|
+ &data->o_res.seq_res,
|
|
|
+ task) != 0)
|
|
|
+ nfs_release_seqid(data->o_arg.seqid);
|
|
|
+ else
|
|
|
+ rpc_call_start(task);
|
|
|
return;
|
|
|
unlock_no_action:
|
|
|
rcu_read_unlock();
|
|
@@ -1748,7 +1749,7 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
|
|
|
|
|
|
/* even though OPEN succeeded, access is denied. Close the file */
|
|
|
nfs4_close_state(state, fmode);
|
|
|
- return -NFS4ERR_ACCESS;
|
|
|
+ return -EACCES;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2196,7 +2197,7 @@ static void nfs4_free_closedata(void *data)
|
|
|
nfs4_put_open_state(calldata->state);
|
|
|
nfs_free_seqid(calldata->arg.seqid);
|
|
|
nfs4_put_state_owner(sp);
|
|
|
- nfs_sb_deactive(sb);
|
|
|
+ nfs_sb_deactive_async(sb);
|
|
|
kfree(calldata);
|
|
|
}
|
|
|
|
|
@@ -2296,9 +2297,10 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
|
|
|
if (nfs4_setup_sequence(NFS_SERVER(inode),
|
|
|
&calldata->arg.seq_args,
|
|
|
&calldata->res.seq_res,
|
|
|
- task))
|
|
|
- goto out;
|
|
|
- rpc_call_start(task);
|
|
|
+ task) != 0)
|
|
|
+ nfs_release_seqid(calldata->arg.seqid);
|
|
|
+ else
|
|
|
+ rpc_call_start(task);
|
|
|
out:
|
|
|
dprintk("%s: done!\n", __func__);
|
|
|
}
|
|
@@ -4529,6 +4531,7 @@ static void nfs4_locku_done(struct rpc_task *task, void *data)
|
|
|
if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN)
|
|
|
rpc_restart_call_prepare(task);
|
|
|
}
|
|
|
+ nfs_release_seqid(calldata->arg.seqid);
|
|
|
}
|
|
|
|
|
|
static void nfs4_locku_prepare(struct rpc_task *task, void *data)
|
|
@@ -4545,9 +4548,11 @@ static void nfs4_locku_prepare(struct rpc_task *task, void *data)
|
|
|
calldata->timestamp = jiffies;
|
|
|
if (nfs4_setup_sequence(calldata->server,
|
|
|
&calldata->arg.seq_args,
|
|
|
- &calldata->res.seq_res, task))
|
|
|
- return;
|
|
|
- rpc_call_start(task);
|
|
|
+ &calldata->res.seq_res,
|
|
|
+ task) != 0)
|
|
|
+ nfs_release_seqid(calldata->arg.seqid);
|
|
|
+ else
|
|
|
+ rpc_call_start(task);
|
|
|
}
|
|
|
|
|
|
static const struct rpc_call_ops nfs4_locku_ops = {
|
|
@@ -4692,7 +4697,7 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
|
|
|
/* Do we need to do an open_to_lock_owner? */
|
|
|
if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
|
|
|
if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
|
|
|
- return;
|
|
|
+ goto out_release_lock_seqid;
|
|
|
data->arg.open_stateid = &state->stateid;
|
|
|
data->arg.new_lock_owner = 1;
|
|
|
data->res.open_seqid = data->arg.open_seqid;
|
|
@@ -4701,10 +4706,15 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
|
|
|
data->timestamp = jiffies;
|
|
|
if (nfs4_setup_sequence(data->server,
|
|
|
&data->arg.seq_args,
|
|
|
- &data->res.seq_res, task))
|
|
|
+ &data->res.seq_res,
|
|
|
+ task) == 0) {
|
|
|
+ rpc_call_start(task);
|
|
|
return;
|
|
|
- rpc_call_start(task);
|
|
|
- dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
|
|
|
+ }
|
|
|
+ nfs_release_seqid(data->arg.open_seqid);
|
|
|
+out_release_lock_seqid:
|
|
|
+ nfs_release_seqid(data->arg.lock_seqid);
|
|
|
+ dprintk("%s: done!, ret = %d\n", __func__, task->tk_status);
|
|
|
}
|
|
|
|
|
|
static void nfs4_recover_lock_prepare(struct rpc_task *task, void *calldata)
|
|
@@ -5667,7 +5677,7 @@ static void nfs4_add_and_init_slots(struct nfs4_slot_table *tbl,
|
|
|
tbl->slots = new;
|
|
|
tbl->max_slots = max_slots;
|
|
|
}
|
|
|
- tbl->highest_used_slotid = -1; /* no slot is currently used */
|
|
|
+ tbl->highest_used_slotid = NFS4_NO_SLOT;
|
|
|
for (i = 0; i < tbl->max_slots; i++)
|
|
|
tbl->slots[i].seq_nr = ivalue;
|
|
|
spin_unlock(&tbl->slot_tbl_lock);
|