Merge pull request #4743 from yuchen0cc/main

mount: support checking multiple kinds of block device driver
This commit is contained in:
Jeremi Piotrowski 2023-12-05 18:04:51 +01:00 committed by GitHub
commit e2c6b8ae6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 14 deletions

View File

@ -1319,12 +1319,12 @@ func (c *Container) hotplugDrive(ctx context.Context) error {
"mount-point": dev.mountPoint,
}).Info("device details")
isDM, err := checkStorageDriver(dev.major, dev.minor)
isBD, err := checkStorageDriver(dev.major, dev.minor)
if err != nil {
return err
}
if !isDM {
if !isBD {
return nil
}

View File

@ -194,14 +194,14 @@ func getDeviceForPath(path string) (device, error) {
return dev, nil
}
var blockFormatTemplate = "/sys/dev/block/%d:%d/dm"
var blockFormatTemplate = "/sys/dev/block/%d:%d/"
var checkStorageDriver = isDeviceMapper
var checkStorageDriver = isBlockDevice
// isDeviceMapper checks if the device with the major and minor numbers is a devicemapper block device
func isDeviceMapper(major, minor int) (bool, error) {
// isBlockDevice checks if the device with the major and minor numbers is a block device
func isBlockDevice(major, minor int) (bool, error) {
//Check if /sys/dev/block/${major}-${minor}/dm exists
//Check if /sys/dev/block/${major}-${minor}/ exists
sysPath := fmt.Sprintf(blockFormatTemplate, major, minor)
_, err := os.Stat(sysPath)
@ -209,9 +209,9 @@ func isDeviceMapper(major, minor int) (bool, error) {
return true, nil
} else if os.IsNotExist(err) {
return false, nil
} else {
return false, err
}
return false, err
}
const mountPerm = os.FileMode(0755)

View File

@ -305,20 +305,31 @@ func TestGetDeviceForPathValidMount(t *testing.T) {
assert.Equal(dev.mountPoint, expected)
}
func TestIsDeviceMapper(t *testing.T) {
func TestIsBlockDevice(t *testing.T) {
assert := assert.New(t)
// known major, minor for /dev/tty
major := 5
minor := 0
isDM, err := isDeviceMapper(major, minor)
isBD, err := isBlockDevice(major, minor)
assert.NoError(err)
assert.False(isDM)
assert.False(isBD)
// fake the block device format
blockFormatTemplateOld := blockFormatTemplate
defer func() {
blockFormatTemplate = blockFormatTemplateOld
}()
blockFormatTemplate = "/sys/dev/char/%d:%d"
isDM, err = isDeviceMapper(major, minor)
isBD, err = isBlockDevice(major, minor)
assert.NoError(err)
assert.True(isDM)
assert.True(isBD)
// invalid template
blockFormatTemplate = "\000/sys/dev/char/%d:%d"
isBD, err = isBlockDevice(major, minor)
assert.Error(err)
assert.False(isBD)
}