diff --git a/storage/ahcid/src/scheme.rs b/storage/ahcid/src/scheme.rs index 4655529a6b..437f70bd2c 100644 --- a/storage/ahcid/src/scheme.rs +++ b/storage/ahcid/src/scheme.rs @@ -22,7 +22,7 @@ enum Handle { pub struct DiskScheme { scheme_name: String, hba_mem: &'static mut HbaMem, - disks: Box<[DiskWrapper]>, + disks: Box<[DiskWrapper>]>, handles: BTreeMap, next_id: usize, } diff --git a/storage/bcm2835-sdhcid/src/scheme.rs b/storage/bcm2835-sdhcid/src/scheme.rs index 7b5b195c61..66f469a943 100644 --- a/storage/bcm2835-sdhcid/src/scheme.rs +++ b/storage/bcm2835-sdhcid/src/scheme.rs @@ -19,7 +19,7 @@ enum Handle { pub struct DiskScheme { scheme_name: String, - disks: Box<[DiskWrapper]>, + disks: Box<[DiskWrapper>]>, handles: BTreeMap, next_id: usize, } diff --git a/storage/driver-block/src/lib.rs b/storage/driver-block/src/lib.rs index 24e45b8a1b..12d0926204 100644 --- a/storage/driver-block/src/lib.rs +++ b/storage/driver-block/src/lib.rs @@ -60,13 +60,31 @@ pub trait Disk { fn write(&mut self, block: u64, buffer: &[u8]) -> syscall::Result>; } -pub struct DiskWrapper { - pub disk: Box, +impl Disk for Box { + fn block_length(&mut self) -> u32 { + (**self).block_length() + } + + fn size(&mut self) -> u64 { + (**self).size() + } + + fn read(&mut self, block: u64, buffer: &mut [u8]) -> syscall::Result> { + (**self).read(block, buffer) + } + + fn write(&mut self, block: u64, buffer: &[u8]) -> syscall::Result> { + (**self).write(block, buffer) + } +} + +pub struct DiskWrapper { + pub disk: T, pub pt: Option, } -impl DiskWrapper { - pub fn pt(disk: &mut dyn Disk) -> Option { +impl DiskWrapper { + pub fn pt(disk: &mut T) -> Option { let bs = match disk.block_length() { 512 => LogicalBlockSize::Lb512, 4096 => LogicalBlockSize::Lb4096, @@ -133,23 +151,23 @@ impl DiskWrapper { .flatten() } - pub fn new(mut disk: Box) -> Self { + pub fn new(mut disk: T) -> Self { Self { - pt: Self::pt(&mut *disk), + pt: Self::pt(&mut disk), disk, } } } -impl std::ops::Deref for DiskWrapper { - type Target = dyn Disk; +impl std::ops::Deref for DiskWrapper { + type Target = T; fn deref(&self) -> &Self::Target { - &*self.disk + &self.disk } } -impl std::ops::DerefMut for DiskWrapper { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut *self.disk +impl std::ops::DerefMut for DiskWrapper { + fn deref_mut(&mut self) -> &mut T { + &mut self.disk } } diff --git a/storage/ided/src/scheme.rs b/storage/ided/src/scheme.rs index aca709013e..fb0fa26169 100644 --- a/storage/ided/src/scheme.rs +++ b/storage/ided/src/scheme.rs @@ -22,7 +22,7 @@ enum Handle { pub struct DiskScheme { scheme_name: String, chans: Box<[Arc>]>, - disks: Box<[DiskWrapper]>, + disks: Box<[DiskWrapper>]>, handles: BTreeMap, next_id: usize, }