Struct L2Entry

Source
pub(super) struct L2Entry(u64);
Expand description

L2 table entry.

  • Bit 0 - 61: Cluster descriptor
  • Bit 62: 0 for standard clusters, 1 for compressed clusters
  • Bit 63: 0 for clusters that are unused, compressed or require COW. 1 for standard clusters whose refcount is exactly one. This information is only accurate in L2 tables that are reachable from the active L1 table. With external data files, all guest clusters have an implicit refcount of 1 (because of the fixed host = guest mapping for guest cluster offsets), so this bit should be 1 for all allocated clusters.

Standard Cluster Descriptor:

  • Bit 0: If set to 1, the cluster reads as all zeros. The host cluster offset can be used to describe a preallocation, but it won’t be used for reading data from this cluster, nor is data read from the backing file if the cluster is unallocated. With version 2 or with extended L2 entries (see the next section), this is always 0.
  • Bit 1 – 8: Reserved (set to 0)
  • Bit 9 – 55: Bits 9-55 of host cluster offset. Must be aligned to a cluster boundary. If the offset is 0 and bit 63 is clear, the cluster is unallocated. The offset may only be 0 with bit 63 set (indicating a host cluster offset of 0) when an external data file is used.
  • Bit 56 - 61: Reserved (set to 0)

Compressed Cluster Descriptor (x = 62 - (cluster_bits - 8)):

  • Bit 0 - x-1: Host cluster offset. This is usually not aligned to a cluster or sector boundary! If cluster_bits is small enough that this field includes bits beyond 55, those upper bits must be set to 0.
  • Bit x - 61: Number of additional 512-byte sectors used for the compressed data, beyond the sector containing the offset in the previous field. Some of these sectors may reside in the next contiguous host cluster. Note that the compressed data does not necessarily occupy all of the bytes in the final sector; rather, decompression stops when it has produced a cluster of data. Another compressed cluster may map to the tail of the final sector used by this compressed cluster.

Tuple Fields§

§0: u64

Implementations§

Source§

impl L2Entry

Source

pub fn cluster_offset(&self, external_data_file: bool) -> Option<HostOffset>

Offset of the data cluster, if any.

Assumes the L2 entry references a data cluster, not a compressed cluster.

external_data_file must be true when using an external data file; in this case, offset 0 is a valid offset, and can only be distinguished from “unallocated” by whether the COPIED flag is set or not (which it always is when using an external data file).

Source

pub fn is_compressed(&self) -> bool

Whether the cluster is compressed.

Source

pub fn is_copied(&self) -> bool

Whether the cluster is “copied”.

true means is refcount is one, false means modifying it will require COW.

Source

pub fn without_copied(self) -> Self

Clear “copied” flag.

Source

pub fn is_zero(&self) -> bool

Whether the cluster is a zero cluster.

Assumes the L2 entry references a data cluster, not a compressed cluster.

Source

pub fn reserved_bits(&self) -> u64

Return all reserved bits.

Source

pub fn compressed_descriptor(&self) -> u64

Return the full compressed cluster descriptor.

Source

pub fn compressed_range(&self, cluster_bits: u32) -> Option<(HostOffset, u64)>

If this entry is compressed, return the start host offset and upper limit on the compressed number of bytes.

Source

fn allocation( &self, cluster_bits: u32, external_data_file: bool, ) -> Option<(HostCluster, ClusterCount)>

If this entry is allocated, return the first host cluster and the number of clusters it references.

external_data_file must be true when using an external data file.

Source

fn into_mapping( self, guest_cluster: GuestCluster, cluster_bits: u32, external_data_file: bool, ) -> Result<L2Mapping>

Return the high-level L2Mapping representation.

guest_cluster is the guest cluster being accessed, cluster_bits is log2 of the cluster size. external_data_file must be true when using an external data file.

Source

fn from_mapping(value: L2Mapping, cluster_bits: u32) -> Self

Create an L2 entry from its high-level L2Mapping representation.

Trait Implementations§

Source§

impl Clone for L2Entry

Source§

fn clone(&self) -> L2Entry

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for L2Entry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for L2Entry

Source§

fn default() -> L2Entry

Returns the “default value” for a type. Read more
Source§

impl Copy for L2Entry

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more