github.com/scorpionis/docker@v1.6.0-rc7/daemon/graphdriver/devmapper/mount.go (about)

     1  // +build linux
     2  
     3  package devmapper
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  	"syscall"
    11  )
    12  
    13  // FIXME: this is copy-pasted from the aufs driver.
    14  // It should be moved into the core.
    15  
    16  func Mounted(mountpoint string) (bool, error) {
    17  	mntpoint, err := os.Stat(mountpoint)
    18  	if err != nil {
    19  		if os.IsNotExist(err) {
    20  			return false, nil
    21  		}
    22  		return false, err
    23  	}
    24  	parent, err := os.Stat(filepath.Join(mountpoint, ".."))
    25  	if err != nil {
    26  		return false, err
    27  	}
    28  	mntpointSt := mntpoint.Sys().(*syscall.Stat_t)
    29  	parentSt := parent.Sys().(*syscall.Stat_t)
    30  	return mntpointSt.Dev != parentSt.Dev, nil
    31  }
    32  
    33  type probeData struct {
    34  	fsName string
    35  	magic  string
    36  	offset uint64
    37  }
    38  
    39  func ProbeFsType(device string) (string, error) {
    40  	probes := []probeData{
    41  		{"btrfs", "_BHRfS_M", 0x10040},
    42  		{"ext4", "\123\357", 0x438},
    43  		{"xfs", "XFSB", 0},
    44  	}
    45  
    46  	maxLen := uint64(0)
    47  	for _, p := range probes {
    48  		l := p.offset + uint64(len(p.magic))
    49  		if l > maxLen {
    50  			maxLen = l
    51  		}
    52  	}
    53  
    54  	file, err := os.Open(device)
    55  	if err != nil {
    56  		return "", err
    57  	}
    58  	defer file.Close()
    59  
    60  	buffer := make([]byte, maxLen)
    61  	l, err := file.Read(buffer)
    62  	if err != nil {
    63  		return "", err
    64  	}
    65  
    66  	if uint64(l) != maxLen {
    67  		return "", fmt.Errorf("unable to detect filesystem type of %s, short read", device)
    68  	}
    69  
    70  	for _, p := range probes {
    71  		if bytes.Equal([]byte(p.magic), buffer[p.offset:p.offset+uint64(len(p.magic))]) {
    72  			return p.fsName, nil
    73  		}
    74  	}
    75  
    76  	return "", fmt.Errorf("Unknown filesystem type on %s", device)
    77  }
    78  
    79  func joinMountOptions(a, b string) string {
    80  	if a == "" {
    81  		return b
    82  	}
    83  	if b == "" {
    84  		return a
    85  	}
    86  	return a + "," + b
    87  }