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); } /**