diff --git a/pkg/util/mount/mount_helper.go b/pkg/util/mount/mount_helper.go index 0d4acaae448..9984705183c 100644 --- a/pkg/util/mount/mount_helper.go +++ b/pkg/util/mount/mount_helper.go @@ -120,5 +120,5 @@ func IsCorruptedMnt(err error) bool { underlyingError = pe.Err } - return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO + return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO || underlyingError == syscall.EACCES } diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 218757ef083..9ffd766a51b 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -718,10 +718,14 @@ func getSELinuxSupport(path string, mountInfoFilename string) (bool, error) { } func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { - if _, err := os.Stat(pathname); os.IsNotExist(err) { + pathExists, pathErr := PathExists(pathname) + if !pathExists { return []string{}, nil - } else if err != nil { - return nil, err + } else if IsCorruptedMnt(pathErr) { + klog.Warningf("GetMountRefs found corrupted mount at %s, treating as unmounted path", pathname) + return []string{}, nil + } else if pathErr != nil { + return nil, fmt.Errorf("error checking path %s: %v", pathname, pathErr) } realpath, err := filepath.EvalSymlinks(pathname) if err != nil { diff --git a/pkg/util/mount/mount_windows.go b/pkg/util/mount/mount_windows.go index cbc065ec9ae..84aa18421b4 100644 --- a/pkg/util/mount/mount_windows.go +++ b/pkg/util/mount/mount_windows.go @@ -378,10 +378,14 @@ func getAllParentLinks(path string) ([]string, error) { // GetMountRefs : empty implementation here since there is no place to query all mount points on Windows func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { - if _, err := os.Stat(normalizeWindowsPath(pathname)); os.IsNotExist(err) { + pathExists, pathErr := PathExists(normalizeWindowsPath(pathname)) + // TODO(#75012): Need a Windows specific IsCorruptedMnt function that checks against whatever errno's + // Windows emits when we try to Stat a corrupted mount + // https://golang.org/pkg/syscall/?GOOS=windows&GOARCH=amd64#Errno + if !pathExists { return []string{}, nil - } else if err != nil { - return nil, err + } else if pathErr != nil { + return nil, fmt.Errorf("error checking path %s: %v", normalizeWindowsPath(pathname), pathErr) } return []string{pathname}, nil } diff --git a/pkg/util/mount/nsenter_mount.go b/pkg/util/mount/nsenter_mount.go index cdd39336de5..a7407315c48 100644 --- a/pkg/util/mount/nsenter_mount.go +++ b/pkg/util/mount/nsenter_mount.go @@ -297,12 +297,11 @@ func (mounter *NsenterMounter) EvalHostSymlinks(pathname string) (string, error) } func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) { - exists, err := mounter.ExistsPath(pathname) - if err != nil { - return nil, err - } - if !exists { + pathExists, pathErr := PathExists(pathname) + if !pathExists || IsCorruptedMnt(pathErr) { return []string{}, nil + } else if pathErr != nil { + return nil, fmt.Errorf("Error checking path %s: %v", pathname, pathErr) } hostpath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */) if err != nil {