mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Check subpath file
This commit is contained in:
parent
06e040de40
commit
7a73168a59
@ -30,7 +30,6 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/kubernetes/pkg/volume/util/hostutil"
|
|
||||||
"k8s.io/mount-utils"
|
"k8s.io/mount-utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -110,19 +109,12 @@ func prepareSubpathTarget(mounter mount.Interface, subpath Subpath) (bool, strin
|
|||||||
notMount = true
|
notMount = true
|
||||||
}
|
}
|
||||||
if !notMount {
|
if !notMount {
|
||||||
linuxHostUtil := hostutil.NewHostUtil()
|
// It's already mounted, so check if it's bind-mounted to the same path
|
||||||
mntInfo, err := linuxHostUtil.FindMountInfo(bindPathTarget)
|
samePath, err := checkSubPathFileEqual(subpath, bindPathTarget)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, "", fmt.Errorf("error calling findMountInfo for %s: %s", bindPathTarget, err)
|
return false, "", fmt.Errorf("error checking subpath mount info for %s: %s", bindPathTarget, err)
|
||||||
}
|
}
|
||||||
if mntInfo.Root != subpath.Path {
|
if !samePath {
|
||||||
volumeMountInfo, err := linuxHostUtil.FindExactMountInfo(subpath.VolumePath)
|
|
||||||
if err == nil && mount.PathWithinBase(subpath.Path, subpath.VolumePath) &&
|
|
||||||
(volumeMountInfo.Major == mntInfo.Major && volumeMountInfo.Minor == mntInfo.Minor) {
|
|
||||||
klog.V(5).Infof("Skipping bind-mounting subpath %s, volumePath: %s, path: %s", bindPathTarget, subpath.VolumePath, subpath.Path)
|
|
||||||
return true, bindPathTarget, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// It's already mounted but not what we want, unmount it
|
// It's already mounted but not what we want, unmount it
|
||||||
if err = mounter.Unmount(bindPathTarget); err != nil {
|
if err = mounter.Unmount(bindPathTarget); err != nil {
|
||||||
return false, "", fmt.Errorf("error ummounting %s: %s", bindPathTarget, err)
|
return false, "", fmt.Errorf("error ummounting %s: %s", bindPathTarget, err)
|
||||||
@ -163,6 +155,23 @@ func prepareSubpathTarget(mounter mount.Interface, subpath Subpath) (bool, strin
|
|||||||
return false, bindPathTarget, nil
|
return false, bindPathTarget, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkSubPathFileEqual(subpath Subpath, bindMountTarget string) (bool, error) {
|
||||||
|
s, err := os.Stat(subpath.Path)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("stat %s failed: %s", subpath.Path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t, err := os.Lstat(bindMountTarget)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("lstat %s failed: %s", bindMountTarget, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !os.SameFile(s, t) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
func getSubpathBindTarget(subpath Subpath) string {
|
func getSubpathBindTarget(subpath Subpath) string {
|
||||||
// containerName is DNS label, i.e. safe as a directory name.
|
// containerName is DNS label, i.e. safe as a directory name.
|
||||||
return filepath.Join(subpath.PodDir, containerSubPathDirectoryName, subpath.VolumeName, subpath.ContainerName, strconv.Itoa(subpath.VolumeMountIndex))
|
return filepath.Join(subpath.PodDir, containerSubPathDirectoryName, subpath.VolumeName, subpath.ContainerName, strconv.Itoa(subpath.VolumeMountIndex))
|
||||||
|
Loading…
Reference in New Issue
Block a user