| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // +build linux
- package fs2
- import (
- "strconv"
- "strings"
- "github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
- "github.com/opencontainers/runc/libcontainer/configs"
- "github.com/pkg/errors"
- )
- func setFreezer(dirPath string, state configs.FreezerState) error {
- var desired int
- switch state {
- case configs.Undefined:
- return nil
- case configs.Frozen:
- desired = 1
- case configs.Thawed:
- desired = 0
- default:
- return errors.Errorf("unknown freezer state %+v", state)
- }
- supportedErr := supportsFreezer(dirPath)
- if supportedErr != nil && desired != 0 {
- // can ignore error if desired == 1
- return errors.Wrap(supportedErr, "freezer not supported")
- }
- return freezeWithInt(dirPath, desired)
- }
- func supportsFreezer(dirPath string) error {
- _, err := fscommon.ReadFile(dirPath, "cgroup.freeze")
- return err
- }
- // freeze writes desired int to "cgroup.freeze".
- func freezeWithInt(dirPath string, desired int) error {
- desiredS := strconv.Itoa(desired)
- if err := fscommon.WriteFile(dirPath, "cgroup.freeze", desiredS); err != nil {
- return err
- }
- got, err := fscommon.ReadFile(dirPath, "cgroup.freeze")
- if err != nil {
- return err
- }
- if gotS := strings.TrimSpace(string(got)); gotS != desiredS {
- return errors.Errorf("expected \"cgroup.freeze\" in %q to be %q, got %q", dirPath, desiredS, gotS)
- }
- return nil
- }
|