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