summaryrefslogtreecommitdiff
path: root/src/memory/cached_block.rs
diff options
context:
space:
mode:
authorChuyan Zhang <me@zcy.moe>2023-11-25 19:36:31 -0800
committerChuyan Zhang <me@zcy.moe>2023-11-25 19:36:31 -0800
commit777d5e01a34b8ebe6f1a5751b593266f93e88499 (patch)
tree3857444fd8aa3663cb210358ce71cb5d9ea3018e /src/memory/cached_block.rs
parent76ac602c3d79bb39c133c81a38425a77bc0b8b1f (diff)
downloadmyfs-777d5e01a34b8ebe6f1a5751b593266f93e88499.tar.gz
myfs-777d5e01a34b8ebe6f1a5751b593266f93e88499.zip
Add dir entry operations
Diffstat (limited to 'src/memory/cached_block.rs')
-rw-r--r--src/memory/cached_block.rs22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/memory/cached_block.rs b/src/memory/cached_block.rs
index 77cdf61..783e987 100644
--- a/src/memory/cached_block.rs
+++ b/src/memory/cached_block.rs
@@ -70,6 +70,7 @@ impl<T: Block> BlockCache<T> {
}
/// 从 LRU cache 里获取一个 block 的引用, 如果没有在 cache 中会加载.
+ /// 这个函数不应该返回 None
pub(crate) fn get_block<U: Block>(&mut self, index: usize) -> Option<&CachedBlock<U>> {
if !self.cache.contains(&index) {
self.load_block(index);
@@ -78,11 +79,15 @@ impl<T: Block> BlockCache<T> {
}
/// 从 LRU cache 里获取一个 block 的可变引用, 如果没有在 cache 中会加载.
+ /// 这个函数不应该返回 None
pub(crate) fn get_block_mut<U: Block>(&mut self, index: usize) -> Option<&mut CachedBlock<U>> {
if !self.cache.contains(&index) {
self.load_block(index);
}
- self.cache.get_mut(&index).map(convert_mut::<T, U>)
+ self.cache.get_mut(&index).map(|block| {
+ block.dirty = true;
+ convert_mut::<T, U>(block)
+ })
}
/// 从 LRU cache 中读取一个 block 的引用, *不会* 影响 LRU cache 的结构, 如果没有在 cache 中不会加载.
@@ -97,7 +102,8 @@ impl<T: Block> BlockCache<T> {
pub(crate) fn update_block<U: Block>(&mut self, block: CachedBlock<U>) -> bool {
if self.cache.contains(&block.index) {
- let data_block = convert::<U, T>(&block).clone();
+ let mut data_block = convert::<U, T>(&block).clone();
+ data_block.dirty = true; // TODO 需要把显式写回的都标记为 dirty 吗
self.cache.push(block.index, data_block);
true
} else {
@@ -123,25 +129,29 @@ impl AyaFS {
pub(crate) fn get_block<T: Block>(&mut self, index: usize) -> Option<&CachedBlock<T>> {
self.data_bitmap
.query(index)
- .and_then(|| self.cached_blocks.get_block::<T>(index))
+ .then(|| self.cached_blocks.get_block::<T>(index).unwrap())
+ // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid
}
pub(crate) fn get_block_mut<T: Block>(&mut self, index: usize) -> Option<&mut CachedBlock<T>> {
self.data_bitmap
.query(index)
- .and_then(|| self.cached_blocks.get_block_mut::<T>(index))
+ .then(|| self.cached_blocks.get_block_mut::<T>(index).unwrap())
+ // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid
}
pub(crate) fn peek_block<T: Block>(&self, index: usize) -> Option<&CachedBlock<T>> {
self.data_bitmap
.query(index)
- .and_then(|| self.cached_blocks.peek_block::<T>(index))
+ .then(|| self.cached_blocks.peek_block::<T>(index).unwrap())
+ // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid
}
pub(crate) fn peek_block_mut<T: Block>(&mut self, index: usize) -> Option<&mut CachedBlock<T>> {
self.data_bitmap
.query(index)
- .and_then(|| self.cached_blocks.peek_block_mut::<T>(index))
+ .then(|| self.cached_blocks.peek_block_mut::<T>(index).unwrap())
+ // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid
}
pub(crate) fn update_block<T: Block>(&mut self, block: CachedBlock<T>) -> bool {