Skip to content

Commit 0b1b003

Browse files
committed
unique_fs: detect unassembled RAID arrays in verify-unique-fs-label
1 parent 0b8c4f2 commit 0b1b003

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

src/bin/rdcore/unique_fs.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ pub fn verify_unique_fs(config: VerifyUniqueFsLabelConfig) -> Result<()> {
2121
let pts = get_filesystems_with_label(&config.label, config.rereadpt)?;
2222
let count = pts.len();
2323
if count != 1 {
24+
if count == 0 {
25+
let raid_members = get_raid_members_with_label(&config.label, config.rereadpt)?;
26+
if !raid_members.is_empty() {
27+
bail!(
28+
"No assembled filesystem labeled '{}', but found RAID member \
29+
devices {:?}. Is the RAID array degraded or failed to assemble?",
30+
config.label,
31+
raid_members
32+
);
33+
}
34+
}
2435
bail!(
2536
"System has {} devices with a filesystem labeled '{}': {:?}",
2637
count,

src/blockdev.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,19 @@ pub fn get_filesystems_with_label(label: &str, rereadpt: bool) -> Result<Vec<Str
882882
Ok(result)
883883
}
884884

885+
/// Returns RAID member devices with the given filesystem label.
886+
/// Used to produce better diagnostics when an expected filesystem is missing
887+
/// but RAID members carrying its label exist (e.g. array failed to assemble).
888+
pub fn get_raid_members_with_label(label: &str, rereadpt: bool) -> Result<Vec<String>> {
889+
let result = get_all_filesystems(rereadpt)?
890+
.iter()
891+
.filter(|v| v.get("LABEL").map(|l| l.as_str()) == Some(label))
892+
.filter(|v| v.get("USAGE").map(|u| u.as_str()) == Some("raid"))
893+
.filter_map(|v| v.get("NAME").map(<_>::to_owned))
894+
.collect();
895+
Ok(result)
896+
}
897+
885898
pub fn lsblk(dev: &Path, with_deps: bool) -> Result<Vec<HashMap<String, String>>> {
886899
let mut cmd = Command::new("lsblk");
887900
// Older lsblk, e.g. in CentOS 7.6, doesn't support PATH, but --paths option

0 commit comments

Comments
 (0)