Skip to contentSkip to conversation

NFSv4.x: Enforce the ca_maxresponsesize_cached on the back channel

DISCUSSION Dan Carpenter 2 participants 2 messages May 12, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hello Trond Myklebust,

The patch 80f9642724af: "NFSv4.x: Enforce the ca_maxresponsesize_cached on the back channel" from Jan 23, 2016, leads to the following static checker warning:

fs/nfs/callback_proc.c:540 nfs4_callback_sequence()
warn: inconsistent returns 'spin_lock:&tbl->slot_tbl_lock'.
Locked on: line 504
Unlocked on: line 540

fs/nfs/callback_proc.c
490 res->csr_highestslotid = tbl->server_highest_slotid;
491 res->csr_target_highestslotid = tbl->target_highest_slotid;
492
493 status = validate_seqid(tbl, slot, args);
494 if (status)
495 goto out_unlock;
496 if (!nfs4_try_to_lock_slot(tbl, slot)) {
497 status = htonl(NFS4ERR_DELAY);

   498                  goto out_unlock;
                        ^^^^^^^^^^^^^^^

499 }
500 cps->slot = slot;
501
502 /* The ca_maxresponsesize_cached is 0 with no DRC */
503 if (args->csa_cachethis != 0)
504 return htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE);

This should also unlock and possibly do other unwinding?

505
506 /*

   507           * Check for pending referring calls.  If a match is found, a
   508           * related callback was received before the response to the original
   509           * call.
   510           */

511 if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists)) {
512 status = htonl(NFS4ERR_DELAY);
513 goto out_unlock;
514 }

regards,
dan carpenter

#1 lore raw

Yep that leads to the kernel oops. I have posted a patch. Hopefully Trond will approve it.

Quoted 48 lines · Dan Carpenter

Hello Trond Myklebust,

The patch 80f9642724af: "NFSv4.x: Enforce the ca_maxresponsesize_cached on the back channel" from Jan 23, 2016, leads to the following static checker warning:

fs/nfs/callback_proc.c:540 nfs4_callback_sequence()
warn: inconsistent returns 'spin_lock:&tbl->slot_tbl_lock'.
Locked on: line 504
Unlocked on: line 540

fs/nfs/callback_proc.c

   490          res->csr_highestslotid = tbl->server_highest_slotid;
   491          res->csr_target_highestslotid = tbl->target_highest_slotid;
   492
   493          status = validate_seqid(tbl, slot, args);
   494          if (status)
   495                  goto out_unlock;
   496          if (!nfs4_try_to_lock_slot(tbl, slot)) {
   497                  status = htonl(NFS4ERR_DELAY);
   498                  goto out_unlock;
                        ^^^^^^^^^^^^^^^
   499          }
   500          cps->slot = slot;
   501
   502          /* The ca_maxresponsesize_cached is 0 with no DRC */
   503          if (args->csa_cachethis != 0)
   504                  return htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE);

This should also unlock and possibly do other unwinding?

   505
   506          /*
   507           * Check for pending referring calls.  If a match is found, a
   508           * related callback was received before the response to the original
   509           * call.
   510           */
   511          if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists)) {
   512                  status = htonl(NFS4ERR_DELAY);
   513                  goto out_unlock;
   514          }

regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html