From 8a09460c2f7ba8f6acd8a6fb7603ed3ac4805eb6 Mon Sep 17 00:00:00 2001 From: Masaki Kimura Date: Tue, 12 Nov 2019 15:50:16 +0000 Subject: [PATCH] Change getDeviceMajorMinor to use unix.Stat --- pkg/volume/util/volumepathhandler/BUILD | 10 +++++++- .../volume_path_handler_linux.go | 24 +++++++++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/pkg/volume/util/volumepathhandler/BUILD b/pkg/volume/util/volumepathhandler/BUILD index d1d562a8108..df8126ee228 100644 --- a/pkg/volume/util/volumepathhandler/BUILD +++ b/pkg/volume/util/volumepathhandler/BUILD @@ -13,7 +13,15 @@ go_library( "//pkg/util/mount:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/klog:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:android": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/volume/util/volumepathhandler/volume_path_handler_linux.go b/pkg/volume/util/volumepathhandler/volume_path_handler_linux.go index 4d2b18e8225..66cc7c73f08 100644 --- a/pkg/volume/util/volumepathhandler/volume_path_handler_linux.go +++ b/pkg/volume/util/volumepathhandler/volume_path_handler_linux.go @@ -27,6 +27,8 @@ import ( "path/filepath" "strings" + "golang.org/x/sys/unix" + "k8s.io/apimachinery/pkg/types" "k8s.io/klog" ) @@ -220,24 +222,20 @@ func compareBindMountAndSymlinks(global, pod string) (bool, error) { return false, nil } -// getDeviceMajorMinor returns major/minor number for the path with belwo format: +// getDeviceMajorMinor returns major/minor number for the path with below format: // major:minor (in hex) // ex) // fc:10 func getDeviceMajorMinor(path string) (string, error) { - args := []string{"-c", "%t:%T", path} - cmd := exec.Command(statPath, args...) - out, err := cmd.CombinedOutput() - if err != nil { - klog.V(2).Infof("Failed to stat path: %s %v %s ", path, err, out) - return "", fmt.Errorf("stat -c %%t:%%T %s failed: %v", path, err) + var stat unix.Stat_t + + if err := unix.Stat(path, &stat); err != nil { + return "", fmt.Errorf("failed to stat path %s: %v", path, err) } - // stat -c "%t:%T" {path} outputs following format(major:minor in hex): - // fc:10 - if len(out) == 0 { - return "", errors.New(ErrDeviceNotFound) - } + devNumber := uint64(stat.Rdev) + major := unix.Major(devNumber) + minor := unix.Minor(devNumber) - return strings.TrimSpace(string(out)), nil + return fmt.Sprintf("%x:%x", major, minor), nil }