freezer.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // +build linux
  2. package fs2
  3. import (
  4. "strconv"
  5. "strings"
  6. "github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
  7. "github.com/opencontainers/runc/libcontainer/configs"
  8. "github.com/pkg/errors"
  9. )
  10. func setFreezer(dirPath string, state configs.FreezerState) error {
  11. var desired int
  12. switch state {
  13. case configs.Undefined:
  14. return nil
  15. case configs.Frozen:
  16. desired = 1
  17. case configs.Thawed:
  18. desired = 0
  19. default:
  20. return errors.Errorf("unknown freezer state %+v", state)
  21. }
  22. supportedErr := supportsFreezer(dirPath)
  23. if supportedErr != nil && desired != 0 {
  24. // can ignore error if desired == 1
  25. return errors.Wrap(supportedErr, "freezer not supported")
  26. }
  27. return freezeWithInt(dirPath, desired)
  28. }
  29. func supportsFreezer(dirPath string) error {
  30. _, err := fscommon.ReadFile(dirPath, "cgroup.freeze")
  31. return err
  32. }
  33. // freeze writes desired int to "cgroup.freeze".
  34. func freezeWithInt(dirPath string, desired int) error {
  35. desiredS := strconv.Itoa(desired)
  36. if err := fscommon.WriteFile(dirPath, "cgroup.freeze", desiredS); err != nil {
  37. return err
  38. }
  39. got, err := fscommon.ReadFile(dirPath, "cgroup.freeze")
  40. if err != nil {
  41. return err
  42. }
  43. if gotS := strings.TrimSpace(string(got)); gotS != desiredS {
  44. return errors.Errorf("expected \"cgroup.freeze\" in %q to be %q, got %q", dirPath, desiredS, gotS)
  45. }
  46. return nil
  47. }