Skip to main content

BlockDevice

Trait BlockDevice 

Source
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§

Source

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

Total device size in bytes (for bounds-checking).

Provided Methods§

Source

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<()>

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

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>)

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.

Source

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<()>

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".

Implementors§