mount: prefer boot disk ESP and run cargo fmt

* choose ESP matching the primary data disk when multiple ESPs exist,
  falling back gracefully for single-disk layouts
* keep new helper to normalize device names and reuse the idempotent
  mount logic
* apply cargo fmt across the tree
This commit is contained in:
2025-10-10 14:49:39 +02:00
parent 5746e285b2
commit 3d14f77516
23 changed files with 447 additions and 263 deletions

View File

@@ -186,7 +186,10 @@ pub fn discover(filter: &DeviceFilter) -> Result<Vec<Disk>> {
discover_with_provider(&provider, filter)
}
fn discover_with_provider<P: DeviceProvider>(provider: &P, filter: &DeviceFilter) -> Result<Vec<Disk>> {
fn discover_with_provider<P: DeviceProvider>(
provider: &P,
filter: &DeviceFilter,
) -> Result<Vec<Disk>> {
let mut candidates = provider.list_block_devices()?;
// Probe properties if provider needs to enrich
for d in &mut candidates {
@@ -210,10 +213,15 @@ fn discover_with_provider<P: DeviceProvider>(provider: &P, filter: &DeviceFilter
.collect();
if filtered.is_empty() {
return Err(Error::Device("no eligible disks found after applying filters".to_string()));
return Err(Error::Device(
"no eligible disks found after applying filters".to_string(),
));
}
debug!("eligible disks: {:?}", filtered.iter().map(|d| &d.path).collect::<Vec<_>>());
debug!(
"eligible disks: {:?}",
filtered.iter().map(|d| &d.path).collect::<Vec<_>>()
);
Ok(filtered)
}
@@ -259,9 +267,10 @@ fn read_disk_size_bytes(name: &str) -> Result<u64> {
let p = sys_block_path(name).join("size");
let sectors = fs::read_to_string(&p)
.map_err(|e| Error::Device(format!("read {} failed: {}", p.display(), e)))?;
let sectors: u64 = sectors.trim().parse().map_err(|e| {
Error::Device(format!("parse sectors for {} failed: {}", name, e))
})?;
let sectors: u64 = sectors
.trim()
.parse()
.map_err(|e| Error::Device(format!("parse sectors for {} failed: {}", name, e)))?;
Ok(sectors.saturating_mul(512))
}
@@ -287,11 +296,7 @@ fn read_optional_string(p: PathBuf) -> Option<String> {
while s.ends_with('\n') || s.ends_with('\r') {
s.pop();
}
if s.is_empty() {
None
} else {
Some(s)
}
if s.is_empty() { None } else { Some(s) }
}
Err(_) => None,
}
@@ -324,9 +329,27 @@ mod tests {
fn filter_by_size_and_include_exclude() {
let provider = MockProvider {
disks: vec![
Disk { path: "/dev/sda".into(), size_bytes: 500 * 1024 * 1024 * 1024, rotational: true, model: None, serial: None }, // 500 GiB
Disk { path: "/dev/nvme0n1".into(), size_bytes: 128 * 1024 * 1024 * 1024, rotational: false, model: None, serial: None }, // 128 GiB
Disk { path: "/dev/loop0".into(), size_bytes: 8 * 1024 * 1024 * 1024, rotational: false, model: None, serial: None }, // 8 GiB pseudo (but mock provider supplies it)
Disk {
path: "/dev/sda".into(),
size_bytes: 500 * 1024 * 1024 * 1024,
rotational: true,
model: None,
serial: None,
}, // 500 GiB
Disk {
path: "/dev/nvme0n1".into(),
size_bytes: 128 * 1024 * 1024 * 1024,
rotational: false,
model: None,
serial: None,
}, // 128 GiB
Disk {
path: "/dev/loop0".into(),
size_bytes: 8 * 1024 * 1024 * 1024,
rotational: false,
model: None,
serial: None,
}, // 8 GiB pseudo (but mock provider supplies it)
],
};
@@ -346,7 +369,13 @@ mod tests {
fn no_match_returns_error() {
let provider = MockProvider {
disks: vec![
Disk { path: "/dev/sdb".into(), size_bytes: 50 * 1024 * 1024 * 1024, rotational: true, model: None, serial: None }, // 50 GiB
Disk {
path: "/dev/sdb".into(),
size_bytes: 50 * 1024 * 1024 * 1024,
rotational: true,
model: None,
serial: None,
}, // 50 GiB
],
};
@@ -363,4 +392,4 @@ mod tests {
other => panic!("unexpected error: {:?}", other),
}
}
}
}