@@ -1840,7 +1840,7 @@ nvme_ns_t nvme_scan_namespace(const char *name)
18401840static 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)
18901894static 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,
19131930struct 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