Commit d453f04e authored by Trond Myklebust's avatar Trond Myklebust Committed by Greg Kroah-Hartman

NFSv4: Fix a sleep in atomic context in nfs4_callback_sequence()

commit 8618289c upstream.

We must drop the lock before we can sleep in referring_call_exists().
Reported-by: default avatarJia-Ju Bai <>
Fixes: 045d2a6d ("NFSv4.1: Delay callback processing...")
Cc: # v4.9+
Signed-off-by: default avatarTrond Myklebust <>
Signed-off-by: default avatarAnna Schumaker <>
Signed-off-by: default avatarGreg Kroah-Hartman <>
parent c5759d5a
......@@ -433,11 +433,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)
bool status = 0;
int status = 0;
int i, j;
struct nfs4_session *session;
struct nfs4_slot_table *tbl;
......@@ -460,8 +463,10 @@ static bool referring_call_exists(struct nfs_client *clp,
for (j = 0; j < rclist->rcl_nrefcalls; j++) {
ref = &rclist->rcl_refcalls[j];
status = nfs4_slot_wait_on_seqid(tbl, ref->rc_slotid,
ref->rc_sequenceid, HZ >> 1) < 0;
if (status)
goto out;
......@@ -538,7 +543,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;
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