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
impl L2Entry
Sourcepub fn cluster_offset(&self, external_data_file: bool) -> Option<HostOffset>
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).
Sourcepub fn is_compressed(&self) -> bool
pub fn is_compressed(&self) -> bool
Whether the cluster is compressed.
Sourcepub fn is_copied(&self) -> bool
pub fn is_copied(&self) -> bool
Whether the cluster is “copied”.
true
means is refcount is one, false
means modifying it will require COW.
Sourcepub fn without_copied(self) -> Self
pub fn without_copied(self) -> Self
Clear “copied” flag.
Sourcepub fn is_zero(&self) -> bool
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.
Sourcepub fn reserved_bits(&self) -> u64
pub fn reserved_bits(&self) -> u64
Return all reserved bits.
Sourcepub fn compressed_descriptor(&self) -> u64
pub fn compressed_descriptor(&self) -> u64
Return the full compressed cluster descriptor.
Sourcepub fn compressed_range(&self, cluster_bits: u32) -> Option<(HostOffset, u64)>
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.
Sourcefn allocation(
&self,
cluster_bits: u32,
external_data_file: bool,
) -> Option<(HostCluster, ClusterCount)>
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.
Sourcefn into_mapping(
self,
guest_cluster: GuestCluster,
cluster_bits: u32,
external_data_file: bool,
) -> Result<L2Mapping>
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.
Sourcefn from_mapping(value: L2Mapping, cluster_bits: u32) -> Self
fn from_mapping(value: L2Mapping, cluster_bits: u32) -> Self
Create an L2 entry from its high-level L2Mapping
representation.