]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: introduce ID_PROCESSING=1 boolean property
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 19:34:47 +0000 (04:34 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 11 Feb 2024 16:09:21 +0000 (01:09 +0900)
This indicates that the device is being processed by udevd.

src/udev/udev-event.c
src/udev/udev-worker.c

index 4d75bf34f74766d79913f70f224d839fec9bd4bb..4541b0e0fb1ebefb093cfeea5c03aa6b48f02ff5 100644 (file)
@@ -171,6 +171,12 @@ static int rename_netif(UdevEvent *event) {
                 goto revert;
         }
 
+        r = device_add_property(event->dev_db_clone, "ID_PROCESSING", "1");
+        if (r < 0) {
+                log_device_warning_errno(event->dev_db_clone, r, "Failed to add 'ID_PROCESSING' property: %m");
+                goto revert;
+        }
+
         r = device_update_db(event->dev_db_clone);
         if (r < 0) {
                 log_device_debug_errno(event->dev_db_clone, r, "Failed to update database under /run/udev/data/: %m");
@@ -197,6 +203,7 @@ static int rename_netif(UdevEvent *event) {
 revert:
         /* Restore 'dev_db_clone' */
         (void) device_add_property(event->dev_db_clone, "ID_RENAMING", NULL);
+        (void) device_add_property(event->dev_db_clone, "ID_PROCESSING", NULL);
         (void) device_update_db(event->dev_db_clone);
 
         /* Restore 'dev' */
@@ -348,6 +355,18 @@ int udev_event_execute_rules(UdevEvent *event, UdevRules *rules) {
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to remove 'ID_RENAMING' property: %m");
 
+        /* If the database file already exists, append ID_PROCESSING property to the existing database,
+         * to indicate that the device is being processed by udevd. */
+        if (device_has_db(event->dev_db_clone) > 0) {
+                r = device_add_property(event->dev_db_clone, "ID_PROCESSING", "1");
+                if (r < 0)
+                        return log_device_warning_errno(event->dev_db_clone, r, "Failed to add 'ID_PROCESSING' property: %m");
+
+                r = device_update_db(event->dev_db_clone);
+                if (r < 0)
+                        return log_device_warning_errno(event->dev_db_clone, r, "Failed to update database under /run/udev/data/: %m");
+        }
+
         DEVICE_TRACE_POINT(rules_start, dev);
 
         r = udev_rules_apply_to_event(rules, event);
@@ -378,6 +397,15 @@ int udev_event_execute_rules(UdevEvent *event, UdevRules *rules) {
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to update tags under /run/udev/tag/: %m");
 
+        /* If the database file for the device will be created below, add ID_PROCESSING=1 to indicate that
+         * the device is still being processed by udevd, as commands specified in RUN are invoked after
+         * the database is created. See issue #30056. */
+        if (device_should_have_db(dev) && !ordered_hashmap_isempty(event->run_list)) {
+                r = device_add_property(dev, "ID_PROCESSING", "1");
+                if (r < 0)
+                        return log_device_warning_errno(dev, r, "Failed to add 'ID_PROCESSING' property: %m");
+        }
+
         r = device_update_db(dev);
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
index 63a93e53dc6d96890c60dcacc431c08420d266b6..4563d8807dd90e95f913094a17d9eb2694cad27c 100644 (file)
@@ -212,6 +212,15 @@ static int worker_process_device(UdevWorker *worker, sd_device *dev) {
                         log_device_warning_errno(dev, r, "Failed to add inotify watch, ignoring: %m");
         }
 
+        /* Finalize database. */
+        r = device_add_property(dev, "ID_PROCESSING", NULL);
+        if (r < 0)
+                return log_device_warning_errno(dev, r, "Failed to remove 'ID_PROCESSING' property: %m");
+
+        r = device_update_db(dev);
+        if (r < 0)
+                return log_device_warning_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
+
         log_device_uevent(dev, "Device processed");
         return 0;
 }