Skip to contentSkip to conversation

nvme-fabrics: Fix state check in nvmf_ctlr_matches_baseopts()

PATCH Applied James Smart 3 participants 3 messages Jan 20, 2022 – Feb 3, 2022

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nvme-fabrics: Fix state check in nvmf_ctlr_matches_baseopts()

From: Uday Shankar <[email protected]>

Controller deletion/reset, immediately followed by or concurrent with a reconnect, is hard failing the connect attempt resulting in a complete loss of connectivity to the controller.

In the connect request, fabrics looks for an existing controller with the same address components and aborts the connect if a controller already exists and the duplicate connect option isn't set. The match routine filters out controllers that are dead or dying, so they don't interfere with the new connect request.

When NVME_CTRL_DELETING_NOIO was added, it missed updating the state filters in the nvmf_ctlr_matches_baseopts() routine. Thus, when in this new state, it's seen as a live controller and fails the connect request.

Correct by adding the DELETING_NIO state to the match checks.

Fixes ecca390e8056 ("nvme: fix deadlock in disconnect during scan_work and/or ana_work")
Cc <[email protected]> # v5.7+
CC Sagi Grimberg <[email protected]>
---
 drivers/nvme/host/fabrics.h | 1 +
 1 file changed, 1 insertion(+)
drivers/nvme/host/fabrics.h +1 -0
index c3203ff1c654..1e3a09cad961 100644
@@ -170,6 +170,7 @@ nvmf_ctlr_matches_baseopts(struct nvme_ctrl *ctrl,
 			struct nvmf_ctrl_options *opts)
 {
 	if (ctrl->state == NVME_CTRL_DELETING ||
+	    ctrl->state == NVME_CTRL_DELETING_NOIO ||
 	    ctrl->state == NVME_CTRL_DEAD ||
 	    strcmp(opts->subsysnqn, ctrl->opts->subsysnqn) ||
 	    strcmp(opts->host->nqn, ctrl->opts->host->nqn) ||
Signature · 1 line
2.26.2