Skip to content

Commit 8ab2ba6

Browse files
authored
Merge pull request #283 from hreinecke/ana-path
tree: add nvme_ctrl_get_ana_state()
2 parents 9878550 + 7b23205 commit 8ab2ba6

3 files changed

Lines changed: 53 additions & 1 deletion

File tree

src/libnvme.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ LIBNVME_1_0 {
1212
nvme_ctrl_first_ns;
1313
nvme_ctrl_first_path;
1414
nvme_ctrl_get_address;
15+
nvme_ctrl_get_ana_state;
1516
nvme_ctrl_get_dhchap_key;
1617
nvme_ctrl_get_discovery_ctrl;
1718
nvme_ctrl_get_fd;

src/nvme/tree.c

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,8 @@ static int nvme_subsystem_scan_namespaces(nvme_root_t r, nvme_subsystem_t s)
462462
}
463463

464464
for (i = 0; i < num_ns; i++) {
465-
ret = nvme_subsystem_scan_namespace(r, s, namespaces[i]->d_name);
465+
ret = nvme_subsystem_scan_namespace(r, s,
466+
namespaces[i]->d_name);
466467
if (ret < 0)
467468
nvme_msg(r, LOG_DEBUG,
468469
"failed to scan namespace %s: %s\n",
@@ -767,6 +768,19 @@ const char *nvme_ctrl_get_host_iface(nvme_ctrl_t c)
767768
return c->cfg.host_iface;
768769
}
769770

771+
const char *nvme_ctrl_get_ana_state(nvme_ctrl_t c, __u32 nsid)
772+
{
773+
if (nsid != NVME_NSID_ALL) {
774+
nvme_path_t p;
775+
776+
nvme_ctrl_for_each_path(c, p) {
777+
if (p->n && p->n->nsid == nsid)
778+
return p->ana_state;
779+
}
780+
}
781+
return NULL;
782+
}
783+
770784
struct nvme_fabrics_config *nvme_ctrl_get_config(nvme_ctrl_t c)
771785
{
772786
return &c->cfg;
@@ -1367,6 +1381,7 @@ nvme_ctrl_t nvme_scan_ctrl(nvme_root_t r, const char *name)
13671381
errno = ENOMEM;
13681382
return NULL;
13691383
}
1384+
13701385
c = nvme_ctrl_alloc(r, s, path, name);
13711386
if (!c) {
13721387
free(path);
@@ -1827,6 +1842,32 @@ static int nvme_ctrl_scan_namespace(nvme_root_t r, struct nvme_ctrl *c,
18271842
return 0;
18281843
}
18291844

1845+
static void nvme_subsystem_set_ns_path(nvme_subsystem_t s, nvme_ns_t n)
1846+
{
1847+
nvme_ctrl_t c;
1848+
nvme_path_t p;
1849+
int ns_ctrl, ns_nsid, ret;
1850+
1851+
ret = sscanf(nvme_ns_get_name(n), "nvme%dn%d", &ns_ctrl, &ns_nsid);
1852+
if (ret != 2)
1853+
return;
1854+
1855+
nvme_subsystem_for_each_ctrl(s, c) {
1856+
nvme_ctrl_for_each_path(c, p) {
1857+
int p_subsys, p_ctrl, p_nsid;
1858+
1859+
ret = sscanf(nvme_path_get_name(p), "nvme%dc%dn%d",
1860+
&p_subsys, &p_ctrl, &p_nsid);
1861+
if (ret != 3)
1862+
continue;
1863+
if (ns_ctrl == p_subsys && ns_nsid == p_nsid) {
1864+
list_add(&n->paths, &p->nentry);
1865+
p->n = n;
1866+
}
1867+
}
1868+
}
1869+
}
1870+
18301871
static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
18311872
char *name)
18321873
{
@@ -1840,6 +1881,7 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
18401881

18411882
n->s = s;
18421883
list_add(&s->namespaces, &n->entry);
1884+
nvme_subsystem_set_ns_path(s, n);
18431885
return 0;
18441886
}
18451887

src/nvme/tree.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,15 @@ const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c);
836836
*/
837837
const char *nvme_ctrl_get_host_iface(nvme_ctrl_t c);
838838

839+
/**
840+
* nvme_ctrl_get_ana_state() - ANA state of a controller path
841+
* @c: Constroller instance
842+
* @nsid: Namespace ID to evaluate
843+
*
844+
* Return: ANA state of the namespace @nsid on controller @c.
845+
*/
846+
const char *nvme_ctrl_get_ana_state(nvme_ctrl_t c, __u32 nsid);
847+
839848
/**
840849
* nvme_ctrl_get_dhchap_key() - Return controller key
841850
* @c: Controller for which the key should be set

0 commit comments

Comments
 (0)