From 777d5e01a34b8ebe6f1a5751b593266f93e88499 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Sat, 25 Nov 2023 19:36:31 -0800 Subject: Add dir entry operations --- src/memory/cached_block.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/memory/cached_block.rs') 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 BlockCache { } /// 从 LRU cache 里获取一个 block 的引用, 如果没有在 cache 中会加载. + /// 这个函数不应该返回 None pub(crate) fn get_block(&mut self, index: usize) -> Option<&CachedBlock> { if !self.cache.contains(&index) { self.load_block(index); @@ -78,11 +79,15 @@ impl BlockCache { } /// 从 LRU cache 里获取一个 block 的可变引用, 如果没有在 cache 中会加载. + /// 这个函数不应该返回 None pub(crate) fn get_block_mut(&mut self, index: usize) -> Option<&mut CachedBlock> { if !self.cache.contains(&index) { self.load_block(index); } - self.cache.get_mut(&index).map(convert_mut::) + self.cache.get_mut(&index).map(|block| { + block.dirty = true; + convert_mut::(block) + }) } /// 从 LRU cache 中读取一个 block 的引用, *不会* 影响 LRU cache 的结构, 如果没有在 cache 中不会加载. @@ -97,7 +102,8 @@ impl BlockCache { pub(crate) fn update_block(&mut self, block: CachedBlock) -> bool { if self.cache.contains(&block.index) { - let data_block = convert::(&block).clone(); + let mut data_block = convert::(&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(&mut self, index: usize) -> Option<&CachedBlock> { self.data_bitmap .query(index) - .and_then(|| self.cached_blocks.get_block::(index)) + .then(|| self.cached_blocks.get_block::(index).unwrap()) + // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid } pub(crate) fn get_block_mut(&mut self, index: usize) -> Option<&mut CachedBlock> { self.data_bitmap .query(index) - .and_then(|| self.cached_blocks.get_block_mut::(index)) + .then(|| self.cached_blocks.get_block_mut::(index).unwrap()) + // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid } pub(crate) fn peek_block(&self, index: usize) -> Option<&CachedBlock> { self.data_bitmap .query(index) - .and_then(|| self.cached_blocks.peek_block::(index)) + .then(|| self.cached_blocks.peek_block::(index).unwrap()) + // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid } pub(crate) fn peek_block_mut(&mut self, index: usize) -> Option<&mut CachedBlock> { self.data_bitmap .query(index) - .and_then(|| self.cached_blocks.peek_block_mut::(index)) + .then(|| self.cached_blocks.peek_block_mut::(index).unwrap()) + // 返回 None 当且仅当 data_bitmap 中这个 block 为 invalid } pub(crate) fn update_block(&mut self, block: CachedBlock) -> bool { -- cgit v1.2.3-70-g09d2