pub trait BlockDevice: Send + Sync {
// Required methods
fn read_at(&self, offset: u64, buf: &mut [u8]) -> Result<()>;
fn size_bytes(&self) -> u64;
// Provided methods
fn write_at(&self, _offset: u64, _buf: &[u8]) -> Result<()> { ... }
fn flush(&self) -> Result<()> { ... }
fn is_writable(&self) -> bool { ... }
fn populate_cache(&self, _block: u64, _bytes: Vec<u8>) { ... }
fn unpin_all(&self) { ... }
fn invalidate_cache(&self) -> Result<()> { ... }
}Expand description
Random-access block device. Reads required; writes optional.
Required Methods§
Sourcefn 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).
Sourcefn size_bytes(&self) -> u64
fn size_bytes(&self) -> u64
Total device size in bytes (for bounds-checking).
Provided Methods§
Sourcefn 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.
Sourcefn 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.
Sourcefn 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.
Sourcefn 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.
Pinned entries inserted via populate_cache MUST NOT be evicted
— they’re the only place those bytes exist until unpin_all
runs (typically after journal replay). Devices without a cache
(raw FileDevice, etc.) implement this as a no-op and the
caller’s bytes simply have no in-memory shadow; that’s safe
because un-cached devices imply no separate journal log either.
Sourcefn 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.
Sourcefn 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.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".