mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Switch to moby/sys/mount and mountinfo. Keep the pkg/mount for potential outside users. This commit was generated by the following bash script: ``` set -e -u -o pipefail for file in $(git grep -l 'docker/docker/pkg/mount"' | grep -v ^pkg/mount); do sed -i -e 's#/docker/docker/pkg/mount"#/moby/sys/mount"#' \ -e 's#mount\.\(GetMounts\|Mounted\|Info\|[A-Za-z]*Filter\)#mountinfo.\1#g' \ $file goimports -w $file done ``` Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// +build linux
 | 
						|
 | 
						|
package aufs // import "github.com/docker/docker/daemon/graphdriver/aufs"
 | 
						|
 | 
						|
import (
 | 
						|
	"os/exec"
 | 
						|
	"syscall"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/moby/sys/mount"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
	"golang.org/x/sys/unix"
 | 
						|
)
 | 
						|
 | 
						|
// Unmount the target specified.
 | 
						|
func Unmount(target string) error {
 | 
						|
	const retries = 5
 | 
						|
 | 
						|
	// auplink flush
 | 
						|
	for i := 0; ; i++ {
 | 
						|
		out, err := exec.Command("auplink", target, "flush").CombinedOutput()
 | 
						|
		if err == nil {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		rc := 0
 | 
						|
		if exiterr, ok := err.(*exec.ExitError); ok {
 | 
						|
			if status, ok := exiterr.Sys().(syscall.WaitStatus); ok {
 | 
						|
				rc = status.ExitStatus()
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if i >= retries || rc != int(unix.EINVAL) {
 | 
						|
			logger.WithError(err).WithField("method", "Unmount").Warnf("auplink flush failed: %s", out)
 | 
						|
			break
 | 
						|
		}
 | 
						|
		// auplink failed to find target in /proc/self/mounts because
 | 
						|
		// kernel can't guarantee continuity while reading from it
 | 
						|
		// while mounts table is being changed
 | 
						|
		logger.Debugf("auplink flush error (retrying %d/%d): %s", i+1, retries, out)
 | 
						|
	}
 | 
						|
 | 
						|
	// unmount
 | 
						|
	var err error
 | 
						|
	for i := 0; i < retries; i++ {
 | 
						|
		err = mount.Unmount(target)
 | 
						|
		switch errors.Cause(err) {
 | 
						|
		case nil:
 | 
						|
			return nil
 | 
						|
		case unix.EBUSY:
 | 
						|
			logger.Debugf("aufs unmount %s failed with EBUSY (retrying %d/%d)", target, i+1, retries)
 | 
						|
			time.Sleep(100 * time.Millisecond)
 | 
						|
			continue // try again
 | 
						|
		default:
 | 
						|
			// any other error is fatal
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return err
 | 
						|
}
 |