Skip to main content

AlignedDevice

Struct AlignedDevice 

Source
pub struct AlignedDevice<D: BlockDevice> { /* private fields */ }
Expand description

Presents a byte-granular BlockDevice over one that accepts only requests whose offset and length are multiples of sector (#373).

The engine reads 1024 bytes at offset 1024 for the superblock, and its write path passes sub-block writes through; a host block resource that only takes sector-aligned I/O refuses both. Here:

  • an aligned request passes straight through, with no copy;
  • an unaligned read reads the enclosing aligned span into a bounce buffer and copies the requested slice out;
  • an unaligned write reads the enclosing span’s first and last sectors, patches the caller’s bytes in, and writes the whole span back as one aligned request.

Every write holds one lock, so a read-modify-write can neither lose nor be lost to a concurrent write into the same sector.

Implementations§

Source§

impl<D: BlockDevice> AlignedDevice<D>

Source

pub fn new(inner: D, sector: u32) -> Self

Wrap inner, whose requests must be multiples of sector bytes. sector must be a power of two.

Trait Implementations§

Source§

impl<D: BlockDevice> BlockDevice for AlignedDevice<D>

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).
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. Read more
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.

Auto Trait Implementations§

§

impl<D> !Freeze for AlignedDevice<D>

§

impl<D> RefUnwindSafe for AlignedDevice<D>
where D: RefUnwindSafe,

§

impl<D> Send for AlignedDevice<D>

§

impl<D> Sync for AlignedDevice<D>

§

impl<D> Unpin for AlignedDevice<D>
where D: Unpin,

§

impl<D> UnsafeUnpin for AlignedDevice<D>
where D: UnsafeUnpin,

§

impl<D> UnwindSafe for AlignedDevice<D>
where D: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.