From ab9617a76624c43a26de7e94424088ae171ebfef Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 7 Aug 2023 16:36:26 +0200 Subject: [PATCH] shutdown: handle gracefully if MD_LEVEL udev propery is not set See: #28490 --- src/shutdown/detach-md.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/shutdown/detach-md.c b/src/shutdown/detach-md.c index 2dbb866902..cf3130d4a7 100644 --- a/src/shutdown/detach-md.c +++ b/src/shutdown/detach-md.c @@ -75,20 +75,33 @@ static int md_list_get(RaidDevice **head) { RaidDevice *m; dev_t devnum; - if (sd_device_get_devnum(d, &devnum) < 0 || - sd_device_get_devname(d, &dn) < 0) + r = sd_device_get_devname(d, &dn); + if (r < 0) { + log_device_warning_errno(d, r, "Failed to get name of enumerated device, ignoring: %m"); continue; + } - r = sd_device_get_property_value(d, "MD_LEVEL", &md_level); + r = sd_device_get_devnum(d, &devnum); if (r < 0) { - log_warning_errno(r, "Failed to get MD_LEVEL property for %s, ignoring: %m", dn); + log_device_warning_errno(d, r, "Failed to get devno of enumerated device '%s', ignoring device: %m", dn); continue; } - /* MD "containers" are a special type of MD devices, used for external metadata. Since it - * doesn't provide RAID functionality in itself we don't need to stop it. */ - if (streq(md_level, "container")) + /* MD "containers" are a special type of MD devices, used for external metadata. Since they + * don't provide RAID functionality in themselves we don't need to stop them. Note that the + * MD_LEVEL udev property is set by mdadm in userspace, which is an optional package. Hence + * let's handle gracefully if the property is missing. */ + + r = sd_device_get_property_value(d, "MD_LEVEL", &md_level); + if (r < 0) + log_device_full_errno(d, + r == -ENOENT ? LOG_DEBUG : LOG_WARNING, + r, + "Failed to get MD_LEVEL property for %s, assuming regular MD device, not a container: %m", dn); + else if (streq(md_level, "container")) { + log_device_debug(d, "Skipping MD device '%s' because it is a container MD device.", dn); continue; + } p = strdup(dn); if (!p) -- 2.25.1