From 10c3e1e44141f35e0d65e7ec4d4f2956c41f53b4 Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Nov 24 2024 15:40:54 +0000 Subject: Backport core/device: ignore ID_PROCESSING udev property on enumerate --- 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 deleted file mode 100644 index 3eb817a..0000000 --- a/0001-pid1-Do-not-update-state-for-device-units-being-proc.patch +++ /dev/null @@ -1,97 +0,0 @@ -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/35332.patch b/35332.patch new file mode 100644 index 0000000..731a645 --- /dev/null +++ b/35332.patch @@ -0,0 +1,117 @@ +From ca0cef28691be7ea22274c2fa7d95a2725da1ba5 Mon Sep 17 00:00:00 2001 +From: Yu Watanabe +Date: Sun, 24 Nov 2024 13:19:27 +0900 +Subject: [PATCH 1/2] core/device: ignore ID_PROCESSING udev property on + enumerate + +This partially reverts the commit 405be62f05d76f1845f347737b5972158c79dd3e +"tree-wide: refuse enumerated device with ID_PROCESSING=1". + +Otherwise, when systemd-udev-trigger.service is started just before +daemon-reexec, which can be easily happen on update, then udev database +files for many devices may have ID_PROCESSING=1 property, thus devices may +not enumerated on daemon-reexec. That causes many units especially mount +units deactivated after daemon-reexec. + +Fixes #35329. +--- + src/core/device.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/core/device.c b/src/core/device.c +index 03a730f6240c1..a8921e91c344e 100644 +--- a/src/core/device.c ++++ b/src/core/device.c +@@ -1048,9 +1048,6 @@ 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) +- continue; +- + if (device_setup_units(m, dev, &ready_units, ¬_ready_units) < 0) + continue; + + +From 388151b72103c10d63bac1e845d6a151619990ae Mon Sep 17 00:00:00 2001 +From: Yu Watanabe +Date: Sun, 24 Nov 2024 13:57:37 +0900 +Subject: [PATCH 2/2] test: add reproducer for issue #35329 + +Without the previous commit, the test case will fail. +--- + .../TEST-17-UDEV.device_is_processing.sh | 65 +++++++++++++++++++ + 1 file changed, 65 insertions(+) + create mode 100755 test/units/TEST-17-UDEV.device_is_processing.sh + +diff --git a/test/units/TEST-17-UDEV.device_is_processing.sh b/test/units/TEST-17-UDEV.device_is_processing.sh +new file mode 100755 +index 0000000000000..9b39b43238e44 +--- /dev/null ++++ b/test/units/TEST-17-UDEV.device_is_processing.sh +@@ -0,0 +1,65 @@ ++#!/usr/bin/env bash ++# SPDX-License-Identifier: LGPL-2.1-or-later ++set -ex ++set -o pipefail ++ ++# This is a reproducer of issue #35329, ++# which is a regression caused by 405be62f05d76f1845f347737b5972158c79dd3e. ++ ++IFNAME=udevtestnetif ++ ++udevadm settle ++ ++mkdir -p /run/udev/udev.conf.d/ ++cat >/run/udev/udev.conf.d/timeout.conf </run/udev/rules.d/99-testsuite.rules <