File 0012-fabrics-Avoid-nvme_scan_ctrl-when-disconnecting.patch of Package nvme-cli.26591

From: Daniel Wagner <dwagner@suse.de>
Date: Tue, 19 Jul 2022 11:53:12 +0200
Subject: fabrics: Avoid nvme_scan_ctrl when disconnecting
Git-commit: 40d7cc0050d0c0dd06ac76880c2a81ecf25eb796
References: git-fixes

In certain corner cases, the kernel will not populate a nvme subsystem
but only create a nvme controller. nvme_scan_ctrl will fail in such
scenarios to find the controller object. Let's do the lookup based on
the ctrl name only.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 fabrics.c |   22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

--- a/fabrics.c
+++ b/fabrics.c
@@ -902,6 +902,23 @@ int nvmf_connect(const char *desc, int a
 	return errno;
 }
 
+static nvme_ctrl_t lookup_nvme_ctrl(nvme_root_t r, const char *name)
+{
+	nvme_host_t h;
+	nvme_subsystem_t s;
+	nvme_ctrl_t c;
+
+	nvme_for_each_host(r, h) {
+		nvme_for_each_subsystem(h, s) {
+			nvme_subsystem_for_each_ctrl(s, c) {
+				if (!strcmp(nvme_ctrl_get_name(c), name))
+					return c;
+			}
+		}
+	}
+	return NULL;
+}
+
 int nvmf_disconnect(const char *desc, int argc, char **argv)
 {
 	const char *device = "nvme device handle";
@@ -979,11 +996,10 @@ int nvmf_disconnect(const char *desc, in
 		while ((p = strsep(&d, ",")) != NULL) {
 			if (!strncmp(p, "/dev/", 5))
 				p += 5;
-			c = nvme_scan_ctrl(r, p);
+			c = lookup_nvme_ctrl(r, p);
 			if (!c) {
 				fprintf(stderr,
-					"Did not find device %s: %s\n",
-					p, nvme_strerror(errno));
+					"Did not find device %s\n", p);
 				nvme_free_tree(r);
 				return errno;
 			}
openSUSE Build Service is sponsored by