diff mbox series

[4/4] nvme: wait until quiesce is done

Message ID 20211103034305.3691555-5-ming.lei@redhat.com (mailing list archive)
State Superseded
Headers show
Series block: fix concurrent quiesce | expand

Commit Message

Ming Lei Nov. 3, 2021, 3:43 a.m. UTC
NVMe uses one atomic flag to check if quiesce is needed. If quiesce is
started, the helper returns immediately. This way is wrong, since we
have to wait until quiesce is done.

Fixes: e70feb8b3e68 ("blk-mq: support concurrent queue quiesce/unquiesce")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 drivers/nvme/host/core.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Keith Busch Nov. 8, 2021, 4:45 p.m. UTC | #1
On Wed, Nov 03, 2021 at 11:43:05AM +0800, Ming Lei wrote:
> NVMe uses one atomic flag to check if quiesce is needed. If quiesce is
> started, the helper returns immediately. This way is wrong, since we
> have to wait until quiesce is done.

Looks good to me.

Reviewed-by: Keith Busch <kbusch@kernel.org>
Sagi Grimberg Nov. 12, 2021, 3:38 p.m. UTC | #2
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
diff mbox series

Patch

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 838b5e2058be..4b5de8f5435a 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -4518,6 +4518,8 @@  static void nvme_stop_ns_queue(struct nvme_ns *ns)
 {
 	if (!test_and_set_bit(NVME_NS_STOPPED, &ns->flags))
 		blk_mq_quiesce_queue(ns->queue);
+	else
+		blk_mq_wait_quiesce_done(ns->queue);
 }
 
 /*
@@ -4637,6 +4639,8 @@  void nvme_stop_admin_queue(struct nvme_ctrl *ctrl)
 {
 	if (!test_and_set_bit(NVME_CTRL_ADMIN_Q_STOPPED, &ctrl->flags))
 		blk_mq_quiesce_queue(ctrl->admin_q);
+	else
+		blk_mq_wait_quiesce_done(ctrl->admin_q);
 }
 EXPORT_SYMBOL_GPL(nvme_stop_admin_queue);