]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme-core: warn on allocating admin tag set with existing queue
authorMaurizio Lombardi <mlombard@redhat.com>
Thu, 14 May 2026 08:32:55 +0000 (10:32 +0200)
committerKeith Busch <kbusch@kernel.org>
Wed, 20 May 2026 18:45:44 +0000 (11:45 -0700)
Currently, nvme_alloc_admin_tag_set() silently drops and releases
the existing admin_q if it called on a controller that already
had one (e.g., during a controller reset).

However, transport drivers should not be reallocating the admin tag
set and queue during a reset. Dropping the old queue and allocating
a new one destroys user-configured timeouts and may race against
nvme_admin_timeout_store()

Since all transport drivers are now expected to preserve the admin queue
across resets, calling nvme_alloc_admin_tag_set() when ctrl->admin_q
is already populated is a bug.

Remove the silent cleanup and replace it with a WARN_ON_ONCE() to
explicitly catch any transport drivers that violate this lifecycle rule

Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/core.c

index a6fe2cfb1ab12acae71ca1faca55ca65ec551bf3..72c50d5e938d707f662633d090acb0a3aef0ef64 100644 (file)
@@ -4889,12 +4889,7 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
        if (ret)
                return ret;
 
-       /*
-        * If a previous admin queue exists (e.g., from before a reset),
-        * put it now before allocating a new one to avoid orphaning it.
-        */
-       if (ctrl->admin_q)
-               blk_put_queue(ctrl->admin_q);
+       WARN_ON_ONCE(ctrl->admin_q);
 
        ctrl->admin_q = blk_mq_alloc_queue(set, NULL, NULL);
        if (IS_ERR(ctrl->admin_q)) {