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  }