diff --git a/src/agent/src/storage/mod.rs b/src/agent/src/storage/mod.rs index 93892af9dc..03a4865a3f 100644 --- a/src/agent/src/storage/mod.rs +++ b/src/agent/src/storage/mod.rs @@ -139,20 +139,20 @@ pub trait StorageHandler: Send + Sync { lazy_static! { pub static ref STORAGE_HANDLERS: StorageHandlerManager> = { let mut manager: StorageHandlerManager> = StorageHandlerManager::new(); - manager.add_handler(DRIVER_9P_TYPE, Arc::new(Virtio9pHandler{})).unwrap(); + manager.add_handler(&[DRIVER_9P_TYPE], Arc::new(Virtio9pHandler{})).unwrap(); #[cfg(target_arch = "s390x")] - manager.add_handler(crate::device::DRIVER_BLK_CCW_TYPE, Arc::new(self::block_handler::VirtioBlkCcwHandler{})).unwrap(); - manager.add_handler(DRIVER_BLK_MMIO_TYPE, Arc::new(VirtioBlkMmioHandler{})).unwrap(); - manager.add_handler(DRIVER_BLK_PCI_TYPE, Arc::new(VirtioBlkPciHandler{})).unwrap(); - manager.add_handler(DRIVER_EPHEMERAL_TYPE, Arc::new(EphemeralHandler{})).unwrap(); - manager.add_handler(DRIVER_LOCAL_TYPE, Arc::new(LocalHandler{})).unwrap(); - manager.add_handler(DRIVER_NVDIMM_TYPE, Arc::new(PmemHandler{})).unwrap(); - manager.add_handler(DRIVER_OVERLAYFS_TYPE, Arc::new(OverlayfsHandler{})).unwrap(); - manager.add_handler(DRIVER_SCSI_TYPE, Arc::new(ScsiHandler{})).unwrap(); - manager.add_handler(DRIVER_VIRTIOFS_TYPE, Arc::new(VirtioFsHandler{})).unwrap(); - manager.add_handler(DRIVER_WATCHABLE_BIND_TYPE, Arc::new(BindWatcherHandler{})).unwrap(); + manager.add_handler(&[crate::device::DRIVER_BLK_CCW_TYPE], Arc::new(self::block_handler::VirtioBlkCcwHandler{})).unwrap(); + manager.add_handler(&[DRIVER_BLK_MMIO_TYPE], Arc::new(VirtioBlkMmioHandler{})).unwrap(); + manager.add_handler(&[DRIVER_BLK_PCI_TYPE], Arc::new(VirtioBlkPciHandler{})).unwrap(); + manager.add_handler(&[DRIVER_EPHEMERAL_TYPE], Arc::new(EphemeralHandler{})).unwrap(); + manager.add_handler(&[DRIVER_LOCAL_TYPE], Arc::new(LocalHandler{})).unwrap(); + manager.add_handler(&[DRIVER_NVDIMM_TYPE], Arc::new(PmemHandler{})).unwrap(); + manager.add_handler(&[DRIVER_OVERLAYFS_TYPE], Arc::new(OverlayfsHandler{})).unwrap(); + manager.add_handler(&[DRIVER_SCSI_TYPE], Arc::new(ScsiHandler{})).unwrap(); + manager.add_handler(&[DRIVER_VIRTIOFS_TYPE], Arc::new(VirtioFsHandler{})).unwrap(); + manager.add_handler(&[DRIVER_WATCHABLE_BIND_TYPE], Arc::new(BindWatcherHandler{})).unwrap(); #[cfg(feature = "guest-pull")] - manager.add_handler(KATA_VIRTUAL_VOLUME_IMAGE_GUEST_PULL, Arc::new(ImagePullHandler{})).unwrap(); + manager.add_handler(&[KATA_VIRTUAL_VOLUME_IMAGE_GUEST_PULL], Arc::new(ImagePullHandler{})).unwrap(); manager }; } diff --git a/src/libs/kata-types/src/mount.rs b/src/libs/kata-types/src/mount.rs index b6d8784317..da52a2a05b 100644 --- a/src/libs/kata-types/src/mount.rs +++ b/src/libs/kata-types/src/mount.rs @@ -446,13 +446,19 @@ pub struct StorageHandlerManager { handlers: HashMap, } -impl Default for StorageHandlerManager { +impl Default for StorageHandlerManager +where + H: Clone, +{ fn default() -> Self { Self::new() } } -impl StorageHandlerManager { +impl StorageHandlerManager +where + H: Clone, +{ /// Create a new instance of `StorageHandlerManager`. pub fn new() -> Self { Self { @@ -461,14 +467,18 @@ impl StorageHandlerManager { } /// Register a storage device handler. - pub fn add_handler(&mut self, id: &str, handler: H) -> Result<()> { - match self.handlers.entry(id.to_string()) { - Entry::Occupied(_) => Err(anyhow!("storage handler for {} already exists", id)), - Entry::Vacant(entry) => { - entry.insert(handler); - Ok(()) + pub fn add_handler(&mut self, ids: &[&str], handler: H) -> Result<()> { + for &id in ids { + match self.handlers.entry(id.to_string()) { + Entry::Occupied(_) => { + return Err(anyhow!("storage handler for {} already exists", id)); + } + Entry::Vacant(entry) => { + entry.insert(handler.clone()); + } } } + Ok(()) } /// Get storage handler with specified `id`.