From b50f6dbe574b0421db7dbf200ad951186382277d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 9 Apr 2025 22:10:42 +0900 Subject: [PATCH 1/3] core/socket: do not enter failed state when we cannot start service due to conflicting transaction being queued Otherwise, e.g. on soft-reboot, socket unit may enter the failed state and the socket buffer will be cleared. --- src/core/socket.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/socket.c b/src/core/socket.c index 861aaba3d4..7bff0a2d03 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -2356,6 +2356,8 @@ static void socket_enter_running(Socket *s, int cfd_in) { } r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, /* ret = */ NULL); + if (r == -EDEADLK) + return (void) log_unit_debug_errno(UNIT(s), r, "Failed to queue service startup job, ignoring: %s", bus_error_message(&error, r)); if (r < 0) goto queue_error; } From 0d1819e791a97367c2c0cead738111cfcc1e7491 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 7 Apr 2025 17:31:05 +0900 Subject: [PATCH 2/3] units: stop systemd-udevd before soft-reboot Otherwise, queued uevents may be lost on soft-reboot. Similar to f89985ca494b79b2beed47e1f10d46ef2d59ce3e, but for systemd-udevd. --- units/systemd-udevd.service.in | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/units/systemd-udevd.service.in b/units/systemd-udevd.service.in index 8e343ef836..ef604e9215 100644 --- a/units/systemd-udevd.service.in +++ b/units/systemd-udevd.service.in @@ -16,6 +16,14 @@ Before=sysinit.target Wants=systemd-udev-load-credentials.service ConditionPathIsReadWrite=/sys +# To avoid systemd-udevd being SIGKILLed during a soft reboot, +# and causing queued uevents to be lost. +# Note, typically soft-reboot.target will be never reached, +# and systemd-soft-reboot.service will trigger soft-reboot. +# Hence, this must be stopped before systemd-soft-reboot.service. +Before=soft-reboot.target systemd-soft-reboot.service +Conflicts=soft-reboot.target + [Service] CapabilityBoundingSet=~CAP_SYS_TIME CAP_WAKE_ALARM Delegate=pids From 28659e1eacbe09b75ace4b4cb07a1d5dd1eb8c66 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 9 Apr 2025 22:14:56 +0900 Subject: [PATCH 3/3] TEST-82-SOFTREBOOT: add test case for uevents generated during soft-reboot --- test/units/TEST-82-SOFTREBOOT.sh | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/test/units/TEST-82-SOFTREBOOT.sh b/test/units/TEST-82-SOFTREBOOT.sh index 9f76c86245..e0bf27342b 100755 --- a/test/units/TEST-82-SOFTREBOOT.sh +++ b/test/units/TEST-82-SOFTREBOOT.sh @@ -34,6 +34,56 @@ if [[ -L /run/nextroot ]]; then rm -f /run/nextroot fi +trigger_uevent() { + local rule=/run/udev/rules.d/99-softreboot.rules + + if [[ ! -f "$rule" ]]; then + mkdir -p /run/udev/rules.d + cat >"$rule" <