getParentMount: benefit from GetMounts filter
@@ -661,46 +661,26 @@ func mknodDevice(dest string, node *configs.Device) error {
return unix.Chown(dest, int(node.Uid), int(node.Gid))
}
-func getMountInfo(mountinfo []*mountinfo.Info, dir string) *mountinfo.Info {
- for _, m := range mountinfo {
- if m.Mountpoint == dir {
- return m
- }
- }
- return nil
-}
-
// Get the parent mount point of directory passed in as argument. Also return
// optional fields.
func getParentMount(rootfs string) (string, string, error) {
- var path string
-
- mountinfos, err := mountinfo.GetMounts(nil)
+ mi, err := mountinfo.GetMounts(mountinfo.ParentsFilter(rootfs))
if err != nil {
return "", "", err
}
-
- mountinfo := getMountInfo(mountinfos, rootfs)
- if mountinfo != nil {
- return rootfs, mountinfo.Optional, nil
- }
-
- path = rootfs
- for {
- path = filepath.Dir(path)
-
- mountinfo = getMountInfo(mountinfos, path)
- if mountinfo != nil {
- return path, mountinfo.Optional, nil
+ if len(mi) < 1 {
+ return "", "", fmt.Errorf("could not find parent mount of %s", rootfs)
}
- if path == "/" {
- break
+ // find the longest mount point
+ var idx, maxlen int
+ for i := range mi {
+ if len(mi[i].Mountpoint) > maxlen {
+ maxlen = len(mi[i].Mountpoint)
+ idx = i
}
}
-
- // If we are here, we did not find parent mount. Something is wrong.
- return "", "", fmt.Errorf("Could not find parent mount of %s", rootfs)
+ return mi[idx].Mountpoint, mi[idx].Optional, nil
}
// Make parent mount private if it was shared
