core/unit: introduce unit_freezer_complete, correctly report end state
This commit is contained in:
+2
-6
@@ -4044,12 +4044,8 @@ static int unit_check_cgroup_events(Unit *u) {
|
||||
/* Disregard freezer state changes due to operations not initiated by us.
|
||||
* See: https://github.com/systemd/systemd/pull/13512/files#r416469963 and
|
||||
* https://github.com/systemd/systemd/pull/13512#issuecomment-573007207 */
|
||||
if (values[1] && IN_SET(u->freezer_state, FREEZER_FREEZING, FREEZER_FREEZING_BY_PARENT, FREEZER_THAWING)) {
|
||||
if (streq(values[1], "0"))
|
||||
unit_thawed(u);
|
||||
else
|
||||
unit_frozen(u);
|
||||
}
|
||||
if (values[1] && IN_SET(u->freezer_state, FREEZER_FREEZING, FREEZER_FREEZING_BY_PARENT, FREEZER_THAWING))
|
||||
unit_freezer_complete(u, streq(values[1], "0") ? FREEZER_RUNNING : FREEZER_FROZEN);
|
||||
|
||||
free(values[0]);
|
||||
free(values[1]);
|
||||
|
||||
+10
-16
@@ -6267,26 +6267,20 @@ void unit_set_freezer_state(Unit *u, FreezerState state) {
|
||||
unit_add_to_dbus_queue(u);
|
||||
}
|
||||
|
||||
void unit_frozen(Unit *u) {
|
||||
void unit_freezer_complete(Unit *u, FreezerState kernel_state) {
|
||||
bool expected;
|
||||
|
||||
assert(u);
|
||||
assert(IN_SET(kernel_state, FREEZER_RUNNING, FREEZER_FROZEN));
|
||||
|
||||
u->freezer_state = u->freezer_state == FREEZER_FREEZING_BY_PARENT
|
||||
? FREEZER_FROZEN_BY_PARENT
|
||||
: FREEZER_FROZEN;
|
||||
expected = IN_SET(u->freezer_state, FREEZER_RUNNING, FREEZER_THAWING) == (kernel_state == FREEZER_RUNNING);
|
||||
|
||||
log_unit_debug(u, "Unit now %s.", freezer_state_to_string(u->freezer_state));
|
||||
unit_set_freezer_state(u, expected ? freezer_state_finish(u->freezer_state) : kernel_state);
|
||||
log_unit_info(u, "Unit now %s.", u->freezer_state == FREEZER_RUNNING ? "thawed" :
|
||||
freezer_state_to_string(u->freezer_state));
|
||||
|
||||
bus_unit_send_pending_freezer_message(u, false);
|
||||
}
|
||||
|
||||
void unit_thawed(Unit *u) {
|
||||
assert(u);
|
||||
|
||||
u->freezer_state = FREEZER_RUNNING;
|
||||
|
||||
log_unit_debug(u, "Unit thawed.");
|
||||
|
||||
bus_unit_send_pending_freezer_message(u, false);
|
||||
/* If the cgroup's final state is against what's requested by us, report as canceled. */
|
||||
bus_unit_send_pending_freezer_message(u, /* canceled = */ !expected);
|
||||
}
|
||||
|
||||
int unit_freezer_action(Unit *u, FreezerAction action) {
|
||||
|
||||
+1
-2
@@ -1040,8 +1040,7 @@ bool unit_can_freeze(const Unit *u);
|
||||
int unit_freezer_action(Unit *u, FreezerAction action);
|
||||
void unit_next_freezer_state(Unit *u, FreezerAction action, FreezerState *ret_next, FreezerState *ret_objective);
|
||||
void unit_set_freezer_state(Unit *u, FreezerState state);
|
||||
void unit_frozen(Unit *u);
|
||||
void unit_thawed(Unit *u);
|
||||
void unit_freezer_complete(Unit *u, FreezerState kernel_state);
|
||||
|
||||
Condition *unit_find_failed_condition(Unit *u);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user