diff options
Diffstat (limited to 'src/memory/cached_block.rs')
-rw-r--r-- | src/memory/cached_block.rs | 22 |
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 { |