Skip to content

Commit

Permalink
nfs41: drain session cleanup
Browse files Browse the repository at this point in the history
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: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Andy Adamson authored and Trond Myklebust committed Dec 4, 2009
1 parent ea028ac commit 691daf3
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,6 @@ nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid)
else
tbl->highest_used_slotid = -1;
}
rpc_wake_up_next(&tbl->slot_tbl_waitq);
spin_unlock(&tbl->slot_tbl_lock);
dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__,
free_slotid, tbl->highest_used_slotid);
Expand All @@ -353,14 +352,13 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp,
}
tbl = &clp->cl_session->fc_slot_table;
if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) {
dprintk("%s: No slot\n", __func__);
/* just wake up the next guy waiting since
* we may have not consumed a slot after all */
rpc_wake_up_next(&tbl->slot_tbl_waitq);
return;
dprintk("%s: No slot\n", __func__);
} 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 */
if (test_bit(NFS4CLNT_SESSION_DRAINING, &clp->cl_state)) {
Expand All @@ -370,6 +368,8 @@ void nfs41_sequence_free_slot(const struct nfs_client *clp,
complete(&clp->cl_session->complete);
}
spin_unlock(&tbl->slot_tbl_lock);
} else {
rpc_wake_up_next(&tbl->slot_tbl_waitq);
}
}

Expand All @@ -394,10 +394,10 @@ static void nfs41_sequence_done(struct nfs_client *clp,
if (res->sr_slotid == NFS4_MAX_SLOT_TABLE)
goto out;

tbl = &clp->cl_session->fc_slot_table;
slot = tbl->slots + res->sr_slotid;

/* Check the SEQUENCE operation status */
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 */
++slot->seq_nr;
timestamp = res->sr_renewal_time;
Expand Down

0 comments on commit 691daf3

Please sign in to comment.