diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 5d7e570aa..0627bb67e 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -3793,6 +3793,11 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) */ nvme_qpair_abort_queued_reqs(ctrlr->adminq, 0); break; + case NVME_QPAIR_DISCONNECTING: + assert(ctrlr->adminq->async == true); + break; + case NVME_QPAIR_DISCONNECTED: + /* fallthrough */ default: nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_ERROR, NVME_TIMEOUT_INFINITE); break; diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index cb1c0728e..29cc2e037 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -514,6 +514,12 @@ nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nv return 0; err: nvme_transport_connect_qpair_fail(qpair, NULL); + if (nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING) { + assert(qpair->async == true); + /* Let the caller to poll the qpair until it is actually disconnected. */ + return 0; + } + return rc; }