diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index e55337220..e5f36e2e8 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -533,6 +533,7 @@ spdk_nvme_ctrlr_free_io_qpair(struct spdk_nvme_qpair *qpair) } /* Do not retry. */ + nvme_qpair_set_state(qpair, NVME_QPAIR_DESTROYING); nvme_qpair_abort_reqs(qpair, 1); nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 8dc442285..1047459bd 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -362,6 +362,7 @@ enum nvme_qpair_state { NVME_QPAIR_CONNECTED, NVME_QPAIR_ENABLING, NVME_QPAIR_ENABLED, + NVME_QPAIR_DESTROYING, }; struct spdk_nvme_qpair { diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index 5d30076ea..a89d107c5 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -726,7 +726,8 @@ nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *re int rc; /* This prevents us from entering an infinite loop when freeing queued I/O in disconnect. */ - if (spdk_unlikely(nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING)) { + if (spdk_unlikely(nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING || + nvme_qpair_get_state(qpair) == NVME_QPAIR_DESTROYING)) { return -ENXIO; }