|
@@ -28,6 +28,7 @@ static void nfs4_init_slot_table(struct nfs4_slot_table *tbl, const char *queue)
|
|
|
tbl->highest_used_slotid = NFS4_NO_SLOT;
|
|
|
spin_lock_init(&tbl->slot_tbl_lock);
|
|
|
rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, queue);
|
|
|
+ init_waitqueue_head(&tbl->slot_waitq);
|
|
|
init_completion(&tbl->complete);
|
|
|
}
|
|
|
|
|
@@ -192,7 +193,8 @@ static int nfs4_slot_get_seqid(struct nfs4_slot_table *tbl, u32 slotid,
|
|
|
* RPC call in question is still in flight. This function is mainly
|
|
|
* intended for use by the callback channel.
|
|
|
*/
|
|
|
-bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl, u32 slotid, u32 seq_nr)
|
|
|
+static bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl,
|
|
|
+ u32 slotid, u32 seq_nr)
|
|
|
{
|
|
|
u32 cur_seq;
|
|
|
bool ret = false;
|
|
@@ -205,6 +207,24 @@ bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl, u32 slotid, u32 seq_nr)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * nfs4_slot_wait_on_seqid - wait until a slot sequence id is complete
|
|
|
+ *
|
|
|
+ * Given a slot table, slot id and sequence number, wait until the
|
|
|
+ * corresponding RPC call completes. This function is mainly
|
|
|
+ * intended for use by the callback channel.
|
|
|
+ */
|
|
|
+int nfs4_slot_wait_on_seqid(struct nfs4_slot_table *tbl,
|
|
|
+ u32 slotid, u32 seq_nr,
|
|
|
+ unsigned long timeout)
|
|
|
+{
|
|
|
+ if (wait_event_timeout(tbl->slot_waitq,
|
|
|
+ !nfs4_slot_seqid_in_use(tbl, slotid, seq_nr),
|
|
|
+ timeout) == 0)
|
|
|
+ return -ETIMEDOUT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* nfs4_alloc_slot - efficiently look for a free slot
|
|
|
*
|