diff --git a/0001-pid1-Do-not-update-state-for-device-units-being-proc.patch b/0001-pid1-Do-not-update-state-for-device-units-being-proc.patch new file mode 100644 index 0000000..3eb817a --- /dev/null +++ b/0001-pid1-Do-not-update-state-for-device-units-being-proc.patch @@ -0,0 +1,97 @@ +From 3a1ea280dd3c8c70b616467f4fd375cf2e4d31fa Mon Sep 17 00:00:00 2001 +From: Ryan Wilson +Date: Sat, 23 Nov 2024 20:30:31 -0800 +Subject: [PATCH] pid1: Do not update state for device units being processed by + udev + +--- + src/core/device.c | 40 ++++++++++++++++++++++++++++++++++++---- + src/core/device.h | 1 + + 2 files changed, 37 insertions(+), 4 deletions(-) + +diff --git a/src/core/device.c b/src/core/device.c +index d8567676a7..d13140759d 100644 +--- a/src/core/device.c ++++ b/src/core/device.c +@@ -334,6 +334,11 @@ static int device_coldplug(Unit *u) { + static void device_catchup(Unit *u) { + Device *d = ASSERT_PTR(DEVICE(u)); + ++ if (d->enumerated_udev_processing) { ++ log_unit_debug(u, "Device is being processed by systemd-udevd. Skipping updating state."); ++ return; ++ } ++ + /* Second, let's update the state with the enumerated state */ + device_update_found_one(d, d->enumerated_found, DEVICE_FOUND_MASK); + } +@@ -742,6 +747,14 @@ static bool device_is_ready(sd_device *dev) { + + assert(dev); + ++ r = device_is_processed(dev); ++ if (r < 0) ++ log_device_warning_errno(dev, r, "Failed to check if device is processed, assuming device is processed: %m"); ++ if (r == 0) { ++ log_device_debug(dev, "Device busy: device is currently being processed"); ++ return false; ++ } ++ + if (device_for_action(dev, SD_DEVICE_REMOVE)) + return false; + +@@ -1051,16 +1064,35 @@ static void device_enumerate(Manager *m) { + _cleanup_set_free_ Set *ready_units = NULL, *not_ready_units = NULL; + Device *d; + +- if (device_is_processed(dev) <= 0) ++ r = device_setup_units(m, dev, &ready_units, ¬_ready_units); ++ if (r < 0) { ++ log_device_debug_errno(dev, r, "Failed to set up device units: %m"); + continue; ++ } + +- if (device_setup_units(m, dev, &ready_units, ¬_ready_units) < 0) ++ r = device_is_processed(dev); ++ if (r < 0) ++ log_device_warning_errno(dev, r, "Failed to determine if device is processed by systemd-udevd, assuming device is processed: %m"); ++ if (r == 0) { ++ SET_FOREACH(d, ready_units) { ++ log_unit_warning(UNIT(d), "Device unit is ready but currently processing in systemd-udevd."); ++ d->enumerated_udev_processing = true; ++ } ++ SET_FOREACH(d, not_ready_units) { ++ log_unit_debug(UNIT(d), "Device unit currently processing in systemd-udevd."); ++ d->enumerated_udev_processing = true; ++ } + continue; ++ } + +- SET_FOREACH(d, ready_units) ++ SET_FOREACH(d, ready_units) { ++ log_unit_debug(UNIT(d), "Device unit found in systemd-udevd."); + device_update_found_one(d, DEVICE_FOUND_UDEV, DEVICE_FOUND_UDEV); +- SET_FOREACH(d, not_ready_units) ++ } ++ SET_FOREACH(d, not_ready_units) { ++ log_unit_debug(UNIT(d), "Device unit not found in systemd-udevd."); + device_update_found_one(d, DEVICE_NOT_FOUND, DEVICE_FOUND_UDEV); ++ } + } + + return; +diff --git a/src/core/device.h b/src/core/device.h +index 9dd6fb57c2..14d5547c7a 100644 +--- a/src/core/device.h ++++ b/src/core/device.h +@@ -31,6 +31,7 @@ struct Device { + DeviceFound found, deserialized_found, enumerated_found; + + bool bind_mounts; ++ bool enumerated_udev_processing; + + /* The SYSTEMD_WANTS udev property for this device the last time we saw it */ + char **wants_property; +-- +2.43.5 + diff --git a/systemd.spec b/systemd.spec index be78f92..8104be0 100644 --- a/systemd.spec +++ b/systemd.spec @@ -44,7 +44,7 @@ Url: https://systemd.io # Allow users to specify the version and release when building the rpm by # setting the %%version_override and %%release_override macros. Version: %{?version_override}%{!?version_override:256.7} -Release: %{?release_override}%{!?release_override:1.6}%{?dist} +Release: %{?release_override}%{!?release_override:1.7}%{?dist} %global stable %(c="%version"; [ "$c" = "${c#*.*}" ]; echo $?) @@ -151,6 +151,9 @@ Patch0904: https://github.com/systemd/systemd/pull/34851.patch # pam_systemd: Make pam_systemd 256 backwards compatible to logind 255 Patch0905: 0001-pam_systemd-Make-pam_systemd-256-backwards-compatibl.patch +# pid1: Do not updated state for device units being processed by udev +Patch0906: 0001-pid1-Do-not-update-state-for-device-units-being-proc.patch + %endif %ifarch %{ix86} x86_64 aarch64 riscv64