mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Merge pull request #74625 from davidz627/fix/xfsUnmount
GetMountRefs fixed to handle corrupted mounts by treating it like an unmounted volume
This commit is contained in:
commit
59ee7353e8
@ -120,5 +120,5 @@ func IsCorruptedMnt(err error) bool {
|
|||||||
underlyingError = pe.Err
|
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
|
||||||
}
|
}
|
||||||
|
@ -718,10 +718,14 @@ func getSELinuxSupport(path string, mountInfoFilename string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mounter *Mounter) GetMountRefs(pathname string) ([]string, 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
|
return []string{}, nil
|
||||||
} else if err != nil {
|
} else if IsCorruptedMnt(pathErr) {
|
||||||
return nil, err
|
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)
|
realpath, err := filepath.EvalSymlinks(pathname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -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
|
// GetMountRefs : empty implementation here since there is no place to query all mount points on Windows
|
||||||
func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) {
|
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
|
return []string{}, nil
|
||||||
} else if err != nil {
|
} else if pathErr != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("error checking path %s: %v", normalizeWindowsPath(pathname), pathErr)
|
||||||
}
|
}
|
||||||
return []string{pathname}, nil
|
return []string{pathname}, nil
|
||||||
}
|
}
|
||||||
|
@ -297,12 +297,11 @@ func (mounter *NsenterMounter) EvalHostSymlinks(pathname string) (string, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) {
|
func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) {
|
||||||
exists, err := mounter.ExistsPath(pathname)
|
pathExists, pathErr := PathExists(pathname)
|
||||||
if err != nil {
|
if !pathExists || IsCorruptedMnt(pathErr) {
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if !exists {
|
|
||||||
return []string{}, nil
|
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 */)
|
hostpath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user