core/unit: introduce unit_freezer_complete, correctly report end state
authorMike Yuan <me@yhndnzj.com>
Fri, 31 May 2024 12:43:53 +0000 (20:43 +0800)
committerMike Yuan <me@yhndnzj.com>
Wed, 17 Jul 2024 16:14:32 +0000 (18:14 +0200)
src/core/cgroup.c
src/core/unit.c
src/core/unit.h

index 98f33fe580e4341cfee884fa34fd7833a97ad437..e9eb6f96e86dc1c25096e68422ef582274f0e73f 100644 (file)
@@ -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]);
index 01f2ca189cba5d149018de23a1ce0b3f8b3d1cce..2ef2a1fbe8e1eb71c522b146bec9d6ad56773341 100644 (file)
@@ -6267,26 +6267,20 @@ void unit_set_freezer_state(Unit *u, FreezerState state) {
         unit_add_to_dbus_queue(u);
 }
 
-void unit_frozen(Unit *u) {
-        assert(u);
-
-        u->freezer_state = u->freezer_state == FREEZER_FREEZING_BY_PARENT
-                           ? FREEZER_FROZEN_BY_PARENT
-                           : FREEZER_FROZEN;
-
-        log_unit_debug(u, "Unit now %s.", freezer_state_to_string(u->freezer_state));
-
-        bus_unit_send_pending_freezer_message(u, false);
-}
+void unit_freezer_complete(Unit *u, FreezerState kernel_state) {
+        bool expected;
 
-void unit_thawed(Unit *u) {
         assert(u);
+        assert(IN_SET(kernel_state, FREEZER_RUNNING, FREEZER_FROZEN));
 
-        u->freezer_state = FREEZER_RUNNING;
+        expected = IN_SET(u->freezer_state, FREEZER_RUNNING, FREEZER_THAWING) == (kernel_state == FREEZER_RUNNING);
 
-        log_unit_debug(u, "Unit thawed.");
+        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);
+        /* 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) {
index 2003b6a7793066ac730b99e9b1047fc8e05a4af4..31a1a13df12ca262272fa933d4c6478449061eb6 100644 (file)
@@ -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);