Commit 691daf3b authored by Andy Adamson's avatar Andy Adamson Committed by Trond Myklebust

nfs41: drain session cleanup

Do not wake up the next slot_tbl_waitq task in nfs4_free_slot because we
may be draining the slot. Either signal the state manager that the session
is drained (the state manager wakes up tasks) OR wake up the next task.

In nfs41_sequence_done, the slot dereference is only needed in the sequence
operation success case.
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent ea028ac9
...@@ -336,7 +336,6 @@ nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid) ...@@ -336,7 +336,6 @@ nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid)
else else
tbl->highest_used_slotid = -1; tbl->highest_used_slotid = -1;
} }
rpc_wake_up_next(&tbl->slot_tbl_waitq);
spin_unlock(&tbl->slot_tbl_lock); spin_unlock(&tbl->slot_tbl_lock);
dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__, dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__,
free_slotid, tbl->highest_used_slotid); free_slotid, tbl->highest_used_slotid);
...@@ -353,14 +352,13 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp, ...@@ -353,14 +352,13 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp,
} }
tbl = &clp->cl_session->fc_slot_table; tbl = &clp->cl_session->fc_slot_table;
if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) { if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) {
dprintk("%s: No slot\n", __func__);
/* just wake up the next guy waiting since /* just wake up the next guy waiting since
* we may have not consumed a slot after all */ * we may have not consumed a slot after all */
rpc_wake_up_next(&tbl->slot_tbl_waitq); dprintk("%s: No slot\n", __func__);
return; } else {
nfs4_free_slot(tbl, res->sr_slotid);
res->sr_slotid = NFS4_MAX_SLOT_TABLE;
} }
nfs4_free_slot(tbl, res->sr_slotid);
res->sr_slotid = NFS4_MAX_SLOT_TABLE;
/* Signal state manager thread if session is drained */ /* Signal state manager thread if session is drained */
if (test_bit(NFS4CLNT_SESSION_DRAINING, &clp->cl_state)) { if (test_bit(NFS4CLNT_SESSION_DRAINING, &clp->cl_state)) {
...@@ -370,6 +368,8 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp, ...@@ -370,6 +368,8 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp,
complete(&clp->cl_session->complete); complete(&clp->cl_session->complete);
} }
spin_unlock(&tbl->slot_tbl_lock); spin_unlock(&tbl->slot_tbl_lock);
} else {
rpc_wake_up_next(&tbl->slot_tbl_waitq);
} }
} }
...@@ -394,10 +394,10 @@ static void nfs41_sequence_done(struct nfs_client *clp, ...@@ -394,10 +394,10 @@ static void nfs41_sequence_done(struct nfs_client *clp,
if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) if (res->sr_slotid == NFS4_MAX_SLOT_TABLE)
goto out; goto out;
tbl = &clp->cl_session->fc_slot_table; /* Check the SEQUENCE operation status */
slot = tbl->slots + res->sr_slotid;
if (res->sr_status == 0) { if (res->sr_status == 0) {
tbl = &clp->cl_session->fc_slot_table;
slot = tbl->slots + res->sr_slotid;
/* Update the slot's sequence and clientid lease timer */ /* Update the slot's sequence and clientid lease timer */
++slot->seq_nr; ++slot->seq_nr;
timestamp = res->sr_renewal_time; timestamp = res->sr_renewal_time;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment