diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 0836d08f8..a4ce05f68 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -292,6 +292,7 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, size_t opts_size) { uint32_t qid; + int rc; struct spdk_nvme_qpair *qpair; union spdk_nvme_cc_register cc; struct spdk_nvme_io_qpair_opts opts; @@ -366,6 +367,15 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); return NULL; } + + rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair); + if (rc != 0) { + SPDK_ERRLOG("nvme_transport_ctrlr_connect_io_qpair() failed\n"); + nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair); + nvme_transport_ctrlr_delete_io_qpair(ctrlr, qpair); + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + return NULL; + } spdk_bit_array_clear(ctrlr->free_io_qids, qid); TAILQ_INSERT_TAIL(&ctrlr->active_io_qpairs, qpair, tailq); diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 6ce467ab6..38cd98efa 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1671,14 +1671,6 @@ nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid, return NULL; } - rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair); - - if (rc != 0) { - SPDK_ERRLOG("I/O queue creation failed\n"); - nvme_pcie_qpair_destroy(qpair); - return NULL; - } - return qpair; } diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index f44ac33f6..890553701 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1642,13 +1642,6 @@ nvme_rdma_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr, } SPDK_DEBUGLOG(SPDK_LOG_NVME, "RDMA responses allocated\n"); - rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair); - - if (rc < 0) { - nvme_rdma_ctrlr_delete_io_qpair(ctrlr, qpair); - return NULL; - } - return qpair; } @@ -1837,6 +1830,13 @@ static struct spdk_nvme_ctrlr *nvme_rdma_ctrlr_construct(const struct spdk_nvme_ return NULL; } + rc = nvme_transport_ctrlr_connect_qpair(&rctrlr->ctrlr, rctrlr->ctrlr.adminq); + if (rc < 0) { + SPDK_ERRLOG("failed to connect admin qpair\n"); + nvme_rdma_ctrlr_destruct(&rctrlr->ctrlr); + return NULL; + } + if (nvme_ctrlr_get_cap(&rctrlr->ctrlr, &cap)) { SPDK_ERRLOG("get_cap() failed\n"); nvme_ctrlr_destruct(&rctrlr->ctrlr); diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 3130255f3..3202da2cb 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -1572,12 +1572,6 @@ nvme_tcp_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr, return NULL; } - rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair); - if (rc < 0) { - nvme_tcp_ctrlr_delete_io_qpair(ctrlr, qpair); - return NULL; - } - return qpair; } @@ -1622,6 +1616,13 @@ static struct spdk_nvme_ctrlr *nvme_tcp_ctrlr_construct(const struct spdk_nvme_t return NULL; } + rc = nvme_transport_ctrlr_connect_qpair(&tctrlr->ctrlr, tctrlr->ctrlr.adminq); + if (rc < 0) { + SPDK_ERRLOG("failed to connect admin qpair\n"); + nvme_tcp_ctrlr_destruct(&tctrlr->ctrlr); + return NULL; + } + if (nvme_ctrlr_get_cap(&tctrlr->ctrlr, &cap)) { SPDK_ERRLOG("get_cap() failed\n"); nvme_ctrlr_destruct(&tctrlr->ctrlr);