Skip to content

Commit 33dd5a7

Browse files
authored
Merge pull request #375 from hreinecke/subsys-ns-lookup
tree: simplifiy nvme_subsystem_lookup_namespace()
2 parents ec8996e + 9393455 commit 33dd5a7

1 file changed

Lines changed: 24 additions & 18 deletions

File tree

src/nvme/tree.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,7 +1840,7 @@ nvme_ns_t nvme_scan_namespace(const char *name)
18401840
static int nvme_ctrl_scan_namespace(nvme_root_t r, struct nvme_ctrl *c,
18411841
char *name)
18421842
{
1843-
struct nvme_ns *n;
1843+
struct nvme_ns *n, *_n, *__n;
18441844

18451845
nvme_msg(r, LOG_DEBUG, "scan controller %s namespace %s\n",
18461846
c->name, name);
@@ -1854,7 +1854,11 @@ static int nvme_ctrl_scan_namespace(nvme_root_t r, struct nvme_ctrl *c,
18541854
nvme_msg(r, LOG_DEBUG, "failed to scan namespace %s\n", name);
18551855
return -1;
18561856
}
1857-
1857+
nvme_ctrl_for_each_ns_safe(c, _n, __n) {
1858+
if (strcmp(n->name, _n->name))
1859+
continue;
1860+
__nvme_free_ns(_n);
1861+
}
18581862
n->s = c->s;
18591863
n->c = c;
18601864
list_add(&c->namespaces, &n->entry);
@@ -1890,7 +1894,7 @@ static void nvme_subsystem_set_ns_path(nvme_subsystem_t s, nvme_ns_t n)
18901894
static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
18911895
char *name, nvme_scan_filter_t f, void *f_args)
18921896
{
1893-
struct nvme_ns *n;
1897+
struct nvme_ns *n, *_n, *__n;
18941898

18951899
nvme_msg(r, LOG_DEBUG, "scan subsystem %s namespace %s\n",
18961900
s->name, name);
@@ -1904,6 +1908,19 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
19041908
__nvme_free_ns(n);
19051909
return 0;
19061910
}
1911+
nvme_subsystem_for_each_ns_safe(s, _n, __n) {
1912+
struct nvme_path *p, *_p;
1913+
1914+
if (strcmp(n->name, _n->name))
1915+
continue;
1916+
/* Detach paths */
1917+
nvme_namespace_for_each_path_safe(_n, p, _p) {
1918+
list_del_init(&p->nentry);
1919+
p->n = NULL;
1920+
}
1921+
list_head_init(&_n->paths);
1922+
__nvme_free_ns(_n);
1923+
}
19071924
n->s = s;
19081925
list_add(&s->namespaces, &n->entry);
19091926
nvme_subsystem_set_ns_path(s, n);
@@ -1913,22 +1930,11 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
19131930
struct nvme_ns *nvme_subsystem_lookup_namespace(struct nvme_subsystem *s,
19141931
__u32 nsid)
19151932
{
1916-
nvme_root_t r = s->h ? s->h->r : NULL;
19171933
struct nvme_ns *n;
1918-
char *name;
1919-
int ret;
19201934

1921-
ret = asprintf(&name, "%sn%u", s->name, nsid);
1922-
if (ret < 0)
1923-
return NULL;
1924-
n = __nvme_scan_namespace(s->sysfs_dir, name);
1925-
free(name);
1926-
if (!n) {
1927-
nvme_msg(r, LOG_DEBUG, "failed to scan namespace %d\n", nsid);
1928-
return NULL;
1935+
nvme_subsystem_for_each_ns(s, n) {
1936+
if (nvme_ns_get_nsid(n) == nsid)
1937+
return n;
19291938
}
1930-
1931-
n->s = s;
1932-
list_add(&s->namespaces, &n->entry);
1933-
return n;
1939+
return NULL;
19341940
}

0 commit comments

Comments
 (0)