diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index f02d305be5..ef4c272bf7 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -5463,17 +5463,14 @@ int exec_invoke( .sched_flags = context->cpu_sched_reset_on_fork ? SCHED_FLAG_RESET_ON_FORK : 0, }; - r = sched_setattr(/* pid= */ 0, &attr, /* flags= */ 0); - if (r < 0) { - if (errno != EINVAL || sched_policy_supported(attr.sched_policy)) { - *exit_status = EXIT_SETSCHEDULER; - return log_error_errno(errno, "Failed to set up CPU scheduling: %m"); - } - + r = RET_NERRNO(sched_setattr(/* pid= */ 0, &attr, /* flags= */ 0)); + if (r == -EINVAL && !sched_policy_supported(context->cpu_sched_policy)) { _cleanup_free_ char *s = NULL; (void) sched_policy_to_string_alloc(context->cpu_sched_policy, &s); - - log_warning_errno(errno, "CPU scheduling policy %s is not supported, proceeding without.", strna(s)); + log_warning_errno(r, "CPU scheduling policy %s is not supported, proceeding without.", strna(s)); + } else if (r < 0) { + *exit_status = EXIT_SETSCHEDULER; + return log_error_errno(r, "Failed to set up CPU scheduling: %m"); } } diff --git a/src/core/transaction.c b/src/core/transaction.c index 59c7f8c97f..90cc8ee41f 100644 --- a/src/core/transaction.c +++ b/src/core/transaction.c @@ -1178,6 +1178,28 @@ static bool shall_stop_on_isolate(Transaction *tr, Unit *u) { if (hashmap_contains(tr->jobs, u)) return false; + /* Keep units that are triggered by units we want to keep around. */ + Unit *other; + UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_TRIGGERED_BY) { + if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other))) + continue; + + /* Is the trigger about to go down? */ + Job *other_job = hashmap_get(tr->jobs, other); + + bool has_stop = false; + LIST_FOREACH(transaction, j, other_job) + if (j->type == JOB_STOP) { + has_stop = true; + break; + } + if (has_stop) + continue; + + if (other->ignore_on_isolate || other_job) + return false; + } + return true; } @@ -1191,7 +1213,6 @@ int transaction_add_isolate_jobs(Transaction *tr, Manager *m) { HASHMAP_FOREACH_KEY(u, k, m->units) { _cleanup_(sd_bus_error_free) sd_bus_error e = SD_BUS_ERROR_NULL; - Unit *o; /* Ignore aliases. */ if (u->id != k) @@ -1204,16 +1225,6 @@ int transaction_add_isolate_jobs(Transaction *tr, Manager *m) { if (!shall_stop_on_isolate(tr, u)) continue; - /* Keep units that are triggered by units we want to keep around. */ - bool keep = false; - UNIT_FOREACH_DEPENDENCY(o, u, UNIT_ATOM_TRIGGERED_BY) - if (!shall_stop_on_isolate(tr, o)) { - keep = true; - break; - } - if (keep) - continue; - r = transaction_add_job_and_dependencies(tr, JOB_STOP, u, tr->anchor_job, TRANSACTION_MATTERS, &e); if (r < 0) log_unit_warning_errno(u, r, "Cannot add isolate job, ignoring: %s", bus_error_message(&e, r)); diff --git a/src/core/unit.c b/src/core/unit.c index 7c51cc1b86..ded0c3e14d 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -3927,8 +3927,7 @@ bool unit_active_or_pending(Unit *u) { if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) return true; - if (u->job && - IN_SET(u->job->type, JOB_START, JOB_RELOAD_OR_START, JOB_RESTART)) + if (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART)) return true; return false;