From af9e73302fbddd1ecd368c27a27cf50806e6269d Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Thu, 18 Jun 2020 12:59:19 -0700 Subject: [PATCH] bdev/nvme: make the controller trid a pointer. This lends itself to easily changing the trid during failover. Signed-off-by: Seth Howell Change-Id: Iae21a98de4f9dd1192a50abac0ec7fb0dd8a2e99 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2882 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto --- module/bdev/nvme/bdev_nvme.c | 42 ++++++++++++------- module/bdev/nvme/bdev_nvme_rpc.c | 2 +- module/bdev/nvme/common.c | 3 +- module/bdev/nvme/common.h | 2 +- .../lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c | 5 ++- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index d5c346dbf..591ea2a80 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -841,13 +841,13 @@ bdev_nvme_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) spdk_json_write_named_object_begin(w, "nvme"); - if (nvme_bdev_ctrlr->trid.trtype == SPDK_NVME_TRANSPORT_PCIE) { - spdk_json_write_named_string(w, "pci_address", nvme_bdev_ctrlr->trid.traddr); + if (nvme_bdev_ctrlr->trid->trtype == SPDK_NVME_TRANSPORT_PCIE) { + spdk_json_write_named_string(w, "pci_address", nvme_bdev_ctrlr->trid->traddr); } spdk_json_write_named_object_begin(w, "trid"); - nvme_bdev_dump_trid_json(&nvme_bdev_ctrlr->trid, w); + nvme_bdev_dump_trid_json(nvme_bdev_ctrlr->trid, w); spdk_json_write_object_end(w); @@ -1358,10 +1358,19 @@ create_ctrlr(struct spdk_nvme_ctrlr *ctrlr, SPDK_ERRLOG("Failed to allocate device struct\n"); return -ENOMEM; } + + nvme_bdev_ctrlr->trid = calloc(1, sizeof(*nvme_bdev_ctrlr->trid)); + if (nvme_bdev_ctrlr->trid == NULL) { + SPDK_ERRLOG("Failed to allocate device trid struct\n"); + free(nvme_bdev_ctrlr); + return -ENOMEM; + } + nvme_bdev_ctrlr->num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); nvme_bdev_ctrlr->namespaces = calloc(nvme_bdev_ctrlr->num_ns, sizeof(struct nvme_bdev_ns *)); if (!nvme_bdev_ctrlr->namespaces) { SPDK_ERRLOG("Failed to allocate block namespaces pointer\n"); + free(nvme_bdev_ctrlr->trid); free(nvme_bdev_ctrlr); return -ENOMEM; } @@ -1374,6 +1383,7 @@ create_ctrlr(struct spdk_nvme_ctrlr *ctrlr, free(nvme_bdev_ctrlr->namespaces[i - 1]); } free(nvme_bdev_ctrlr->namespaces); + free(nvme_bdev_ctrlr->trid); free(nvme_bdev_ctrlr); return -ENOMEM; } @@ -1382,10 +1392,11 @@ create_ctrlr(struct spdk_nvme_ctrlr *ctrlr, nvme_bdev_ctrlr->adminq_timer_poller = NULL; nvme_bdev_ctrlr->ctrlr = ctrlr; nvme_bdev_ctrlr->ref = 0; - nvme_bdev_ctrlr->trid = *trid; + *nvme_bdev_ctrlr->trid = *trid; nvme_bdev_ctrlr->name = strdup(name); if (nvme_bdev_ctrlr->name == NULL) { free(nvme_bdev_ctrlr->namespaces); + free(nvme_bdev_ctrlr->trid); free(nvme_bdev_ctrlr); return -ENOMEM; } @@ -1396,6 +1407,7 @@ create_ctrlr(struct spdk_nvme_ctrlr *ctrlr, SPDK_ERRLOG("Unable to initialize OCSSD controller\n"); free(nvme_bdev_ctrlr->name); free(nvme_bdev_ctrlr->namespaces); + free(nvme_bdev_ctrlr->trid); free(nvme_bdev_ctrlr); return rc; } @@ -1787,12 +1799,12 @@ bdev_nvme_delete(const char *name) return -ENODEV; } - if (nvme_bdev_ctrlr->trid.trtype == SPDK_NVME_TRANSPORT_PCIE) { + if (nvme_bdev_ctrlr->trid->trtype == SPDK_NVME_TRANSPORT_PCIE) { entry = calloc(1, sizeof(*entry)); if (!entry) { return -ENOMEM; } - entry->trid = nvme_bdev_ctrlr->trid; + entry->trid = *nvme_bdev_ctrlr->trid; TAILQ_INSERT_TAIL(&g_skipped_nvme_ctrlrs, entry, tailq); } @@ -2636,31 +2648,31 @@ bdev_nvme_get_spdk_running_config(FILE *fp) const char *trtype; const char *prchk_flags; - trtype = spdk_nvme_transport_id_trtype_str(nvme_bdev_ctrlr->trid.trtype); + trtype = spdk_nvme_transport_id_trtype_str(nvme_bdev_ctrlr->trid->trtype); if (!trtype) { continue; } - if (nvme_bdev_ctrlr->trid.trtype == SPDK_NVME_TRANSPORT_PCIE) { + if (nvme_bdev_ctrlr->trid->trtype == SPDK_NVME_TRANSPORT_PCIE) { fprintf(fp, "TransportID \"trtype:%s traddr:%s\" %s\n", trtype, - nvme_bdev_ctrlr->trid.traddr, nvme_bdev_ctrlr->name); + nvme_bdev_ctrlr->trid->traddr, nvme_bdev_ctrlr->name); } else { const char *adrfam; - adrfam = spdk_nvme_transport_id_adrfam_str(nvme_bdev_ctrlr->trid.adrfam); + adrfam = spdk_nvme_transport_id_adrfam_str(nvme_bdev_ctrlr->trid->adrfam); prchk_flags = spdk_nvme_prchk_flags_str(nvme_bdev_ctrlr->prchk_flags); if (adrfam) { fprintf(fp, "TransportID \"trtype:%s adrfam:%s traddr:%s trsvcid:%s subnqn:%s\" %s", trtype, adrfam, - nvme_bdev_ctrlr->trid.traddr, nvme_bdev_ctrlr->trid.trsvcid, - nvme_bdev_ctrlr->trid.subnqn, nvme_bdev_ctrlr->name); + nvme_bdev_ctrlr->trid->traddr, nvme_bdev_ctrlr->trid->trsvcid, + nvme_bdev_ctrlr->trid->subnqn, nvme_bdev_ctrlr->name); } else { fprintf(fp, "TransportID \"trtype:%s traddr:%s trsvcid:%s subnqn:%s\" %s", trtype, - nvme_bdev_ctrlr->trid.traddr, nvme_bdev_ctrlr->trid.trsvcid, - nvme_bdev_ctrlr->trid.subnqn, nvme_bdev_ctrlr->name); + nvme_bdev_ctrlr->trid->traddr, nvme_bdev_ctrlr->trid->trsvcid, + nvme_bdev_ctrlr->trid->subnqn, nvme_bdev_ctrlr->name); } if (prchk_flags) { @@ -2768,7 +2780,7 @@ bdev_nvme_config_json(struct spdk_json_write_ctx *w) pthread_mutex_lock(&g_bdev_nvme_mutex); TAILQ_FOREACH(nvme_bdev_ctrlr, &g_nvme_bdev_ctrlrs, tailq) { - trid = &nvme_bdev_ctrlr->trid; + trid = nvme_bdev_ctrlr->trid; spdk_json_write_object_begin(w); diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 2e05726c7..299da4023 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -357,7 +357,7 @@ rpc_dump_nvme_controller_info(struct spdk_json_write_ctx *w, { struct spdk_nvme_transport_id *trid; - trid = &nvme_bdev_ctrlr->trid; + trid = nvme_bdev_ctrlr->trid; spdk_json_write_object_begin(w); spdk_json_write_named_string(w, "name", nvme_bdev_ctrlr->name); diff --git a/module/bdev/nvme/common.c b/module/bdev/nvme/common.c index 67ee495f0..32fa4ea50 100644 --- a/module/bdev/nvme/common.c +++ b/module/bdev/nvme/common.c @@ -45,7 +45,7 @@ nvme_bdev_ctrlr_get(const struct spdk_nvme_transport_id *trid) struct nvme_bdev_ctrlr *nvme_bdev_ctrlr; TAILQ_FOREACH(nvme_bdev_ctrlr, &g_nvme_bdev_ctrlrs, tailq) { - if (spdk_nvme_transport_id_compare(trid, &nvme_bdev_ctrlr->trid) == 0) { + if (spdk_nvme_transport_id_compare(trid, nvme_bdev_ctrlr->trid) == 0) { return nvme_bdev_ctrlr; } } @@ -128,6 +128,7 @@ nvme_bdev_unregister_cb(void *io_device) free(nvme_bdev_ctrlr->namespaces[i]); } free(nvme_bdev_ctrlr->namespaces); + free(nvme_bdev_ctrlr->trid); free(nvme_bdev_ctrlr); pthread_mutex_lock(&g_bdev_nvme_mutex); diff --git a/module/bdev/nvme/common.h b/module/bdev/nvme/common.h index f5de3edb7..eafed596b 100644 --- a/module/bdev/nvme/common.h +++ b/module/bdev/nvme/common.h @@ -76,7 +76,7 @@ struct nvme_bdev_ctrlr { * target for CONTROLLER IDENTIFY command during initialization */ struct spdk_nvme_ctrlr *ctrlr; - struct spdk_nvme_transport_id trid; + struct spdk_nvme_transport_id *trid; char *name; int ref; bool resetting; diff --git a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c index d039a3d98..a2f8e7f71 100644 --- a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c +++ b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c @@ -211,10 +211,13 @@ create_nvme_bdev_controller(const struct spdk_nvme_transport_id *trid, const cha nvme_bdev_ctrlr->namespaces = calloc(ctrlr->ns_count, sizeof(struct nvme_bdev_ns *)); SPDK_CU_ASSERT_FATAL(nvme_bdev_ctrlr->namespaces != NULL); + nvme_bdev_ctrlr->trid = calloc(1, sizeof(struct spdk_nvme_transport_id)); + SPDK_CU_ASSERT_FATAL(nvme_bdev_ctrlr->trid != NULL); + nvme_bdev_ctrlr->ctrlr = ctrlr; nvme_bdev_ctrlr->num_ns = ctrlr->ns_count; nvme_bdev_ctrlr->ref = 0; - nvme_bdev_ctrlr->trid = *trid; + *nvme_bdev_ctrlr->trid = *trid; nvme_bdev_ctrlr->name = strdup(name); for (nsid = 0; nsid < ctrlr->ns_count; ++nsid) {