]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme-core: align fabrics_q teardown with admin_q in nvme_free_ctrl
authorMaurizio Lombardi <mlombard@redhat.com>
Thu, 14 May 2026 08:32:53 +0000 (10:32 +0200)
committerKeith Busch <kbusch@kernel.org>
Wed, 20 May 2026 18:45:44 +0000 (11:45 -0700)
Currently, the final reference for the fabrics admin queue (fabrics_q)
is dropped inside nvme_remove_admin_tag_set(). However, the primary admin
queue (admin_q) defers dropping its final reference until
nvme_free_ctrl().

Move the blk_put_queue() call for fabrics_q from
nvme_remove_admin_tag_set() to nvme_free_ctrl(). This aligns the
lifecycle management of both admin queues, ensuring they are freed
symmetrically when the controller is finally torn down.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
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 b14aae0a42172c8000383503dc3e50dd1fe98709..a6fe2cfb1ab12acae71ca1faca55ca65ec551bf3 100644 (file)
@@ -4932,10 +4932,8 @@ void nvme_remove_admin_tag_set(struct nvme_ctrl *ctrl)
         */
        nvme_stop_keep_alive(ctrl);
        blk_mq_destroy_queue(ctrl->admin_q);
-       if (ctrl->ops->flags & NVME_F_FABRICS) {
+       if (ctrl->fabrics_q)
                blk_mq_destroy_queue(ctrl->fabrics_q);
-               blk_put_queue(ctrl->fabrics_q);
-       }
        blk_mq_free_tag_set(ctrl->admin_tagset);
 }
 EXPORT_SYMBOL_GPL(nvme_remove_admin_tag_set);
@@ -5077,6 +5075,8 @@ static void nvme_free_ctrl(struct device *dev)
 
        if (ctrl->admin_q)
                blk_put_queue(ctrl->admin_q);
+       if (ctrl->fabrics_q)
+               blk_put_queue(ctrl->fabrics_q);
        if (!subsys || ctrl->instance != subsys->instance)
                ida_free(&nvme_instance_ida, ctrl->instance);
        nvme_free_cels(ctrl);