From 39facba161aa6a9ff7c014300c59b523acb10f6e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 24 Aug 2026 22:43:35 +0900 Subject: [PATCH 1/2] udev: skip several operations if already in stopping state Especially, ignore SIGHUP in such case. Otherwise, RELOADING and READY notification may be sent to PID1, and PID1 warns about the spurious state transition. Prompted by 1aedc8fe5e8d3683413c805e79b2e7c4f5758fdb. --- src/udev/udev-manager.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 2c43d9ccc5..b204b9abfb 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -247,6 +247,9 @@ int manager_reset_kill_workers_timer(Manager *manager) { void manager_exit(Manager *manager) { assert(manager); + if (manager->exit) + return; + manager->exit = true; (void) sd_notify(/* unset_environment= */ false, NOTIFY_STOPPING_MESSAGE); @@ -277,6 +280,9 @@ void notify_ready(Manager *manager) { assert(manager); + if (manager->exit) + return; + r = sd_notifyf(/* unset_environment= */ false, "READY=1\n" "STATUS=Processing with %u children at max", manager->config.children_max); @@ -292,6 +298,9 @@ void manager_reload(Manager *manager, bool force) { assert(manager); + if (manager->exit) + return; + assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &now_usec) >= 0); if (!force && now_usec < usec_add(manager->last_usec, 3 * USEC_PER_SEC)) /* check for changed config, every 3 seconds at most */ From 474522edb08ff801cd487b2573335eec3c3e8194 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 24 Aug 2026 22:56:37 +0900 Subject: [PATCH 2/2] network: refuse reloading if already stopping or restarting Otherwise, if reloading is requested after SIGTERM/SIGINT is received, a new operation may be started, e.g. creating a new netdev or so, and that will easily fail and may cause spurious network state. Also, send STOPPING notification to the service manager when received SIGTERM/SIGINT. --- src/network/networkd-manager.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 64e022a674..a1bc5c4691 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -515,6 +515,8 @@ static int manager_stop(Manager *manager, ManagerState state) { assert_not_reached(); } + (void) sd_notify(/* unset_environment= */ false, NOTIFY_STOPPING_MESSAGE); + manager->state = state; Link *link; @@ -1273,6 +1275,9 @@ int manager_reload(Manager *m, sd_bus_message *message, sd_varlink *varlink, boo assert(m); assert(!message || !varlink); /* D-Bus and Varlink callers are mutually exclusive */ + if (m->state != MANAGER_RUNNING) + return -ESHUTDOWN; /* Refuse reloading if we are stopping or restarting. */ + log_debug("Reloading..."); (void) notify_reloading();