]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shutdown: handle gracefully if MD_LEVEL udev propery is not set
authorLennart Poettering <lennart@poettering.net>
Mon, 7 Aug 2023 14:36:26 +0000 (16:36 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 7 Aug 2023 19:59:44 +0000 (20:59 +0100)
See: #28490

src/shutdown/detach-md.c

index 2dbb866902d2bd9a508fb71e1d08d9ec36591c5a..cf3130d4a7064d2bd9728da9a3f17bf6df510b78 100644 (file)
@@ -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)