nvme-loop: always quiesce and cancel commands before destroying admin q
authorHannes Reinecke <hare@suse.de>
Tue, 24 Oct 2023 06:13:36 +0000 (08:13 +0200)
committerKeith Busch <kbusch@kernel.org>
Mon, 6 Nov 2023 17:00:15 +0000 (09:00 -0800)
Once ->init_ctrl_finish() is called there may be commands outstanding,
so we should quiesce the admin queue and cancel all commands prior
to call nvme_loop_destroy_admin_queue().

Signed-off-by: Hannes Reinecke <hare@suse.de>
Tested-by: Mark O'Donovan <shiftee@posteo.net>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/loop.c

index 48d5df054cd0245e62acf3997be6c2413af9064e..9cb434c5807514813afe91eada69c0a925daf83a 100644 (file)
@@ -466,6 +466,8 @@ static void nvme_loop_reset_ctrl_work(struct work_struct *work)
 out_destroy_io:
        nvme_loop_destroy_io_queues(ctrl);
 out_destroy_admin:
+       nvme_quiesce_admin_queue(&ctrl->ctrl);
+       nvme_cancel_admin_tagset(&ctrl->ctrl);
        nvme_loop_destroy_admin_queue(ctrl);
 out_disable:
        dev_warn(ctrl->ctrl.device, "Removing after reset failure\n");
@@ -600,6 +602,8 @@ static struct nvme_ctrl *nvme_loop_create_ctrl(struct device *dev,
        return &ctrl->ctrl;
 
 out_remove_admin_queue:
+       nvme_quiesce_admin_queue(&ctrl->ctrl);
+       nvme_cancel_admin_tagset(&ctrl->ctrl);
        nvme_loop_destroy_admin_queue(ctrl);
 out_free_queues:
        kfree(ctrl->queues);