]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevadm-trigger: also check with the original syspath if device is renamed
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 28 Oct 2022 00:06:02 +0000 (09:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 19 Jan 2023 08:58:05 +0000 (17:58 +0900)
For older kernels that synthetic UUID is not supported, we need to also
check the original device name, as udevd broadcasts uevent with new
sysname.

Fixes #25115.

src/udev/udevadm-trigger.c

index 3909fa237ca8891921da09ea93ce3ead75c36b62..40ee5085a0b992a2c766715cbf2380ec24254c89 100644 (file)
@@ -176,6 +176,32 @@ static int device_monitor_handler(sd_device_monitor *m, sd_device *dev, void *us
                 _cleanup_free_ char *saved = NULL;
 
                 saved = set_remove(settle_path_or_ids, syspath);
+                if (!saved) {
+                        const char *old_sysname;
+
+                        /* When the device is renamed, the new name is broadcast, and the old name is saved
+                         * in INTERFACE_OLD. */
+
+                        if (sd_device_get_property_value(dev, "INTERFACE_OLD", &old_sysname) >= 0) {
+                                _cleanup_free_ char *dir = NULL, *old_syspath = NULL;
+
+                                r = path_extract_directory(syspath, &dir);
+                                if (r < 0) {
+                                        log_device_debug_errno(dev, r,
+                                                               "Failed to extract directory from '%s', ignoring: %m",
+                                                               syspath);
+                                        return 0;
+                                }
+
+                                old_syspath = path_join(dir, old_sysname);
+                                if (!old_syspath) {
+                                        log_oom_debug();
+                                        return 0;
+                                }
+
+                                saved = set_remove(settle_path_or_ids, old_syspath);
+                        }
+                }
                 if (!saved) {
                         log_device_debug(dev, "Got uevent for unexpected device, ignoring.");
                         return 0;