pub struct CachedDevice { /* private fields */ }Expand description
LRU-cached BlockDevice. Pass-through for is_writable + size_bytes; caches block-aligned reads, invalidates on writes.
Implementations§
Source§impl CachedDevice
impl CachedDevice
Sourcepub fn new(
inner: Arc<dyn BlockDevice>,
block_size: u32,
capacity: usize,
) -> Self
pub fn new( inner: Arc<dyn BlockDevice>, block_size: u32, capacity: usize, ) -> Self
Wrap inner with an LRU of capacity blocks. Pick capacity
based on workload: 64 blocks (256 KiB at 4 KiB) is a reasonable
default for general use; bigger directory walks benefit from 256+.
Sourcepub fn pinned_blocks(&self) -> usize
pub fn pinned_blocks(&self) -> usize
How many blocks are pinned: held whatever the capacity, because their bytes are not yet at their final location on the device.
Trait Implementations§
Source§impl BlockDevice for CachedDevice
impl BlockDevice for CachedDevice
Source§fn read_at(&self, offset: u64, buf: &mut [u8]) -> Result<()>
fn read_at(&self, offset: u64, buf: &mut [u8]) -> Result<()>
Read exactly
buf.len() bytes starting at offset (bytes from start of device).Source§fn size_bytes(&self) -> u64
fn size_bytes(&self) -> u64
Total device size in bytes (for bounds-checking).
Source§fn write_at(&self, offset: u64, buf: &[u8]) -> Result<()>
fn write_at(&self, offset: u64, buf: &[u8]) -> Result<()>
Write exactly
buf.len() bytes at offset. Default: returns an error
for read-only devices. Writable devices override this.Source§fn flush(&self) -> Result<()>
fn flush(&self) -> Result<()>
Flush any pending writes to stable storage. Default: no-op for
read-only devices; writable devices should implement fsync semantics.
Source§fn is_writable(&self) -> bool
fn is_writable(&self) -> bool
Reports whether
write_at is likely to succeed. Used by the mount
path to decide whether journal replay is possible.Source§fn populate_cache(&self, block: u64, bytes: Vec<u8>)
fn populate_cache(&self, block: u64, bytes: Vec<u8>)
Buffer-cache hook: stash
bytes for block so a subsequent
read_at returns those bytes instead of reading from physical
storage. Used by a read-only mount’s journal replay to make
committed metadata visible to readers without writing it back to
the data area on disk. Read moreSource§fn unpin_all(&self)
fn unpin_all(&self)
Buffer-cache hook: tell the device the journal has been
checkpointed, so any blocks pinned via
populate_cache are now
consistent with disk and can be evicted under normal LRU
pressure. No-op for un-cached devices.Source§fn invalidate_cache(&self) -> Result<()>
fn invalidate_cache(&self) -> Result<()>
Discard clean read-cache entries. Pinned journal metadata must be
checkpointed and unpinned first; cached implementations reject otherwise.
This does not flush writes and requires exclusive filesystem ownership.
Auto Trait Implementations§
impl !Freeze for CachedDevice
impl !RefUnwindSafe for CachedDevice
impl !UnwindSafe for CachedDevice
impl Send for CachedDevice
impl Sync for CachedDevice
impl Unpin for CachedDevice
impl UnsafeUnpin for CachedDevice
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more