diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 96412cdd0..aa28822be 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -295,9 +295,7 @@ bdev_nvme_destruct(void *ctx) struct nvme_bdev *nvme_disk = ctx; struct nvme_bdev_ns *nvme_ns = nvme_disk->nvme_ns; - pthread_mutex_lock(&g_bdev_nvme_mutex); - TAILQ_REMOVE(&nvme_ns->bdevs, nvme_disk, tailq); - pthread_mutex_unlock(&g_bdev_nvme_mutex); + nvme_ns->bdev = NULL; nvme_bdev_ns_detach(nvme_ns); @@ -1224,7 +1222,7 @@ nvme_bdev_create(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct nvme_bdev_ns *n } nvme_ns->ref++; - TAILQ_INSERT_TAIL(&nvme_ns->bdevs, bdev, tailq); + nvme_ns->bdev = bdev; return 0; } @@ -1347,7 +1345,7 @@ nvme_ctrlr_depopulate_standard_namespace(struct nvme_bdev_ns *nvme_ns) { struct nvme_bdev *bdev; - bdev = TAILQ_FIRST(&nvme_ns->bdevs); + bdev = nvme_ns->bdev; if (bdev != NULL) { spdk_bdev_unregister(&bdev->disk, NULL, NULL); } @@ -1421,7 +1419,7 @@ nvme_ctrlr_populate_namespaces(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, /* NS is still there but attributes may have changed */ ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); num_sectors = spdk_nvme_ns_get_num_sectors(ns); - bdev = TAILQ_FIRST(&nvme_ns->bdevs); + bdev = nvme_ns->bdev; assert(bdev != NULL); if (bdev->disk.blockcnt != num_sectors) { SPDK_NOTICELOG("NSID %u is resized: bdev name %s, old size %" PRIu64 ", new size %" PRIu64 "\n", @@ -1446,7 +1444,7 @@ nvme_ctrlr_populate_namespaces(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, nvme_ns->type = NVME_BDEV_NS_STANDARD; } - TAILQ_INIT(&nvme_ns->bdevs); + nvme_ns->bdev = NULL; if (ctx) { ctx->populates_in_progress++; @@ -1833,7 +1831,7 @@ nvme_ctrlr_populate_namespaces_done(struct nvme_async_probe_ctx *ctx) continue; } assert(nvme_ns->id == nsid); - nvme_bdev = TAILQ_FIRST(&nvme_ns->bdevs); + nvme_bdev = nvme_ns->bdev; if (nvme_bdev == NULL) { assert(nvme_ns->type == NVME_BDEV_NS_OCSSD); continue; diff --git a/module/bdev/nvme/bdev_ocssd.c b/module/bdev/nvme/bdev_ocssd.c index c05f6f2a0..2ea64c8f3 100644 --- a/module/bdev/nvme/bdev_ocssd.c +++ b/module/bdev/nvme/bdev_ocssd.c @@ -124,17 +124,14 @@ bdev_ocssd_config_json(struct spdk_json_write_ctx *w) void bdev_ocssd_namespace_config_json(struct spdk_json_write_ctx *w, struct nvme_bdev_ns *nvme_ns) { - struct nvme_bdev *nvme_bdev; - - nvme_bdev = TAILQ_FIRST(&nvme_ns->bdevs); - assert(nvme_bdev != NULL); + assert(nvme_ns->bdev != NULL); spdk_json_write_object_begin(w); spdk_json_write_named_string(w, "method", "bdev_ocssd_create"); spdk_json_write_named_object_begin(w, "params"); spdk_json_write_named_string(w, "ctrlr_name", nvme_ns->ctrlr->name); - spdk_json_write_named_string(w, "bdev_name", nvme_bdev->disk.name); + spdk_json_write_named_string(w, "bdev_name", nvme_ns->bdev->disk.name); spdk_json_write_named_uint32(w, "nsid", nvme_ns->id); spdk_json_write_object_end(w); @@ -214,9 +211,7 @@ bdev_ocssd_destruct(void *ctx) struct nvme_bdev *nvme_bdev = &ocssd_bdev->nvme_bdev; struct nvme_bdev_ns *nvme_ns = nvme_bdev->nvme_ns; - pthread_mutex_lock(&g_bdev_nvme_mutex); - TAILQ_REMOVE(&nvme_ns->bdevs, nvme_bdev, tailq); - pthread_mutex_unlock(&g_bdev_nvme_mutex); + nvme_ns->bdev = NULL; nvme_bdev_ns_detach(nvme_ns); @@ -876,7 +871,7 @@ bdev_ocssd_free_namespace(struct nvme_bdev_ns *nvme_ns) { struct nvme_bdev *bdev; - bdev = TAILQ_FIRST(&nvme_ns->bdevs); + bdev = nvme_ns->bdev; if (bdev != NULL) { spdk_bdev_unregister(&bdev->disk, NULL, NULL); } @@ -909,7 +904,7 @@ bdev_ocssd_push_media_events(struct nvme_bdev_ns *nvme_ns, return; } - nvme_bdev = TAILQ_FIRST(&nvme_ns->bdevs); + nvme_bdev = nvme_ns->bdev; if (nvme_bdev == NULL) { SPDK_INFOLOG(bdev_ocssd, "Dropping media management event\n"); return; @@ -938,7 +933,7 @@ bdev_ocssd_notify_media_management(struct nvme_bdev_ns *nvme_ns) { struct nvme_bdev *nvme_bdev; - nvme_bdev = TAILQ_FIRST(&nvme_ns->bdevs); + nvme_bdev = nvme_ns->bdev; if (nvme_bdev != NULL) { spdk_bdev_notify_media_management(&nvme_bdev->disk); } @@ -1093,7 +1088,7 @@ bdev_ocssd_register_bdev(void *ctx) rc = spdk_bdev_register(&nvme_bdev->disk); if (spdk_likely(rc == 0)) { nvme_ns->ref++; - TAILQ_INSERT_TAIL(&nvme_ns->bdevs, nvme_bdev, tailq); + nvme_ns->bdev = nvme_bdev; } else { SPDK_ERRLOG("Failed to register bdev %s\n", nvme_bdev->disk.name); } diff --git a/module/bdev/nvme/common.h b/module/bdev/nvme/common.h index b7555d5ad..e5705fb97 100644 --- a/module/bdev/nvme/common.h +++ b/module/bdev/nvme/common.h @@ -65,7 +65,7 @@ struct nvme_bdev_ns { int ref; struct spdk_nvme_ns *ns; struct nvme_bdev_ctrlr *ctrlr; - TAILQ_HEAD(, nvme_bdev) bdevs; + struct nvme_bdev *bdev; void *type_ctx; }; @@ -117,7 +117,6 @@ struct nvme_bdev { struct spdk_bdev disk; struct nvme_bdev_ns *nvme_ns; bool opal; - TAILQ_ENTRY(nvme_bdev) tailq; }; struct nvme_bdev_poll_group { diff --git a/module/bdev/nvme/vbdev_opal.c b/module/bdev/nvme/vbdev_opal.c index 56530d0ec..2b08c6988 100644 --- a/module/bdev/nvme/vbdev_opal.c +++ b/module/bdev/nvme/vbdev_opal.c @@ -356,7 +356,7 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra opal_bdev->nvme_ctrlr = nvme_ctrlr; opal_bdev->opal_dev = nvme_ctrlr->opal_dev; - nvme_bdev = TAILQ_FIRST(&nvme_ctrlr->namespaces[nsid - 1]->bdevs); + nvme_bdev = nvme_ctrlr->namespaces[nsid - 1]->bdev; assert(nvme_bdev != NULL); base_bdev_name = nvme_bdev->disk.name; diff --git a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c index d553a8fd3..7db24feee 100644 --- a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c +++ b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c @@ -1475,7 +1475,7 @@ test_aer_cb(void) CU_ASSERT(nvme_bdev_ctrlr->namespaces[2]->populated == true); CU_ASSERT(nvme_bdev_ctrlr->namespaces[3]->populated == true); - bdev = TAILQ_FIRST(&nvme_bdev_ctrlr->namespaces[3]->bdevs); + bdev = nvme_bdev_ctrlr->namespaces[3]->bdev; SPDK_CU_ASSERT_FATAL(bdev != NULL); CU_ASSERT(bdev->disk.blockcnt == 1024); @@ -1607,7 +1607,7 @@ test_submit_nvme_cmd(void) nvme_bdev_ctrlr = nvme_bdev_ctrlr_get_by_name("nvme0"); SPDK_CU_ASSERT_FATAL(nvme_bdev_ctrlr != NULL); - bdev = TAILQ_FIRST(&nvme_bdev_ctrlr->namespaces[0]->bdevs); + bdev = nvme_bdev_ctrlr->namespaces[0]->bdev; SPDK_CU_ASSERT_FATAL(bdev != NULL); ch = spdk_get_io_channel(nvme_bdev_ctrlr); diff --git a/test/unit/lib/bdev/nvme/bdev_ocssd.c/bdev_ocssd_ut.c b/test/unit/lib/bdev/nvme/bdev_ocssd.c/bdev_ocssd_ut.c index d2b815c6b..b7cfd60b0 100644 --- a/test/unit/lib/bdev/nvme/bdev_ocssd.c/bdev_ocssd_ut.c +++ b/test/unit/lib/bdev/nvme/bdev_ocssd.c/bdev_ocssd_ut.c @@ -235,7 +235,6 @@ create_nvme_bdev_controller(const struct spdk_nvme_transport_id *trid, const cha nvme_bdev_ctrlr->namespaces[nsid]->id = nsid + 1; nvme_bdev_ctrlr->namespaces[nsid]->ctrlr = nvme_bdev_ctrlr; nvme_bdev_ctrlr->namespaces[nsid]->type = NVME_BDEV_NS_OCSSD; - TAILQ_INIT(&nvme_bdev_ctrlr->namespaces[nsid]->bdevs); bdev_ocssd_populate_namespace(nvme_bdev_ctrlr, nvme_bdev_ctrlr->namespaces[nsid], NULL); }