mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-02 11:35:46 +00:00
vmm: device_manager: Refactor make_virtio_block_devices
Split it into a method that creates a single device which is called by the multiple device version so this can be used when dynamically adding a device. Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
66da29d8dd
commit
2be703ca92
@ -1054,12 +1054,10 @@ impl DeviceManager {
|
||||
Ok(sock)
|
||||
}
|
||||
|
||||
fn make_virtio_block_devices(&mut self) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
|
||||
let mut devices = Vec::new();
|
||||
|
||||
let block_devices = self.config.lock().unwrap().disks.clone();
|
||||
if let Some(disk_list_cfg) = &block_devices {
|
||||
for disk_cfg in disk_list_cfg.iter() {
|
||||
fn make_virtio_block_device(
|
||||
&mut self,
|
||||
disk_cfg: &DiskConfig,
|
||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool)> {
|
||||
if disk_cfg.vhost_user {
|
||||
let sock = if let Some(sock) = disk_cfg.vhost_socket.clone() {
|
||||
sock
|
||||
@ -1076,14 +1074,13 @@ impl DeviceManager {
|
||||
.map_err(DeviceManagerError::CreateVhostUserBlk)?,
|
||||
));
|
||||
|
||||
devices.push((
|
||||
Arc::clone(&vhost_user_block_device)
|
||||
as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
false,
|
||||
));
|
||||
|
||||
self.migratable_devices
|
||||
.push(Arc::clone(&vhost_user_block_device) as Arc<Mutex<dyn Migratable>>);
|
||||
|
||||
Ok((
|
||||
Arc::clone(&vhost_user_block_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
false,
|
||||
))
|
||||
} else {
|
||||
let mut options = OpenOptions::new();
|
||||
options.read(true);
|
||||
@ -1094,10 +1091,11 @@ impl DeviceManager {
|
||||
// Open block device path
|
||||
let image: File = options
|
||||
.open(
|
||||
&disk_cfg
|
||||
disk_cfg
|
||||
.path
|
||||
.as_ref()
|
||||
.ok_or(DeviceManagerError::NoDiskPath)?,
|
||||
.ok_or(DeviceManagerError::NoDiskPath)?
|
||||
.clone(),
|
||||
)
|
||||
.map_err(DeviceManagerError::Disk)?;
|
||||
|
||||
@ -1123,16 +1121,17 @@ impl DeviceManager {
|
||||
|
||||
let block = Arc::new(Mutex::new(dev));
|
||||
|
||||
devices.push((
|
||||
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
disk_cfg.iommu,
|
||||
));
|
||||
self.migratable_devices
|
||||
.push(Arc::clone(&block) as Arc<Mutex<dyn Migratable>>);
|
||||
|
||||
Ok((
|
||||
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
disk_cfg.iommu,
|
||||
))
|
||||
}
|
||||
ImageType::Qcow2 => {
|
||||
let qcow_img = QcowFile::from(raw_img)
|
||||
.map_err(DeviceManagerError::QcowDeviceCreate)?;
|
||||
let qcow_img =
|
||||
QcowFile::from(raw_img).map_err(DeviceManagerError::QcowDeviceCreate)?;
|
||||
let dev = vm_virtio::Block::new(
|
||||
qcow_img,
|
||||
disk_cfg
|
||||
@ -1149,18 +1148,28 @@ impl DeviceManager {
|
||||
|
||||
let block = Arc::new(Mutex::new(dev));
|
||||
|
||||
devices.push((
|
||||
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
disk_cfg.iommu,
|
||||
));
|
||||
self.migratable_devices
|
||||
.push(Arc::clone(&block) as Arc<Mutex<dyn Migratable>>);
|
||||
|
||||
Ok((
|
||||
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
|
||||
disk_cfg.iommu,
|
||||
))
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn make_virtio_block_devices(&mut self) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
|
||||
let mut devices = Vec::new();
|
||||
|
||||
let block_devices = self.config.lock().unwrap().disks.clone();
|
||||
if let Some(disk_list_cfg) = &block_devices {
|
||||
for disk_cfg in disk_list_cfg.iter() {
|
||||
devices.push(self.make_virtio_block_device(disk_cfg)?);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(devices)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user