|
@@ -442,11 +442,14 @@ validate_seqid(const struct nfs4_slot_table *tbl, const struct nfs4_slot *slot,
|
|
|
* a match. If the slot is in use and the sequence numbers match, the
|
|
|
* client is still waiting for a response to the original request.
|
|
|
*/
|
|
|
-static bool referring_call_exists(struct nfs_client *clp,
|
|
|
+static int referring_call_exists(struct nfs_client *clp,
|
|
|
uint32_t nrclists,
|
|
|
- struct referring_call_list *rclists)
|
|
|
+ struct referring_call_list *rclists,
|
|
|
+ spinlock_t *lock)
|
|
|
+ __releases(lock)
|
|
|
+ __acquires(lock)
|
|
|
{
|
|
|
- bool status = false;
|
|
|
+ int status = 0;
|
|
|
int i, j;
|
|
|
struct nfs4_session *session;
|
|
|
struct nfs4_slot_table *tbl;
|
|
@@ -469,8 +472,10 @@ static bool referring_call_exists(struct nfs_client *clp,
|
|
|
|
|
|
for (j = 0; j < rclist->rcl_nrefcalls; j++) {
|
|
|
ref = &rclist->rcl_refcalls[j];
|
|
|
+ spin_unlock(lock);
|
|
|
status = nfs4_slot_wait_on_seqid(tbl, ref->rc_slotid,
|
|
|
ref->rc_sequenceid, HZ >> 1) < 0;
|
|
|
+ spin_lock(lock);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
}
|
|
@@ -547,7 +552,8 @@ __be32 nfs4_callback_sequence(void *argp, void *resp,
|
|
|
* related callback was received before the response to the original
|
|
|
* call.
|
|
|
*/
|
|
|
- if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists)) {
|
|
|
+ if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists,
|
|
|
+ &tbl->slot_tbl_lock) < 0) {
|
|
|
status = htonl(NFS4ERR_DELAY);
|
|
|
goto out_unlock;
|
|
|
}
|