diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 28542764a..4031266a9 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -993,8 +993,6 @@ create_ctrlr(struct spdk_nvme_ctrlr *ctrlr, sizeof(struct nvme_io_channel), name); - nvme_ctrlr_create_bdevs(nvme_bdev_ctrlr); - nvme_bdev_ctrlr->adminq_timer_poller = spdk_poller_register(bdev_nvme_poll_adminq, ctrlr, g_opts.nvme_adminq_poll_period_us); @@ -1019,6 +1017,7 @@ static void attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts) { + struct nvme_bdev_ctrlr *nvme_bdev_ctrlr; struct nvme_probe_ctx *ctx = cb_ctx; char *name = NULL; uint32_t prchk_flags = 0; @@ -1044,6 +1043,15 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, create_ctrlr(ctrlr, name, trid, prchk_flags); + nvme_bdev_ctrlr = nvme_bdev_ctrlr_get(trid); + if (!nvme_bdev_ctrlr) { + SPDK_ERRLOG("Failed to find new NVMe controller\n"); + free(name); + return; + } + + nvme_ctrlr_create_bdevs(nvme_bdev_ctrlr); + free(name); } @@ -1205,6 +1213,8 @@ bdev_nvme_create_and_get_bdev_names(struct spdk_nvme_ctrlr *ctrlr, return -1; } + nvme_ctrlr_create_bdevs(nvme_bdev_ctrlr); + /* * Report the new bdevs that were created in this call. * There can be more than one bdev per NVMe controller since one bdev is created per namespace. @@ -1384,6 +1394,7 @@ spdk_bdev_nvme_delete(const char *name) static int bdev_nvme_library_init(void) { + struct nvme_bdev_ctrlr *nvme_bdev_ctrlr; struct spdk_conf_section *sp; const char *val; int rc = 0; @@ -1544,6 +1555,15 @@ bdev_nvme_library_init(void) if (rc) { goto end; } + + nvme_bdev_ctrlr = nvme_bdev_ctrlr_get(&probe_ctx->trids[i]); + if (!nvme_bdev_ctrlr) { + SPDK_ERRLOG("Failed to find new NVMe controller\n"); + rc = -ENODEV; + goto end; + } + + nvme_ctrlr_create_bdevs(nvme_bdev_ctrlr); } else { local_nvme_num++; }