From b0a6496a7bbb15cb2900099d5f86af75696b3620 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 2 Sep 2021 21:33:32 +0900 Subject: [PATCH] bdev/nvme: Save probe_ctx in nvme_ns and populate_namespace_done() refer it nvme_ctrlr_populate_namespace_done() needs nvme_ns, probe_ctx, and completion status. When multipath is supported, nvme_ctrlr_populate_namespace_done() will be called from the spdk_for_each_channel() callback. The spdk_for_each_channel() callback can have one context and one completion status. Hence nvme_ns or probe_ctx need to have another. If an nvme_ctrlr has multiple namespaces, a probe_ctx is shared by multiple nvme_ns. So let nvme_ns has probe_ctx. Signed-off-by: Shuhei Matsumoto Change-Id: Iedaaab80616d34d01935f4ebc31e1f3b84e09e32 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9047 Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins --- module/bdev/nvme/bdev_nvme.c | 14 ++++++++------ module/bdev/nvme/bdev_nvme.h | 13 +++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 1d5dd0d0b..2240b96ef 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1929,12 +1929,13 @@ timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, } static void -nvme_ctrlr_populate_namespace_done(struct nvme_async_probe_ctx *ctx, - struct nvme_ns *nvme_ns, int rc) +nvme_ctrlr_populate_namespace_done(struct nvme_ns *nvme_ns, int rc) { struct nvme_ctrlr *nvme_ctrlr = nvme_ns->ctrlr; + struct nvme_async_probe_ctx *ctx = nvme_ns->probe_ctx; if (rc == 0) { + nvme_ns->probe_ctx = NULL; pthread_mutex_lock(&nvme_ctrlr->mutex); nvme_ctrlr->ref++; pthread_mutex_unlock(&nvme_ctrlr->mutex); @@ -1952,8 +1953,7 @@ nvme_ctrlr_populate_namespace_done(struct nvme_async_probe_ctx *ctx, } static void -nvme_ctrlr_populate_namespace(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *nvme_ns, - struct nvme_async_probe_ctx *ctx) +nvme_ctrlr_populate_namespace(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *nvme_ns) { struct spdk_nvme_ctrlr *ctrlr = nvme_ctrlr->ctrlr; struct spdk_nvme_ns *ns; @@ -1976,7 +1976,7 @@ nvme_ctrlr_populate_namespace(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *nvm rc = nvme_bdev_create(nvme_ctrlr, nvme_ns); done: - nvme_ctrlr_populate_namespace_done(ctx, nvme_ns, rc); + nvme_ctrlr_populate_namespace_done(nvme_ns, rc); } static void @@ -2089,7 +2089,9 @@ nvme_ctrlr_populate_namespaces(struct nvme_ctrlr *nvme_ctrlr, if (ctx) { ctx->populates_in_progress++; } - nvme_ctrlr_populate_namespace(nvme_ctrlr, nvme_ns, ctx); + nvme_ns->probe_ctx = ctx; + + nvme_ctrlr_populate_namespace(nvme_ctrlr, nvme_ns); } nsid = spdk_nvme_ctrlr_get_next_active_ns(ctrlr, nsid); diff --git a/module/bdev/nvme/bdev_nvme.h b/module/bdev/nvme/bdev_nvme.h index 32dc1994f..d1ee3e065 100644 --- a/module/bdev/nvme/bdev_nvme.h +++ b/module/bdev/nvme/bdev_nvme.h @@ -67,12 +67,13 @@ struct nvme_async_probe_ctx { }; struct nvme_ns { - uint32_t id; - struct spdk_nvme_ns *ns; - struct nvme_ctrlr *ctrlr; - struct nvme_bdev *bdev; - uint32_t ana_group_id; - enum spdk_nvme_ana_state ana_state; + uint32_t id; + struct spdk_nvme_ns *ns; + struct nvme_ctrlr *ctrlr; + struct nvme_bdev *bdev; + uint32_t ana_group_id; + enum spdk_nvme_ana_state ana_state; + struct nvme_async_probe_ctx *probe_ctx; }; struct nvme_bdev_io;