github.com/kobeld/docker@v1.12.0-rc1/daemon/graphdriver/driver_linux.go (about) 1 // +build linux 2 3 package graphdriver 4 5 import ( 6 "path/filepath" 7 "syscall" 8 9 "github.com/docker/docker/pkg/mount" 10 ) 11 12 const ( 13 // FsMagicAufs filesystem id for Aufs 14 FsMagicAufs = FsMagic(0x61756673) 15 // FsMagicBtrfs filesystem id for Btrfs 16 FsMagicBtrfs = FsMagic(0x9123683E) 17 // FsMagicCramfs filesystem id for Cramfs 18 FsMagicCramfs = FsMagic(0x28cd3d45) 19 // FsMagicEcryptfs filesystem id for eCryptfs 20 FsMagicEcryptfs = FsMagic(0xf15f) 21 // FsMagicExtfs filesystem id for Extfs 22 FsMagicExtfs = FsMagic(0x0000EF53) 23 // FsMagicF2fs filesystem id for F2fs 24 FsMagicF2fs = FsMagic(0xF2F52010) 25 // FsMagicGPFS filesystem id for GPFS 26 FsMagicGPFS = FsMagic(0x47504653) 27 // FsMagicJffs2Fs filesystem if for Jffs2Fs 28 FsMagicJffs2Fs = FsMagic(0x000072b6) 29 // FsMagicJfs filesystem id for Jfs 30 FsMagicJfs = FsMagic(0x3153464a) 31 // FsMagicNfsFs filesystem id for NfsFs 32 FsMagicNfsFs = FsMagic(0x00006969) 33 // FsMagicRAMFs filesystem id for RamFs 34 FsMagicRAMFs = FsMagic(0x858458f6) 35 // FsMagicReiserFs filesystem id for ReiserFs 36 FsMagicReiserFs = FsMagic(0x52654973) 37 // FsMagicSmbFs filesystem id for SmbFs 38 FsMagicSmbFs = FsMagic(0x0000517B) 39 // FsMagicSquashFs filesystem id for SquashFs 40 FsMagicSquashFs = FsMagic(0x73717368) 41 // FsMagicTmpFs filesystem id for TmpFs 42 FsMagicTmpFs = FsMagic(0x01021994) 43 // FsMagicVxFS filesystem id for VxFs 44 FsMagicVxFS = FsMagic(0xa501fcf5) 45 // FsMagicXfs filesystem id for Xfs 46 FsMagicXfs = FsMagic(0x58465342) 47 // FsMagicZfs filesystem id for Zfs 48 FsMagicZfs = FsMagic(0x2fc12fc1) 49 // FsMagicOverlay filesystem id for overlay 50 FsMagicOverlay = FsMagic(0x794C7630) 51 ) 52 53 var ( 54 // Slice of drivers that should be used in an order 55 priority = []string{ 56 "aufs", 57 "btrfs", 58 "zfs", 59 "devicemapper", 60 "overlay", 61 "vfs", 62 } 63 64 // FsNames maps filesystem id to name of the filesystem. 65 FsNames = map[FsMagic]string{ 66 FsMagicAufs: "aufs", 67 FsMagicBtrfs: "btrfs", 68 FsMagicCramfs: "cramfs", 69 FsMagicExtfs: "extfs", 70 FsMagicF2fs: "f2fs", 71 FsMagicGPFS: "gpfs", 72 FsMagicJffs2Fs: "jffs2", 73 FsMagicJfs: "jfs", 74 FsMagicNfsFs: "nfs", 75 FsMagicRAMFs: "ramfs", 76 FsMagicReiserFs: "reiserfs", 77 FsMagicSmbFs: "smb", 78 FsMagicSquashFs: "squashfs", 79 FsMagicTmpFs: "tmpfs", 80 FsMagicUnsupported: "unsupported", 81 FsMagicVxFS: "vxfs", 82 FsMagicXfs: "xfs", 83 FsMagicZfs: "zfs", 84 } 85 ) 86 87 // GetFSMagic returns the filesystem id given the path. 88 func GetFSMagic(rootpath string) (FsMagic, error) { 89 var buf syscall.Statfs_t 90 if err := syscall.Statfs(filepath.Dir(rootpath), &buf); err != nil { 91 return 0, err 92 } 93 return FsMagic(buf.Type), nil 94 } 95 96 // NewFsChecker returns a checker configured for the provied FsMagic 97 func NewFsChecker(t FsMagic) Checker { 98 return &fsChecker{ 99 t: t, 100 } 101 } 102 103 type fsChecker struct { 104 t FsMagic 105 } 106 107 func (c *fsChecker) IsMounted(path string) bool { 108 m, _ := Mounted(c.t, path) 109 return m 110 } 111 112 // NewDefaultChecker returns a check that parses /proc/mountinfo to check 113 // if the specified path is mounted. 114 func NewDefaultChecker() Checker { 115 return &defaultChecker{} 116 } 117 118 type defaultChecker struct { 119 } 120 121 func (c *defaultChecker) IsMounted(path string) bool { 122 m, _ := mount.Mounted(path) 123 return m 124 } 125 126 // Mounted checks if the given path is mounted as the fs type 127 func Mounted(fsType FsMagic, mountPath string) (bool, error) { 128 var buf syscall.Statfs_t 129 if err := syscall.Statfs(mountPath, &buf); err != nil { 130 return false, err 131 } 132 return FsMagic(buf.Type) == fsType, nil 133 }