|
|
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 |
|