Skip to content

Commit 95d56cd

Browse files
committed
unique_fs: detect unassembled RAID arrays in verify-unique-fs-label
1 parent bb0cf1c commit 95d56cd

3 files changed

Lines changed: 26 additions & 0 deletions

File tree

docs/release-notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Major changes:
1212
Minor changes:
1313

1414
- verify-unique-fs-label: Fix false failure on RAID1 mirrored boot setups
15+
- verify-unique-fs-label: Improve diagnostics for unassembled RAID arrays
1516

1617
Internal changes:
1718

src/bin/rdcore/unique_fs.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ 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+
// rereadpt already done by get_filesystems_with_label above
26+
let raid_members = get_raid_members_with_label(&config.label, false)?;
27+
if !raid_members.is_empty() {
28+
bail!(
29+
"No assembled filesystem labeled '{}', but found RAID member \
30+
devices {:?}. Is the RAID array degraded or failed to assemble?",
31+
config.label,
32+
raid_members
33+
);
34+
}
35+
}
2436
bail!(
2537
"System has {} devices with a filesystem labeled '{}': {:?}",
2638
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)