[PATCH v2 1/2] blk-mq: add tagset quiesce interface
Christoph Hellwig
hch at lst.de
Tue Oct 18 01:55:57 PDT 2022
On Tue, Oct 18, 2022 at 11:39:30AM +0300, Sagi Grimberg wrote:
> The only question in my mind is regarding patch 2/2 with the subtle
> ordering of nvme_set_queue_dying...
I think we need to sort that out as a pre-patch. There is quite some
history there was a fair amount of dead lock potential earlier, but
I think I sorted quite a lot out there, including a new lock for setting
the gendisk size, which is what the comment refers to.
Something like this:
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 059737c1a2c19..cb7623b5d2c8b 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -5105,21 +5105,21 @@ static void nvme_stop_ns_queue(struct nvme_ns *ns)
/*
* Prepare a queue for teardown.
- *
- * This must forcibly unquiesce queues to avoid blocking dispatch, and only set
- * the capacity to 0 after that to avoid blocking dispatchers that may be
- * holding bd_butex. This will end buffered writers dirtying pages that can't
- * be synced.
*/
static void nvme_set_queue_dying(struct nvme_ns *ns)
{
if (test_and_set_bit(NVME_NS_DEAD, &ns->flags))
return;
+ /*
+ * Mark the disk dead to prevent new opens, and set the capacity to 0
+ * to end buffered writers dirtying pages that can't be synced.
+ */
blk_mark_disk_dead(ns->disk);
- nvme_start_ns_queue(ns);
-
set_capacity_and_notify(ns->disk, 0);
+
+ /* forcibly unquiesce queues to avoid blocking dispatch */
+ nvme_start_ns_queue(ns);
}
/**
More information about the Linux-nvme
mailing list