From 7db2d3e146d532f7d9eb4dbc690ca8c07d89749f Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Fri, 15 May 2020 14:13:25 -0700 Subject: [PATCH] libcontainer/cgroups: rm FindCgroupMountpointDir This function is cgroupv1-specific, is only used once, and its name is very close to the name of another function, FindCgroupMountpoint. Inline it into the (only) caller. Signed-off-by: Kir Kolyshkin --- libcontainer/cgroups/fs/apply_raw.go | 37 +++++++++++++++++++++++++++- libcontainer/cgroups/utils.go | 37 ---------------------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/libcontainer/cgroups/fs/apply_raw.go b/libcontainer/cgroups/fs/apply_raw.go index 2093e0f83..245ce84f4 100644 --- a/libcontainer/cgroups/fs/apply_raw.go +++ b/libcontainer/cgroups/fs/apply_raw.go @@ -3,9 +3,11 @@ package fs import ( + "bufio" "fmt" "os" "path/filepath" + "strings" "sync" "github.com/opencontainers/runc/libcontainer/cgroups" @@ -88,10 +90,43 @@ func getCgroupRoot() (string, error) { return cgroupRoot, nil } - root, err := cgroups.FindCgroupMountpointDir() + f, err := os.Open("/proc/self/mountinfo") if err != nil { return "", err } + defer f.Close() + + var root string + scanner := bufio.NewScanner(f) + for scanner.Scan() { + text := scanner.Text() + fields := strings.Split(text, " ") + // Safe as mountinfo encodes mountpoints with spaces as \040. + index := strings.Index(text, " - ") + postSeparatorFields := strings.Fields(text[index+3:]) + numPostFields := len(postSeparatorFields) + + // This is an error as we can't detect if the mount is for "cgroup" + if numPostFields == 0 { + return "", fmt.Errorf("mountinfo: found no fields post '-' in %q", text) + } + + if postSeparatorFields[0] == "cgroup" { + // Check that the mount is properly formatted. + if numPostFields < 3 { + return "", fmt.Errorf("Error found less than 3 fields post '-' in %q", text) + } + + root = filepath.Dir(fields[4]) + break + } + } + if err := scanner.Err(); err != nil { + return "", err + } + if root == "" { + return "", errors.New("no cgroup mount found in mountinfo") + } if _, err := os.Stat(root); err != nil { return "", err diff --git a/libcontainer/cgroups/utils.go b/libcontainer/cgroups/utils.go index eba4379b4..b1171d8d5 100644 --- a/libcontainer/cgroups/utils.go +++ b/libcontainer/cgroups/utils.go @@ -117,43 +117,6 @@ func isSubsystemAvailable(subsystem string) bool { return avail } -func FindCgroupMountpointDir() (string, error) { - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return "", err - } - defer f.Close() - - scanner := bufio.NewScanner(f) - for scanner.Scan() { - text := scanner.Text() - fields := strings.Split(text, " ") - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - numPostFields := len(postSeparatorFields) - - // This is an error as we can't detect if the mount is for "cgroup" - if numPostFields == 0 { - return "", fmt.Errorf("Found no fields post '-' in %q", text) - } - - if postSeparatorFields[0] == "cgroup" || postSeparatorFields[0] == "cgroup2" { - // Check that the mount is properly formatted. - if numPostFields < 3 { - return "", fmt.Errorf("Error found less than 3 fields post '-' in %q", text) - } - - return filepath.Dir(fields[4]), nil - } - } - if err := scanner.Err(); err != nil { - return "", err - } - - return "", NewNotFoundError("cgroup") -} - type Mount struct { Mountpoint string Root string