From fb79e75afcd82cfe2396d061c96fa6c2823136a7 Mon Sep 17 00:00:00 2001 From: Sergio Lopez Date: Tue, 21 Jan 2020 12:22:09 +0100 Subject: [PATCH] vmm: device_manager: Add read-only support for virtio-blk vhost_user_blk already has it, so it's only fair to give it to virtio-blk too. Extend DiskConfig with a 'readonly' properly, and pass it to vm_virtio::Block. Signed-off-by: Sergio Lopez --- vmm/src/config.rs | 6 ++++++ vmm/src/device_manager.rs | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/vmm/src/config.rs b/vmm/src/config.rs index 4139ca5cd..6859e8b9a 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -338,6 +338,8 @@ impl CmdlineConfig { pub struct DiskConfig { pub path: PathBuf, #[serde(default)] + pub readonly: bool, + #[serde(default)] pub iommu: bool, } @@ -347,11 +349,14 @@ impl DiskConfig { let params_list: Vec<&str> = disk.split(',').collect(); let mut path_str: &str = ""; + let mut readonly_str: &str = ""; let mut iommu_str: &str = ""; for param in params_list.iter() { if param.starts_with("path=") { path_str = ¶m[5..]; + } else if param.starts_with("readonly=") { + readonly_str = ¶m[9..]; } else if param.starts_with("iommu=") { iommu_str = ¶m[6..]; } @@ -359,6 +364,7 @@ impl DiskConfig { Ok(DiskConfig { path: PathBuf::from(path_str), + readonly: parse_on_off(readonly_str)?, iommu: parse_on_off(iommu_str)?, }) } diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 8a1ba8e2e..fc67500b8 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -938,7 +938,7 @@ impl DeviceManager { // Open block device path let image: File = OpenOptions::new() .read(true) - .write(true) + .write(!disk_cfg.readonly) .open(&disk_cfg.path) .map_err(DeviceManagerError::Disk)?; @@ -951,7 +951,7 @@ impl DeviceManager { let dev = vm_virtio::Block::new( raw_img, disk_cfg.path.clone(), - false, + disk_cfg.readonly, disk_cfg.iommu, ) .map_err(DeviceManagerError::CreateVirtioBlock)?; @@ -970,7 +970,7 @@ impl DeviceManager { let dev = vm_virtio::Block::new( qcow_img, disk_cfg.path.clone(), - false, + disk_cfg.readonly, disk_cfg.iommu, ) .map_err(DeviceManagerError::CreateVirtioBlock)?;