NFSv4.x: Allow multiple callbacks in flight
Hook the callback channel into the same session management machinery as we use for the forward channel. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
@@ -752,7 +752,8 @@ preprocess_nfs41_op(int nop, unsigned int op_nr, struct callback_op **op)
|
||||
return htonl(NFS_OK);
|
||||
}
|
||||
|
||||
static void nfs4_callback_free_slot(struct nfs4_session *session)
|
||||
static void nfs4_callback_free_slot(struct nfs4_session *session,
|
||||
struct nfs4_slot *slot)
|
||||
{
|
||||
struct nfs4_slot_table *tbl = &session->bc_slot_table;
|
||||
|
||||
@@ -761,15 +762,17 @@ static void nfs4_callback_free_slot(struct nfs4_session *session)
|
||||
* Let the state manager know callback processing done.
|
||||
* A single slot, so highest used slotid is either 0 or -1
|
||||
*/
|
||||
tbl->highest_used_slotid = NFS4_NO_SLOT;
|
||||
nfs4_free_slot(tbl, slot);
|
||||
nfs4_slot_tbl_drain_complete(tbl);
|
||||
spin_unlock(&tbl->slot_tbl_lock);
|
||||
}
|
||||
|
||||
static void nfs4_cb_free_slot(struct cb_process_state *cps)
|
||||
{
|
||||
if (cps->slotid != NFS4_NO_SLOT)
|
||||
nfs4_callback_free_slot(cps->clp->cl_session);
|
||||
if (cps->slot) {
|
||||
nfs4_callback_free_slot(cps->clp->cl_session, cps->slot);
|
||||
cps->slot = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#else /* CONFIG_NFS_V4_1 */
|
||||
@@ -893,7 +896,6 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *r
|
||||
struct cb_process_state cps = {
|
||||
.drc_status = 0,
|
||||
.clp = NULL,
|
||||
.slotid = NFS4_NO_SLOT,
|
||||
.net = SVC_NET(rqstp),
|
||||
};
|
||||
unsigned int nops = 0;
|
||||
|
Verwijs in nieuw issue
Block a user