| From 6a51abdeb259a56d95f13cc67e3a0838bcda0377 Mon Sep 17 00:00:00 2001 |
| From: Uday Shankar <ushankar@purestorage.com> |
| Date: Thu, 20 Jan 2022 12:17:37 -0800 |
| Subject: nvme-fabrics: fix state check in nvmf_ctlr_matches_baseopts() |
| |
| From: Uday Shankar <ushankar@purestorage.com> |
| |
| commit 6a51abdeb259a56d95f13cc67e3a0838bcda0377 upstream. |
| |
| 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: <stable@vger.kernel.org> # v5.7+ |
| Signed-off-by: Uday Shankar <ushankar@purestorage.com> |
| Reviewed-by: James Smart <jsmart2021@gmail.com> |
| Reviewed-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/nvme/host/fabrics.h | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/nvme/host/fabrics.h |
| +++ b/drivers/nvme/host/fabrics.h |
| @@ -153,6 +153,7 @@ nvmf_ctlr_matches_baseopts(struct nvme_c |
| 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) || |