diff --git a/csi/src/nodeserver.go b/csi/src/nodeserver.go index aefe8d85..ac33a801 100644 --- a/csi/src/nodeserver.go +++ b/csi/src/nodeserver.go @@ -545,7 +545,7 @@ func (ns *NodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUnstag defer ns.unlockVolume(ctxVars["configPath"]+":block:"+volName) targetPath := req.GetStagingTargetPath() - devicePath, _, err := mount.GetDeviceNameFromMount(ns.mounter, targetPath) + devicePath, err := GetDeviceNameFromMount(targetPath) if (err != nil) { if (os.IsNotExist(err)) @@ -897,7 +897,7 @@ func (ns *NodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpu } targetPath := req.GetTargetPath() - devicePath, _, err := mount.GetDeviceNameFromMount(ns.mounter, targetPath) + devicePath, err := GetDeviceNameFromMount(targetPath) if (err != nil) { if (os.IsNotExist(err)) diff --git a/csi/src/utils.go b/csi/src/utils.go index 9d309d89..147b1b5f 100644 --- a/csi/src/utils.go +++ b/csi/src/utils.go @@ -16,6 +16,8 @@ import ( "syscall" "k8s.io/klog" + "k8s.io/utils/mount" + "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -340,3 +342,43 @@ func systemCombined(program string, args ...string) ([]byte, error) } return out.Bytes(), nil } + +func GetDeviceNameFromMount(mountPath string) (string, error) +{ + // Use /proc/self/mountinfo to correctly parse bind mounts for block device files + mps, err := mount.ParseMountInfo("/proc/self/mountinfo") + if (err != nil) + { + return "", err + } + + slTarget, err := filepath.EvalSymlinks(mountPath) + if (err != nil) + { + slTarget = mountPath + } + + device := "" + for _, mp := range mps + { + if (mp.MountPoint == slTarget) + { + device = mp.Source + if (device[0] != '/' && mp.Root != "/") + { + // Handle {Source=udev Root=/vdb MountPoint=/var/lib/kubelet/tralaleylo/tralala} + for _, other := range mps + { + if (other.Root == "/" && other.Source == mp.Source) + { + device = other.MountPoint + mp.Root + break + } + } + } + break + } + } + + return device, nil +}