Skip to content

Commit 424b9d9

Browse files
committed
fs2: reset cgroup.freeze to thawed when freezing fails
When freezing a cgroup v2 fails after the freeze was requested (for example the freeze times out, or the confirmed state does not match), setFreezer returned the error but left cgroup.freeze set to "1", leaving the cgroup in a half-frozen state. Reset it back to "0" (thawed) on the freeze error path via a best-effort deferred write, mirroring the cgroup v1 behaviour from runc#2774. Fixes opencontainers/runc#5325 Signed-off-by: Aman Raj <aman.yug@gmail.com>
1 parent bada14e commit 424b9d9

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

‎fs2/freezer.go‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/opencontainers/cgroups"
1414
)
1515

16-
func setFreezer(dirPath string, state cgroups.FreezerState) error {
16+
func setFreezer(dirPath string, state cgroups.FreezerState) (retErr error) {
1717
var stateStr string
1818
switch state {
1919
case cgroups.Undefined:
@@ -38,6 +38,17 @@ func setFreezer(dirPath string, state cgroups.FreezerState) error {
3838
}
3939
defer fd.Close()
4040

41+
// If freezing fails (for example the freeze times out), reset the cgroup
42+
// back to thawed so it is not left in a half-frozen state. This mirrors
43+
// the cgroup v1 behaviour (see runc#2774).
44+
if state == cgroups.Frozen {
45+
defer func() {
46+
if retErr != nil {
47+
_ = cgroups.WriteFile(dirPath, "cgroup.freeze", "0")
48+
}
49+
}()
50+
}
51+
4152
if _, err := fd.WriteString(stateStr); err != nil {
4253
return err
4354
}

0 commit comments

Comments
 (0)