diff --git a/backport-core-mount-adjust-deserialized-state-based-on-proc-s.patch b/backport-core-mount-adjust-deserialized-state-based-on-proc-s.patch new file mode 100644 index 0000000000000000000000000000000000000000..a6af57c34b839df54c2c2482824512cef0d0947f --- /dev/null +++ b/backport-core-mount-adjust-deserialized-state-based-on-proc-s.patch @@ -0,0 +1,118 @@ +From 527724f45f4fbe75e812298ffad8128d4e29c7c2 Mon Sep 17 00:00:00 2001 +From: Yu Watanabe +Date: Wed, 6 Jul 2022 15:15:09 +0900 +Subject: [PATCH] core/mount: adjust deserialized state based on + /proc/self/mountinfo + +Fixes #23796. +Replaces #23803 and #23851. +--- + src/core/mount.c | 55 +++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 45 insertions(+), 10 deletions(-) + +diff --git a/src/core/mount.c b/src/core/mount.c +index 00482e9..0b923b1 100644 +--- a/src/core/mount.c ++++ b/src/core/mount.c +@@ -51,6 +51,9 @@ static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { + + static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata); + static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata); ++static void mount_enter_dead(Mount *m, MountResult f); ++static void mount_enter_mounted(Mount *m, MountResult f); ++static void mount_cycle_clear(Mount *m); + static int mount_process_proc_self_mountinfo(Manager *m); + + static bool MOUNT_STATE_WITH_PROCESS(MountState state) { +@@ -733,23 +736,17 @@ static void mount_set_state(Mount *m, MountState state) { + + static int mount_coldplug(Unit *u) { + Mount *m = MOUNT(u); +- MountState new_state = MOUNT_DEAD; + int r; + + assert(m); + assert(m->state == MOUNT_DEAD); + +- if (m->deserialized_state != m->state) +- new_state = m->deserialized_state; +- else if (m->from_proc_self_mountinfo) +- new_state = MOUNT_MOUNTED; +- +- if (new_state == m->state) ++ if (m->deserialized_state == m->state) + return 0; + + if (m->control_pid > 0 && + pid_is_unwaited(m->control_pid) && +- MOUNT_STATE_WITH_PROCESS(new_state)) { ++ MOUNT_STATE_WITH_PROCESS(m->deserialized_state)) { + + r = unit_watch_pid(UNIT(m), m->control_pid, false); + if (r < 0) +@@ -760,15 +757,52 @@ static int mount_coldplug(Unit *u) { + return r; + } + +- if (!IN_SET(new_state, MOUNT_DEAD, MOUNT_FAILED)) { ++ if (!IN_SET(m->deserialized_state, MOUNT_DEAD, MOUNT_FAILED)) { + (void) unit_setup_dynamic_creds(u); + (void) unit_setup_exec_runtime(u); + } + +- mount_set_state(m, new_state); ++ mount_set_state(m, m->deserialized_state); + return 0; + } + ++static void mount_catchup(Unit *u) { ++ Mount *m = MOUNT(u); ++ ++ assert(m); ++ ++ /* Adjust the deserialized state. See comments in mount_process_proc_self_mountinfo(). */ ++ if (m->from_proc_self_mountinfo) ++ switch (m->state) { ++ case MOUNT_DEAD: ++ case MOUNT_FAILED: ++ assert(m->control_pid == 0); ++ unit_acquire_invocation_id(u); ++ mount_cycle_clear(m); ++ mount_enter_mounted(m, MOUNT_SUCCESS); ++ break; ++ case MOUNT_MOUNTING: ++ assert(m->control_pid > 0); ++ mount_set_state(m, MOUNT_MOUNTING_DONE); ++ break; ++ default: ++ break; ++ } ++ else ++ switch (m->state) { ++ case MOUNT_MOUNTING_DONE: ++ assert(m->control_pid > 0); ++ mount_set_state(m, MOUNT_MOUNTING); ++ break; ++ case MOUNT_MOUNTED: ++ assert(m->control_pid == 0); ++ mount_enter_dead(m, MOUNT_SUCCESS); ++ break; ++ default: ++ break; ++ } ++} ++ + static void mount_dump(Unit *u, FILE *f, const char *prefix) { + char buf[FORMAT_TIMESPAN_MAX]; + Mount *m = MOUNT(u); +@@ -2194,6 +2228,7 @@ const UnitVTable mount_vtable = { + .done = mount_done, + + .coldplug = mount_coldplug, ++ .catchup = mount_catchup, + + .dump = mount_dump, + +-- +2.33.0 + diff --git a/systemd.spec b/systemd.spec index feb3242199da1a89f83142a88f01e6d04d27ec9c..272af69e2a15bf22d7f76f555007e3c43668bb90 100644 --- a/systemd.spec +++ b/systemd.spec @@ -25,7 +25,7 @@ Name: systemd Url: https://systemd.io/ Version: 249 -Release: 103 +Release: 104 License: MIT and LGPLv2+ and GPLv2+ Summary: System and Service Manager @@ -746,6 +746,7 @@ Patch6692: backport-0001-coredump-restore-compatibility-with-older-patterns Patch6693: backport-0002-coredump-get-rid-of-_META_MANDATORY_MAX.patch Patch6694: backport-CVE-2025-4598-coredump-use-d-in-kernel-core-pattern.patch Patch6695: backport-0001-coredump-get-rid-of-a-bogus-assertion.patch +Patch6696: backport-core-mount-adjust-deserialized-state-based-on-proc-s.patch Patch9001: update-rtc-with-system-clock-when-shutdown.patch Patch9002: udev-add-actions-while-rename-netif-failed.patch @@ -2262,6 +2263,9 @@ grep -q -E '^KEYMAP="?fi-latin[19]"?' /etc/vconsole.conf 2>/dev/null && /usr/bin/systemd-cryptenroll %changelog +* Mon Jul 14 2025 Han Jinpeng - 249-104 +- Fix mount units failed issue, which mount process finished, but there is no mount. + * Tue Jun 24 2025 Han Jinpeng - 249-103 - Fix CVE-2025-4598