Skip to content

Commit dbe2a4d

Browse files
feat(expand): adding support for uring bdev rescan
Signed-off-by: Abhilash Shetty <[email protected]>
1 parent 2ffe1e0 commit dbe2a4d

File tree

2 files changed

+37
-37
lines changed

2 files changed

+37
-37
lines changed

io-engine/src/lvs/lvs_error.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ pub enum LvsError {
275275
BdevNotExtended {
276276
name: String,
277277
},
278-
#[snafu(display("crypto bdev: {name} failed to resize"))]
278+
#[snafu(display("Failed to resize crypto bdev: {name}"))]
279279
CryptoBdevNotResized {
280280
name: String,
281281
},

io-engine/src/lvs/lvs_store.rs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ use nix::errno::Errno;
99
use pin_utils::core_reexport::fmt::Formatter;
1010

1111
use 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
};
2121
use 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

Comments
 (0)