github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/daemon/graphdriver/devmapper/mount.go (about) 1 //go:build linux 2 // +build linux 3 4 package devmapper // import "github.com/docker/docker/daemon/graphdriver/devmapper" 5 6 import ( 7 "bytes" 8 "fmt" 9 "os" 10 ) 11 12 type probeData struct { 13 fsName string 14 magic string 15 offset uint64 16 } 17 18 // ProbeFsType returns the filesystem name for the given device id. 19 func ProbeFsType(device string) (string, error) { 20 probes := []probeData{ 21 {"btrfs", "_BHRfS_M", 0x10040}, 22 {"ext4", "\123\357", 0x438}, 23 {"xfs", "XFSB", 0}, 24 } 25 26 maxLen := uint64(0) 27 for _, p := range probes { 28 l := p.offset + uint64(len(p.magic)) 29 if l > maxLen { 30 maxLen = l 31 } 32 } 33 34 file, err := os.Open(device) 35 if err != nil { 36 return "", err 37 } 38 defer file.Close() 39 40 buffer := make([]byte, maxLen) 41 l, err := file.Read(buffer) 42 if err != nil { 43 return "", err 44 } 45 46 if uint64(l) != maxLen { 47 return "", fmt.Errorf("devmapper: unable to detect filesystem type of %s, short read", device) 48 } 49 50 for _, p := range probes { 51 if bytes.Equal([]byte(p.magic), buffer[p.offset:p.offset+uint64(len(p.magic))]) { 52 return p.fsName, nil 53 } 54 } 55 56 return "", fmt.Errorf("devmapper: Unknown filesystem type on %s", device) 57 } 58 59 func joinMountOptions(a, b string) string { 60 if a == "" { 61 return b 62 } 63 if b == "" { 64 return a 65 } 66 return a + "," + b 67 }