diff --git a/pkg/driver/agent.go b/pkg/driver/agent.go index 7fb6da1..5195f2b 100644 --- a/pkg/driver/agent.go +++ b/pkg/driver/agent.go @@ -273,9 +273,13 @@ func (ns *node) NodeGetVolumeStats( return nil, status.Error(codes.InvalidArgument, "path is not provided") } + if zfs.IsMountPath(path) == false { + return nil, status.Error(codes.InvalidArgument, "path is not a mount path") + } + var sfs unix.Statfs_t if err := unix.Statfs(path, &sfs); err != nil { - return nil, status.Errorf(codes.Internal, "statfs on %s was failed: %v", path, err) + return nil, status.Errorf(codes.Internal, "statfs on %s failed: %v", path, err) } var usage []*csi.VolumeUsage diff --git a/pkg/zfs/mount.go b/pkg/zfs/mount.go index 46802aa..9ac0903 100644 --- a/pkg/zfs/mount.go +++ b/pkg/zfs/mount.go @@ -101,6 +101,27 @@ func GetMounts(dev string) ([]string, error) { return currentMounts, nil } +// IsMountPath returns true if path is a mount path +func IsMountPath(path string) bool { + + var ( + err error + mountList []mount.MountPoint + ) + + mounter := mount.New("") + // Get list of mounted paths present with the node + if mountList, err = mounter.List(); err != nil { + return false + } + for _, mntInfo := range mountList { + if mntInfo.Path == path { + return true + } + } + return false +} + func verifyMountRequest(vol *apis.ZFSVolume, mountpath string) error { if len(mountpath) == 0 { return status.Error(codes.InvalidArgument, "mount path missing in request")