From 9a7732c2030b2817d730012012956734b11fd8bd Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 3 Nov 2021 12:24:50 -0700 Subject: [PATCH] nvme: Free inactive namespaces during spdk_nvme_ctrlr_reset This is the only time where we're allowed to invalidate namespace handles, so use this opportunity to release inactive ones. Change-Id: I53626ddf30e48e04207078fe406ec6e02138ac9f Signed-off-by: Ben Walker Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10103 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_ctrlr.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 60bb27fe4..08a42b31f 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1714,6 +1714,7 @@ nvme_ctrlr_reset_pre(struct spdk_nvme_ctrlr *ctrlr) int spdk_nvme_ctrlr_reconnect_poll_async(struct spdk_nvme_ctrlr *ctrlr) { + struct spdk_nvme_ns *ns, *tmp_ns; struct spdk_nvme_qpair *qpair; int rc = 0, rc_tmp = 0; bool async; @@ -1754,6 +1755,17 @@ spdk_nvme_ctrlr_reconnect_poll_async(struct spdk_nvme_ctrlr *ctrlr) } } + /* + * Take this opportunity to remove inactive namespaces. During a reset namespace + * handles can be invalidated. + */ + RB_FOREACH_SAFE(ns, nvme_ns_tree, &ctrlr->ns, tmp_ns) { + if (!ns->active) { + RB_REMOVE(nvme_ns_tree, &ctrlr->ns, ns); + spdk_free(ns); + } + } + if (rc) { nvme_ctrlr_fail(ctrlr, false); }