]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: also reload udev.conf when explicitly requested
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 3 Dec 2024 19:29:13 +0000 (04:29 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 19 Dec 2024 09:57:32 +0000 (18:57 +0900)
When reloading is explicitly requested, e.g. by 'udevadm control --reload',
then also reload udev.conf.

src/udev/udev-config.c
src/udev/udev-config.h
src/udev/udev-manager.c

index eced080547086334fda26a08c90c21117d42aada..891cf925358aa05c52807d86eb0f2e4fa49549bd 100644 (file)
@@ -339,3 +339,27 @@ int manager_load(Manager *manager, int argc, char *argv[]) {
         manager_adjust_config(&manager->config);
         return 1;
 }
+
+UdevReloadFlags manager_reload_config(Manager *manager) {
+        assert(manager);
+
+        UdevConfig old = manager->config;
+
+        manager->config_by_udev_conf = UDEV_CONFIG_INIT;
+        manager_parse_udev_config(&manager->config_by_udev_conf);
+        manager_merge_config(manager);
+        log_set_max_level(manager->config.log_level);
+        manager_adjust_config(&manager->config);
+
+        if (manager->config.resolve_name_timing != old.resolve_name_timing)
+                return UDEV_RELOAD_RULES | UDEV_RELOAD_KILL_WORKERS;
+
+        if (manager->config.log_level != old.log_level ||
+            manager->config.exec_delay_usec != old.exec_delay_usec ||
+            manager->config.timeout_usec != old.timeout_usec ||
+            manager->config.timeout_signal != old.timeout_signal ||
+            manager->config.blockdev_read_only != old.blockdev_read_only)
+                return UDEV_RELOAD_KILL_WORKERS;
+
+        return 0;
+}
index 3b0997eeb07d7a422d1968ee2c8527a3b2804028..1c7a74b1067dd451eed921fbb5afddb11b7456fe 100644 (file)
@@ -27,4 +27,5 @@ typedef struct UdevConfig {
         }
 
 int manager_load(Manager *manager, int argc, char *argv[]);
+UdevReloadFlags manager_reload_config(Manager *manager);
 void udev_config_set_default_children_max(UdevConfig *c);
index c691b8ebed690ba4fddeeebb02bdfc3f96fafcdb..4fc316e1069fbd6ce82891664dd1a4a3d74779b1 100644 (file)
@@ -265,15 +265,15 @@ static void manager_reload(Manager *manager, bool force) {
         UdevReloadFlags flags = udev_builtin_should_reload();
         if (udev_rules_should_reload(manager->rules))
                 flags |= UDEV_RELOAD_RULES | UDEV_RELOAD_KILL_WORKERS;
-        if (flags == 0) {
-                /* Nothing changed. It is not necessary to reload. */
-                if (!force)
-                        return;
+        if (flags == 0 && !force)
+                /* Neither .rules files nor config files for builtins e.g. .link files changed. It is not
+                 * necessary to reload configs. Note, udev.conf is not checked in the above, hence reloaded
+                 * when explicitly requested or at least one .rules file or friend is updated. */
+                return;
 
-                /* If we eat this up, then tell our service manager to just continue */
-                (void) notify_reloading_full("Skipping configuration reloading, nothing changed.");
-        } else
-                (void) notify_reloading();
+        (void) notify_reloading();
+
+        flags |= manager_reload_config(manager);
 
         if (FLAGS_SET(flags, UDEV_RELOAD_KILL_WORKERS))
                 manager_kill_workers(manager, false);