From e1f51ba73dcb28cfafce0605785d88df5e3960dc Mon Sep 17 00:00:00 2001 From: Kazuyoshi Kato Date: Thu, 25 Mar 2021 10:26:39 -0700 Subject: [PATCH] Use os.File#Seek() to get the size of a block device Instead of calling blockdev(1), this change uses os.File#Seek which would be more effecient. https://github.com/firecracker-microvm/firecracker/pull/1371 Signed-off-by: Kazuyoshi Kato --- snapshots/devmapper/dmsetup/dmsetup.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/snapshots/devmapper/dmsetup/dmsetup.go b/snapshots/devmapper/dmsetup/dmsetup.go index ce07235f6..1d880672f 100644 --- a/snapshots/devmapper/dmsetup/dmsetup.go +++ b/snapshots/devmapper/dmsetup/dmsetup.go @@ -20,6 +20,8 @@ package dmsetup import ( "fmt" + "io" + "os" "os/exec" "strconv" "strings" @@ -327,15 +329,18 @@ func GetFullDevicePath(deviceName string) string { } // BlockDeviceSize returns size of block device in bytes -func BlockDeviceSize(devicePath string) (uint64, error) { - data, err := exec.Command("blockdev", "--getsize64", "-q", devicePath).CombinedOutput() - output := string(data) +func BlockDeviceSize(path string) (int64, error) { + f, err := os.Open(path) if err != nil { - return 0, errors.Wrapf(err, output) + return 0, err } + defer f.Close() - output = strings.TrimSuffix(output, "\n") - return strconv.ParseUint(output, 10, 64) + size, err := f.Seek(0, io.SeekEnd) + if err != nil { + return 0, errors.Wrapf(err, "failed to seek on %q", path) + } + return size, nil } func dmsetup(args ...string) (string, error) {