@@ -9,14 +9,14 @@ use nix::errno::Errno;
99use pin_utils:: core_reexport:: fmt:: Formatter ;
1010
1111use spdk_rs:: libspdk:: {
12- bdev_aio_rescan, spdk_bdev_update_bs_blockcnt , spdk_blob_store , spdk_bs_free_cluster_count ,
13- spdk_bs_get_cluster_size , spdk_bs_get_max_growable_size , spdk_bs_get_md_len ,
14- spdk_bs_get_page_size , spdk_bs_get_used_md , spdk_bs_total_data_cluster_count , spdk_lvol ,
15- spdk_lvol_opts , spdk_lvol_opts_init , spdk_lvol_store , spdk_lvs_grow_live ,
16- vbdev_get_lvol_store_by_name , vbdev_get_lvol_store_by_uuid , vbdev_get_lvs_bdev_by_lvs ,
17- vbdev_lvol_create_with_opts , vbdev_lvs_create , vbdev_lvs_create_with_uuid , vbdev_lvs_destruct ,
18- vbdev_lvs_import , vbdev_lvs_unload , LVOL_CLEAR_WITH_NONE , LVOL_CLEAR_WITH_UNMAP ,
19- LVS_CLEAR_WITH_NONE ,
12+ bdev_aio_rescan, bdev_uring_rescan , spdk_bdev_update_bs_blockcnt , spdk_blob_store ,
13+ spdk_bs_free_cluster_count , spdk_bs_get_cluster_size , spdk_bs_get_max_growable_size ,
14+ spdk_bs_get_md_len , spdk_bs_get_page_size , spdk_bs_get_used_md ,
15+ spdk_bs_total_data_cluster_count , spdk_lvol , spdk_lvol_opts , spdk_lvol_opts_init ,
16+ spdk_lvol_store , spdk_lvs_grow_live , vbdev_get_lvol_store_by_name ,
17+ vbdev_get_lvol_store_by_uuid , vbdev_get_lvs_bdev_by_lvs , vbdev_lvol_create_with_opts ,
18+ vbdev_lvs_create , vbdev_lvs_create_with_uuid , vbdev_lvs_destruct , vbdev_lvs_import ,
19+ vbdev_lvs_unload , LVOL_CLEAR_WITH_NONE , LVOL_CLEAR_WITH_UNMAP , LVS_CLEAR_WITH_NONE ,
2020} ;
2121use url:: Url ;
2222
@@ -443,7 +443,7 @@ impl Lvs {
443443 Byte :: from_str ( & param) . map_err ( |error| LvsError :: MaxExpansionParse {
444444 msg : format ! ( "Failed to parse max_expansion {param} as bytes: {error}" ) ,
445445 } ) ?;
446- expand_bytes. as_u64 ( ) as f64 / capacity as f64
446+ ( expand_bytes. as_u64 ( ) as f64 / capacity as f64 ) . ceil ( )
447447 } else {
448448 return Err ( LvsError :: MaxExpansionParse {
449449 msg : format ! ( "Max expansion factor {param} does not end with x or B" ) ,
@@ -880,6 +880,7 @@ impl Lvs {
880880 #[ tracing:: instrument( level = "debug" , err) ]
881881 pub async fn grow ( & self ) -> Result < ( ) , LvsError > {
882882 info ! ( "{self:?}: growing lvs..." ) ;
883+ let lvs_name = self . name ( ) ;
883884
884885 let disk_bdev = self
885886 . base_bdev ( )
@@ -893,35 +894,34 @@ impl Lvs {
893894 source,
894895 uri : uri_str. to_string ( ) ,
895896 } ,
896- name : self . name ( ) . to_string ( ) ,
897+ name : lvs_name . to_string ( ) ,
897898 } ) ?;
898899
899- if url. scheme ( ) != "malloc" {
900- let bdev = disk_bdev. name ( ) . into_cstring ( ) ;
901- info ! (
902- "Attempting to rescan bdev {:?} part of lvs {:?}" ,
903- bdev,
904- self . name( ) ,
905- ) ;
900+ let bdev = disk_bdev. name ( ) . into_cstring ( ) ;
901+ info ! ( "Attempting to rescan bdev: {uri_str} part of lvs {lvs_name}" ) ;
906902
907- let errno = unsafe { bdev_aio_rescan ( bdev. as_ptr ( ) as * mut std:: os:: raw:: c_char ) } ;
903+ // Performs a rescan only for uring or aio devices, this is a no-op for other device types.
904+ let errno = match url. scheme ( ) {
905+ "uring" => unsafe { bdev_uring_rescan ( bdev. as_ptr ( ) . cast ( ) ) } ,
906+ "aio" => unsafe { bdev_aio_rescan ( bdev. as_ptr ( ) . cast ( ) ) } ,
907+ _ => 0 ,
908+ } ;
908909
909- if errno != 0 {
910- return Err ( LvsError :: BdevRescanFailed {
911- source : BsError :: from_i32 ( errno) ,
912- name : self . base_bdev ( ) . name ( ) . to_string ( ) ,
913- } ) ;
914- }
910+ if errno != 0 {
911+ return Err ( LvsError :: BdevRescanFailed {
912+ source : BsError :: from_i32 ( errno) ,
913+ name : self . base_bdev ( ) . name ( ) . to_string ( ) ,
914+ } ) ;
915+ }
915916
916- if self . encrypted ( ) && !self . crypto_vbdev_resized ( ) . await {
917- error ! (
918- "crypto bdev {} has not resized" ,
919- self . base_bdev( ) . name( ) . to_string( )
920- ) ;
921- return Err ( LvsError :: CryptoBdevNotResized {
922- name : self . base_bdev ( ) . name ( ) . to_string ( ) ,
923- } ) ;
924- }
917+ if self . encrypted ( ) && !self . crypto_vbdev_resized ( ) . await {
918+ error ! (
919+ "crypto bdev {} has not resized" ,
920+ self . base_bdev( ) . name( ) . to_string( )
921+ ) ;
922+ return Err ( LvsError :: CryptoBdevNotResized {
923+ name : self . base_bdev ( ) . name ( ) . to_string ( ) ,
924+ } ) ;
925925 }
926926
927927 let capacity_before_grow = self . capacity ( ) ;
@@ -942,7 +942,7 @@ impl Lvs {
942942 . expect ( "callback gone while growing lvs" )
943943 . to_result ( |e| LvsError :: Grow {
944944 source : BsError :: from_i32 ( e) ,
945- name : self . name ( ) . to_string ( ) ,
945+ name : lvs_name . to_string ( ) ,
946946 } ) ?;
947947
948948 if self . capacity ( ) == capacity_before_grow {
@@ -961,7 +961,7 @@ impl Lvs {
961961 /// operation completes before proceeding, we wait briefly for the crypto bdev to update.
962962 /// This delay gives the crypto bdev time to process the resize event asynchronously.
963963 async fn crypto_vbdev_resized ( & self ) -> bool {
964- for _i in 1 ..=6 {
964+ for _i in 1 ..=30 {
965965 let base_bdev = self . base_bdev ( ) ;
966966 let disk_bdev = base_bdev
967967 . crypto_base_bdev ( )
@@ -972,7 +972,7 @@ impl Lvs {
972972 if crypto_bdev_size == disk_bdev_size {
973973 return true ;
974974 } else {
975- let rx = mayastor_sleep ( std:: time:: Duration :: from_millis ( 500 ) ) ;
975+ let rx = mayastor_sleep ( std:: time:: Duration :: from_millis ( 100 ) ) ;
976976 if rx. await . is_err ( ) {
977977 error ! ( "failed to wait for mayastor_sleep" ) ;
978978 }
0 commit comments