Blame SOURCES/0004-nvme-topology-scan-all-controllers-in-scan_subsystem.patch

1b38b6
From ce9d818f420af6be0801004a77e91915587fc02f Mon Sep 17 00:00:00 2001
1b38b6
From: Hannes Reinecke <hare@suse.de>
1b38b6
Date: Tue, 22 Jun 2021 13:48:36 +0200
1b38b6
Subject: [PATCH] nvme-topology: scan all controllers in scan_subsystem()
1b38b6
1b38b6
When a controller is unavailable or resetting during scan_subsystem()
1b38b6
we should be checking all available controllers for this namespace
1b38b6
to avoid a spurious failure.
1b38b6
1b38b6
Signed-off-by: Hannes Reinecke <hare@suse.de>
1b38b6
---
1b38b6
 nvme-topology.c | 21 ++++++++++++---------
1b38b6
 1 file changed, 12 insertions(+), 9 deletions(-)
1b38b6
1b38b6
diff --git a/nvme-topology.c b/nvme-topology.c
1b38b6
index 47121e4..6d2edaa 100644
1b38b6
--- a/nvme-topology.c
1b38b6
+++ b/nvme-topology.c
1b38b6
@@ -155,23 +155,23 @@ static int scan_namespace(struct nvme_namespace *n)
1b38b6
 		return ret;
1b38b6
 
1b38b6
 	fd = open(path, O_RDONLY);
1b38b6
-	if (fd < 0)
1b38b6
+	if (fd < 0) {
1b38b6
+		ret = fd;
1b38b6
 		goto free;
1b38b6
-
1b38b6
+	}
1b38b6
 	if (!n->nsid) {
1b38b6
-		n->nsid = nvme_get_nsid(fd);
1b38b6
-		if (n->nsid < 0)
1b38b6
+		ret = nvme_get_nsid(fd);
1b38b6
+		if (ret < 0)
1b38b6
 			goto close_fd;
1b38b6
+		n->nsid = ret;
1b38b6
 	}
1b38b6
 
1b38b6
 	ret = nvme_identify_ns(fd, n->nsid, 0, &n->ns);
1b38b6
-	if (ret < 0)
1b38b6
-		goto close_fd;
1b38b6
 close_fd:
1b38b6
 	close(fd);
1b38b6
 free:
1b38b6
 	free(path);
1b38b6
-	return 0;
1b38b6
+	return ret;
1b38b6
 }
1b38b6
 
1b38b6
 static char *get_nvme_ctrl_path_ana_state(char *path, int nsid)
1b38b6
@@ -382,8 +382,11 @@ static int scan_subsystem(struct nvme_subsystem *s, __u32 ns_instance, int nsid)
1b38b6
 		for (i = 0; i < s->nr_namespaces; i++) {
1b38b6
 			n = &s->namespaces[i];
1b38b6
 			n->name = strdup(ns[i]->d_name);
1b38b6
-			n->ctrl = &s->ctrls[0];
1b38b6
-			scan_namespace(n);
1b38b6
+			for (j = 0; j < s->nr_ctrls; j++) {
1b38b6
+				n->ctrl = &s->ctrls[j];
1b38b6
+				if (!scan_namespace(n))
1b38b6
+					break;
1b38b6
+			}
1b38b6
 		}
1b38b6
 	} else {
1b38b6
 		i = s->nr_namespaces;
1b38b6
-- 
1b38b6
2.27.0
1b38b6