Skip to content

Commit 70946ce

Browse files
committed
tree: make nvme_subsystem_scan_namespace() idempotent
When issuing a rescan the list of namespaces is not cleared, so just blindly adding new entries might not yield the expected result. This patch clears out old entries from the subsystem namespace list before adding new ones, ensuring that we only ever have one namespace with a given name in the list of subsystem namespaces. Signed-off-by: Hannes Reinecke <[email protected]>
1 parent 5b5acce commit 70946ce

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

src/nvme/tree.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1890,7 +1890,7 @@ static void nvme_subsystem_set_ns_path(nvme_subsystem_t s, nvme_ns_t n)
18901890
static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
18911891
char *name, nvme_scan_filter_t f, void *f_args)
18921892
{
1893-
struct nvme_ns *n;
1893+
struct nvme_ns *n, *_n, *__n;
18941894

18951895
nvme_msg(r, LOG_DEBUG, "scan subsystem %s namespace %s\n",
18961896
s->name, name);
@@ -1904,6 +1904,19 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
19041904
__nvme_free_ns(n);
19051905
return 0;
19061906
}
1907+
nvme_subsystem_for_each_ns_safe(s, _n, __n) {
1908+
struct nvme_path *p, *_p;
1909+
1910+
if (strcmp(n->name, _n->name))
1911+
continue;
1912+
/* Detach paths */
1913+
nvme_namespace_for_each_path_safe(_n, p, _p) {
1914+
list_del_init(&p->nentry);
1915+
p->n = NULL;
1916+
}
1917+
list_head_init(&_n->paths);
1918+
__nvme_free_ns(_n);
1919+
}
19071920
n->s = s;
19081921
list_add(&s->namespaces, &n->entry);
19091922
nvme_subsystem_set_ns_path(s, n);

0 commit comments

Comments
 (0)