diff --git a/vmm/src/config.rs b/vmm/src/config.rs index f9b9e2928..fb6d356d1 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -865,6 +865,8 @@ pub struct FsConfig { pub dax: bool, #[serde(default = "default_fsconfig_cache_size")] pub cache_size: u64, + #[serde(default)] + pub id: Option, } fn default_fsconfig_num_queues() -> usize { @@ -892,6 +894,7 @@ impl Default for FsConfig { queue_size: default_fsconfig_queue_size(), dax: default_fsconfig_dax(), cache_size: default_fsconfig_cache_size(), + id: None, } } } @@ -900,7 +903,7 @@ impl FsConfig { pub const SYNTAX: &'static str = "virtio-fs parameters \ \"tag=,sock=,num_queues=,\ queue_size=,dax=on|off,cache_size=\""; + default 8Gib>,id=\""; pub fn parse(fs: &str) -> Result { let mut parser = OptionParser::new(); @@ -941,6 +944,8 @@ impl FsConfig { .unwrap_or_else(|| ByteSized(default_fsconfig_cache_size())) .0; + let id = parser.get("id"); + Ok(FsConfig { tag, sock, @@ -948,6 +953,7 @@ impl FsConfig { queue_size, dax, cache_size, + id, }) } } diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 8cfc4e9d1..b83b8dd3f 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -74,6 +74,7 @@ const MMIO_LEN: u64 = 0x1000; const VFIO_DEVICE_NAME_PREFIX: &str = "vfio"; const DISK_DEVICE_NAME_PREFIX: &str = "disk"; +const FS_DEVICE_NAME_PREFIX: &str = "fs"; const NET_DEVICE_NAME_PREFIX: &str = "net"; const PMEM_DEVICE_NAME_PREFIX: &str = "pmem"; const VSOCK_DEVICE_NAME_PREFIX: &str = "vsock"; @@ -1426,8 +1427,12 @@ impl DeviceManager { fn make_virtio_fs_device( &mut self, - fs_cfg: &FsConfig, + fs_cfg: &mut FsConfig, ) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option)> { + if fs_cfg.id.is_none() { + fs_cfg.id = self.next_device_name(FS_DEVICE_NAME_PREFIX)?; + } + if let Some(fs_sock) = fs_cfg.sock.to_str() { let cache = if fs_cfg.dax { let fs_cache = fs_cfg.cache_size; @@ -1499,7 +1504,7 @@ impl DeviceManager { Ok(( Arc::clone(&virtio_fs_device) as VirtioDeviceArc, false, - None, + fs_cfg.id.clone(), )) } else { Err(DeviceManagerError::NoVirtioFsSock) @@ -1511,12 +1516,13 @@ impl DeviceManager { ) -> DeviceManagerResult)>> { let mut devices = Vec::new(); - let fs_devices = self.config.lock().unwrap().fs.clone(); - if let Some(fs_list_cfg) = &fs_devices { - for fs_cfg in fs_list_cfg.iter() { + let mut fs_devices = self.config.lock().unwrap().fs.clone(); + if let Some(fs_list_cfg) = &mut fs_devices { + for fs_cfg in fs_list_cfg.iter_mut() { devices.push(self.make_virtio_fs_device(fs_cfg)?); } } + self.config.lock().unwrap().fs = fs_devices; Ok(devices) }