diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 20fd3fa93..ecc7dd8e9 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -963,17 +963,18 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); - if (ctrlr->is_resetting || ctrlr->is_failed) { + if (ctrlr->is_resetting || ctrlr->is_removed) { /* - * Controller is already resetting or has failed. Return + * Controller is already resetting or has been removed. Return * immediately since there is no need to kick off another * reset in these cases. */ nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); - return 0; + return ctrlr->is_resetting ? 0 : -ENXIO; } ctrlr->is_resetting = true; + ctrlr->is_failed = false; SPDK_NOTICELOG("resetting controller\n"); @@ -1031,10 +1032,10 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) } out: - ctrlr->is_resetting = false; if (rc) { nvme_ctrlr_fail(ctrlr, false); } + ctrlr->is_resetting = false; nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index 1cab0b218..7d113ecfa 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -441,8 +441,10 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ int32_t i; struct nvme_request *req, *tmp; - if (qpair->ctrlr->is_failed) { - nvme_qpair_abort_reqs(qpair, 1 /* do not retry */); + if (spdk_unlikely(qpair->ctrlr->is_failed)) { + if (qpair->ctrlr->is_removed) { + nvme_qpair_abort_reqs(qpair, 1 /* Do not retry */); + } return 0; }