From dcaabed6b42689c2533040d4197b06f8204db55a Mon Sep 17 00:00:00 2001 From: Eric Ernst Date: Thu, 7 Jan 2021 16:31:08 -0800 Subject: [PATCH] blk-dev: hotplug read only if applicable If a block based volume is read only, let's make sure we add as a RO device Fixes: #3114 Signed-off-by: Eric Ernst --- virtcontainers/container.go | 1 + virtcontainers/device/config/config.go | 3 +++ virtcontainers/device/drivers/block.go | 11 ++++++----- virtcontainers/qemu.go | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/virtcontainers/container.go b/virtcontainers/container.go index 4dad304171..55440e75ca 100644 --- a/virtcontainers/container.go +++ b/virtcontainers/container.go @@ -680,6 +680,7 @@ func (c *Container) createBlockDevices() error { DevType: "b", Major: int64(unix.Major(stat.Rdev)), Minor: int64(unix.Minor(stat.Rdev)), + ReadOnly: m.ReadOnly, } // check whether source can be used as a pmem device } else if di, err = config.PmemDeviceInfo(m.Source, m.Destination); err != nil { diff --git a/virtcontainers/device/config/config.go b/virtcontainers/device/config/config.go index 6146e8885d..e59278ee2c 100644 --- a/virtcontainers/device/config/config.go +++ b/virtcontainers/device/config/config.go @@ -114,6 +114,9 @@ type DeviceInfo struct { // for a nvdimm device in the guest. Pmem bool + // If applicable, should this device be considered RO + ReadOnly bool + // ColdPlug specifies whether the device must be cold plugged (true) // or hot plugged (false). ColdPlug bool diff --git a/virtcontainers/device/drivers/block.go b/virtcontainers/device/drivers/block.go index 6711345571..11977737cb 100644 --- a/virtcontainers/device/drivers/block.go +++ b/virtcontainers/device/drivers/block.go @@ -61,11 +61,12 @@ func (device *BlockDevice) Attach(devReceiver api.DeviceReceiver) (err error) { } drive := &config.BlockDrive{ - File: device.DeviceInfo.HostPath, - Format: "raw", - ID: utils.MakeNameID("drive", device.DeviceInfo.ID, maxDevIDSize), - Index: index, - Pmem: device.DeviceInfo.Pmem, + File: device.DeviceInfo.HostPath, + Format: "raw", + ID: utils.MakeNameID("drive", device.DeviceInfo.ID, maxDevIDSize), + Index: index, + Pmem: device.DeviceInfo.Pmem, + ReadOnly: device.DeviceInfo.ReadOnly, } if fs, ok := device.DeviceInfo.DriverOptions["fstype"]; ok { diff --git a/virtcontainers/qemu.go b/virtcontainers/qemu.go index dbc6b3762b..39da7cb156 100644 --- a/virtcontainers/qemu.go +++ b/virtcontainers/qemu.go @@ -1105,9 +1105,9 @@ func (q *qemu) hotplugAddBlockDevice(drive *config.BlockDrive, op operation, dev } if q.config.BlockDeviceCacheSet { - err = q.qmpMonitorCh.qmp.ExecuteBlockdevAddWithCache(q.qmpMonitorCh.ctx, drive.File, drive.ID, q.config.BlockDeviceCacheDirect, q.config.BlockDeviceCacheNoflush, false) + err = q.qmpMonitorCh.qmp.ExecuteBlockdevAddWithCache(q.qmpMonitorCh.ctx, drive.File, drive.ID, q.config.BlockDeviceCacheDirect, q.config.BlockDeviceCacheNoflush, drive.ReadOnly) } else { - err = q.qmpMonitorCh.qmp.ExecuteBlockdevAdd(q.qmpMonitorCh.ctx, drive.File, drive.ID, false) + err = q.qmpMonitorCh.qmp.ExecuteBlockdevAdd(q.qmpMonitorCh.ctx, drive.File, drive.ID, drive.ReadOnly) } if err != nil { return err