pub(super) struct L2TableWriteGuard {
table: Arc<L2Table>,
lock: OwnedRwLockWriteGuard<()>,
}Expand description
Write guard for an L2 table.
Owns a reference to the table, so holding it also keeps the table pinned in the L2 cache.
Fields§
§table: Arc<L2Table>Referenced L2 table.
lock: OwnedRwLockWriteGuard<()>Held write guard on that L2 table.
Implementations§
Source§impl L2TableWriteGuard
impl L2TableWriteGuard
Sourcepub fn get_mapping(&self, lookup_cluster: GuestCluster) -> Result<L2Mapping>
pub fn get_mapping(&self, lookup_cluster: GuestCluster) -> Result<L2Mapping>
Look up a cluster mapping.
Sourcepub fn compressed_read_guard(
&self,
cluster: GuestCluster,
) -> Result<Option<CompressedClusterReadGuard<'_>>>
pub fn compressed_read_guard( &self, cluster: GuestCluster, ) -> Result<Option<CompressedClusterReadGuard<'_>>>
Get a read guard for the given compressed cluster.
The returned guard borrows this write guard, so the table cannot be modified while it is held.
Return None if cluster is not compressed (checked under the guard).
Sourcepub fn map_cluster(
&mut self,
index: usize,
host_cluster: HostCluster,
new_allocation: Option<PendingClusters>,
) -> Option<ClustersToFreeEntry>
pub fn map_cluster( &mut self, index: usize, host_cluster: HostCluster, new_allocation: Option<PendingClusters>, ) -> Option<ClustersToFreeEntry>
Enter the given raw data cluster mapping into the L2 table.
If the previous entry pointed to an allocated cluster, return the old allocation so its refcount can be decreased.
If the allocation is reused, None is returned, so this function only returns Some(_) if
some cluster is indeed leaked.
If host_cluster has been newly allocated, new_allocation must be its pending clusters
guard, which is disarmed once the mapping is in place.
Sourcepub fn zero_cluster(
&mut self,
index: usize,
keep_allocation: bool,
) -> Result<Option<ClustersToFreeEntry>>
pub fn zero_cluster( &mut self, index: usize, keep_allocation: bool, ) -> Result<Option<ClustersToFreeEntry>>
Make the given index a zero mapping.
If keep_allocation is true, keep the zero cluster pre-allocated if there is a
pre-existing single-cluster allocation (i.e. data cluster or pre-allocated zero cluster).
Otherwise, the existing mapping is discarded.
If a previous mapping is discarded, return the old allocation so its refcount can be decreased.
Sourcepub fn discard_cluster(&mut self, index: usize) -> Option<ClustersToFreeEntry>
pub fn discard_cluster(&mut self, index: usize) -> Option<ClustersToFreeEntry>
Remove the given mapping, leaving it empty.
If a previous mapping is discarded, return the old allocation so its refcount can be decreased.