fix: retry BLKRRPART on busy device during OS install

This commit is contained in:
Aiden McClelland
2026-03-18 23:48:49 -06:00
parent bcdeabfe85
commit d669aa9afb
2 changed files with 52 additions and 10 deletions

View File

@@ -187,11 +187,32 @@ pub async fn partition(
.invoke(crate::ErrorKind::DiskManagement)
.await
.ok();
Command::new("blockdev")
.arg("--rereadpt")
.arg(&disk_path)
.invoke(crate::ErrorKind::DiskManagement)
.await?;
// BLKRRPART can fail with "Device or resource busy" if the kernel still
// holds references to old partitions. Retry a few times with a delay.
let mut last_err = None;
for attempt in 0..5u32 {
if attempt > 0 {
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
match Command::new("blockdev")
.arg("--rereadpt")
.arg(&disk_path)
.invoke(crate::ErrorKind::DiskManagement)
.await
{
Ok(_) => {
last_err = None;
break;
}
Err(e) => {
tracing::warn!("blockdev --rereadpt attempt {} failed: {e}", attempt + 1);
last_err = Some(e);
}
}
}
if let Some(e) = last_err {
return Err(e);
}
Command::new("udevadm")
.arg("settle")
.invoke(crate::ErrorKind::DiskManagement)

View File

@@ -153,11 +153,32 @@ pub async fn partition(
.invoke(crate::ErrorKind::DiskManagement)
.await
.ok();
Command::new("blockdev")
.arg("--rereadpt")
.arg(&disk_path)
.invoke(crate::ErrorKind::DiskManagement)
.await?;
// BLKRRPART can fail with "Device or resource busy" if the kernel still
// holds references to old partitions. Retry a few times with a delay.
let mut last_err = None;
for attempt in 0..5u32 {
if attempt > 0 {
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
match Command::new("blockdev")
.arg("--rereadpt")
.arg(&disk_path)
.invoke(crate::ErrorKind::DiskManagement)
.await
{
Ok(_) => {
last_err = None;
break;
}
Err(e) => {
tracing::warn!("blockdev --rereadpt attempt {} failed: {e}", attempt + 1);
last_err = Some(e);
}
}
}
if let Some(e) = last_err {
return Err(e);
}
Command::new("udevadm")
.arg("settle")
.invoke(crate::ErrorKind::DiskManagement)