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  }