diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index b5ab2c0f2..20badddf9 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -346,16 +346,14 @@ nvme_ctrlr_set_supported_features(struct spdk_nvme_ctrlr *ctrlr) void nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove) { - struct spdk_nvme_qpair *qpair; - + /* + * Set the flag here and leave the work failure of qpairs to + * spdk_nvme_qpair_process_completions(). + */ if (hot_remove) { ctrlr->is_removed = true; } ctrlr->is_failed = true; - nvme_qpair_fail(ctrlr->adminq); - TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { - nvme_qpair_fail(qpair); - } } static void diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 9ddfb2f97..739ac17fe 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1866,6 +1866,11 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ uint32_t num_completions = 0; struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; + if (qpair->ctrlr->is_failed) { + nvme_qpair_fail(qpair); + return 0; + } + if (!nvme_pcie_qpair_check_enabled(qpair)) { /* * qpair is not enabled, likely because a controller reset is diff --git a/test/lib/nvme/unit/nvme_pcie_c/nvme_pcie_ut.c b/test/lib/nvme/unit/nvme_pcie_c/nvme_pcie_ut.c index 61f61fecb..15ba7ff9a 100644 --- a/test/lib/nvme/unit/nvme_pcie_c/nvme_pcie_ut.c +++ b/test/lib/nvme/unit/nvme_pcie_c/nvme_pcie_ut.c @@ -65,6 +65,11 @@ struct io_request { bool invalid_second_addr; }; +void +nvme_qpair_fail(struct spdk_nvme_qpair *qpair) +{ +} + void nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove) {