From: "brookxu.cn" <brookxu.cn@gmail.com>
To: kbusch@kernel.org, axboe@kernel.dk, hch@lst.de, sagi@grimberg.me
Cc: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2] nvme-core: auto add the new ns while UUID changed
Date: Fri, 15 Nov 2024 16:37:27 +0800 [thread overview]
Message-ID: <20241115083727.30005-1-brookxu.cn@gmail.com> (raw)
From: "Chunguang.xu" <chunguang.xu@shopee.com>
Now spdk will change UUID of ns while restarted if we have not
specified one. At this time, while host try to reconnected to target,
as UUID have changed, we will remove the old ns, but not add the ns
with the new UUID. As a result ctrl with no ns, and we need to
disconnect and connect to get the new ns. Here try to add ns with the
new UUID automatically.
Reported-by: Yingfu.zhou <yingfu.zhou@shopee.com>
Signed-off-by: Chunguang.xu <chunguang.xu@shopee.com>
---
drivers/nvme/host/core.c | 45 ++++++++++++++++++----------------------
1 file changed, 20 insertions(+), 25 deletions(-)
V2: Add missed reporter
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 855b42c92284..425f59fc80d5 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3991,28 +3991,6 @@ static void nvme_ns_remove_by_nsid(struct nvme_ctrl *ctrl, u32 nsid)
}
}
-static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
-{
- int ret = NVME_SC_INVALID_NS | NVME_STATUS_DNR;
-
- if (!nvme_ns_ids_equal(&ns->head->ids, &info->ids)) {
- dev_err(ns->ctrl->device,
- "identifiers changed for nsid %d\n", ns->head->ns_id);
- goto out;
- }
-
- ret = nvme_update_ns_info(ns, info);
-out:
- /*
- * Only remove the namespace if we got a fatal error back from the
- * device, otherwise ignore the error and just move on.
- *
- * TODO: we should probably schedule a delayed retry here.
- */
- if (ret > 0 && (ret & NVME_STATUS_DNR))
- nvme_ns_remove(ns);
-}
-
static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
{
struct nvme_ns_info info = { .nsid = nsid };
@@ -4051,11 +4029,28 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
ns = nvme_find_get_ns(ctrl, nsid);
if (ns) {
- nvme_validate_ns(ns, &info);
+ if (!nvme_ns_ids_equal(&ns->head->ids, &info.ids)) {
+ dev_err(ns->ctrl->device,
+ "identifiers changed for nsid %d\n", ns->head->ns_id);
+ nvme_ns_remove(ns);
+ nvme_put_ns(ns);
+ goto alloc;
+ }
+
+ ret = nvme_update_ns_info(ns, &info);
+ /*
+ * Only remove the namespace if we got a fatal error back from the
+ * device, otherwise ignore the error and just move on.
+ *
+ * TODO: we should probably schedule a delayed retry here.
+ */
+ if (ret > 0 && (ret & NVME_STATUS_DNR))
+ nvme_ns_remove(ns);
nvme_put_ns(ns);
- } else {
- nvme_alloc_ns(ctrl, &info);
+ return;
}
+ alloc:
+ nvme_alloc_ns(ctrl, &info);
}
/**
--
2.25.1
next reply other threads:[~2024-11-15 8:01 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-15 8:37 brookxu.cn [this message]
2024-11-15 17:04 ` [PATCH v2] nvme-core: auto add the new ns while UUID changed Christoph Hellwig
2024-11-16 0:49 ` 许春光
2024-11-18 6:26 ` Christoph Hellwig
2024-11-18 9:31 ` 许春光
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241115083727.30005-1-brookxu.cn@gmail.com \
--to=brookxu.cn@gmail.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox