diff --git a/src/core/cgroup.c b/src/core/cgroup.c index c44966839c..816ea162bf 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -4166,9 +4166,23 @@ int unit_cgroup_freezer_action(Unit *u, FreezerAction action) { if (!cg_freezer_supported()) return 0; + /* Ignore all requests to thaw init.scope or -.slice and reject all requests to freeze them */ + if (unit_has_name(u, SPECIAL_ROOT_SLICE) || unit_has_name(u, SPECIAL_INIT_SCOPE)) + return action == FREEZER_FREEZE ? -EPERM : 0; + if (!u->cgroup_realized) return -EBUSY; + if (action == FREEZER_THAW) { + Unit *slice = UNIT_GET_SLICE(u); + + if (slice) { + r = unit_cgroup_freezer_action(slice, FREEZER_THAW); + if (r < 0) + return log_unit_error_errno(u, r, "Failed to thaw slice %s of unit: %m", slice->id); + } + } + target = action == FREEZER_FREEZE ? FREEZER_FROZEN : FREEZER_RUNNING; r = unit_freezer_state_kernel(u, &kernel);