@@ -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+
770784struct 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+
18301871static 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
0 commit comments