github.com/containerd/Containerd@v1.4.13/mount/lookup_unix.go (about) 1 // +build !windows 2 3 /* 4 Copyright The containerd Authors. 5 6 Licensed under the Apache License, Version 2.0 (the "License"); 7 you may not use this file except in compliance with the License. 8 You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 See the License for the specific language governing permissions and 16 limitations under the License. 17 */ 18 19 package mount 20 21 import ( 22 "path/filepath" 23 "sort" 24 "strings" 25 26 "github.com/pkg/errors" 27 ) 28 29 // Lookup returns the mount info corresponds to the path. 30 func Lookup(dir string) (Info, error) { 31 dir = filepath.Clean(dir) 32 33 mounts, err := Self() 34 if err != nil { 35 return Info{}, err 36 } 37 38 // Sort descending order by Info.Mountpoint 39 sort.SliceStable(mounts, func(i, j int) bool { 40 return mounts[j].Mountpoint < mounts[i].Mountpoint 41 }) 42 for _, m := range mounts { 43 // Note that m.{Major, Minor} are generally unreliable for our purpose here 44 // https://www.spinics.net/lists/linux-btrfs/msg58908.html 45 // Note that device number is not checked here, because for overlayfs files 46 // may have different device number with the mountpoint. 47 if strings.HasPrefix(dir, m.Mountpoint) { 48 return m, nil 49 } 50 } 51 52 return Info{}, errors.Errorf("failed to find the mount info for %q", dir) 53 }