From 81b20a4d968d31c871aae120db438c979850a241 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 15 Oct 2019 12:28:49 -0700 Subject: [PATCH] nvme_ctrlr: Allow resets from failed state Failed is not a final state for either fabric or pcie controllers. We have historically not allowed resets in the failed state, but we should. Instead of checking for the failed state, we should check for the removed state. If the controller is removed, then we cannot even attempt a reset. Change-Id: I2c1a3d85db84f84cd1895cbfaf16575c8b496155 Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471415 Tested-by: SPDK CI Jenkins Reviewed-by: Alexey Marchuk Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/nvme/nvme_ctrlr.c | 9 +++++---- lib/nvme/nvme_qpair.c | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) 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; }