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, "mount-point": dev.mountPoint,
}).Info("device details") }).Info("device details")
isDM, err := checkStorageDriver(dev.major, dev.minor) isBD, err := checkStorageDriver(dev.major, dev.minor)
if err != nil { if err != nil {
return err return err
} }
if !isDM { if !isBD {
return nil return nil
} }

View File

@ -194,14 +194,14 @@ func getDeviceForPath(path string) (device, error) {
return dev, nil 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 // isBlockDevice checks if the device with the major and minor numbers is a block device
func isDeviceMapper(major, minor int) (bool, error) { 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) sysPath := fmt.Sprintf(blockFormatTemplate, major, minor)
_, err := os.Stat(sysPath) _, err := os.Stat(sysPath)
@ -209,10 +209,10 @@ func isDeviceMapper(major, minor int) (bool, error) {
return true, nil return true, nil
} else if os.IsNotExist(err) { } else if os.IsNotExist(err) {
return false, nil return false, nil
} } else {
return false, err return false, err
} }
}
const mountPerm = os.FileMode(0755) const mountPerm = os.FileMode(0755)

View File

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