73 lines
3.7 KiB
Diff
73 lines
3.7 KiB
Diff
From 41635f7ce09244e8311f31082df0b1b21d117c29 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Fri, 22 Aug 2025 02:06:43 +0900
|
|
Subject: [PATCH] core/unit: use UNIT_FOREACH_DEPENDENCY_SAFE() at several more
|
|
places
|
|
|
|
manager_add_job() -> transaction_add_job_and_dependencies() may update
|
|
dependencies when a unit is not loaded yet. Hence, we need to restart
|
|
dependency loop in that case.
|
|
|
|
Follow-up for b7777d08846033859c5b734317fbbbfcca4cafcb (#37465).
|
|
Fixes #38676.
|
|
|
|
(cherry picked from commit 64fc4917b9149ffe6defaf5ceaf3236324537a3f)
|
|
|
|
Resolves: RHEL-112203
|
|
---
|
|
src/core/unit.c | 12 ++++++------
|
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/src/core/unit.c b/src/core/unit.c
|
|
index 631fa2f198..01e4d3a64f 100644
|
|
--- a/src/core/unit.c
|
|
+++ b/src/core/unit.c
|
|
@@ -2219,17 +2219,17 @@ static void retroactively_start_dependencies(Unit *u) {
|
|
assert(u);
|
|
assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
|
|
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_START_REPLACE) /* Requires= + BindsTo= */
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_START_REPLACE) /* Requires= + BindsTo= */
|
|
if (!unit_has_dependency(u, UNIT_ATOM_AFTER, other) &&
|
|
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
|
(void) manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL);
|
|
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_START_FAIL) /* Wants= */
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_START_FAIL) /* Wants= */
|
|
if (!unit_has_dependency(u, UNIT_ATOM_AFTER, other) &&
|
|
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
|
(void) manager_add_job(u->manager, JOB_START, other, JOB_FAIL, /* error = */ NULL, /* ret = */ NULL);
|
|
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_START) /* Conflicts= (and inverse) */
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_START) /* Conflicts= (and inverse) */
|
|
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
|
(void) manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL);
|
|
}
|
|
@@ -2241,7 +2241,7 @@ static void retroactively_stop_dependencies(Unit *u) {
|
|
assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
|
|
|
|
/* Pull down units which are bound to us recursively if enabled */
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_STOP) /* BoundBy= */
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_STOP) /* BoundBy= */
|
|
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
|
(void) manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL);
|
|
}
|
|
@@ -2268,7 +2268,7 @@ void unit_start_on_termination_deps(Unit *u, UnitDependencyAtom atom) {
|
|
assert(dependency_name);
|
|
|
|
Unit *other;
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, atom) {
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, atom) {
|
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
|
if (n_jobs == 0)
|
|
@@ -2291,7 +2291,7 @@ void unit_trigger_notify(Unit *u) {
|
|
|
|
assert(u);
|
|
|
|
- UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_TRIGGERED_BY)
|
|
+ UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_TRIGGERED_BY)
|
|
if (UNIT_VTABLE(other)->trigger_notify)
|
|
UNIT_VTABLE(other)->trigger_notify(other, u);
|
|
}
|