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);
}
If we no longer have this ordering requirement, then I don't see why
the unquiesce cannot move before or after nvme_set_queue_dying and apply
a tagset-wide quiesce/unquiesce...