summaryrefslogtreecommitdiff
path: root/src/memory/cached_block.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/memory/cached_block.rs')
-rw-r--r--src/memory/cached_block.rs16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/memory/cached_block.rs b/src/memory/cached_block.rs
index 9e266ef..eb59a4b 100644
--- a/src/memory/cached_block.rs
+++ b/src/memory/cached_block.rs
@@ -2,6 +2,7 @@ use crate::block_device::{BlockDevice, BLOCK_SIZE};
use crate::disk::block::Block;
use crate::AyaFS;
use and_then_some::BoolExt;
+use log::debug;
use lru::LruCache;
use std::num::NonZeroUsize;
use std::sync::Arc;
@@ -46,11 +47,9 @@ impl<T: Block> BlockCache<T> {
pub(crate) fn load_block(&mut self, index: usize) -> bool {
if self.cache.contains(&index) == false {
- let block = T::default();
- let buffer = unsafe {
- std::slice::from_raw_parts_mut(&block as *const T as *mut u8, BLOCK_SIZE)
- };
- self.device.read(index, buffer);
+ let mut buffer = [0u8; BLOCK_SIZE];
+ self.device.read(index, &mut buffer);
+ let block: T = unsafe { std::mem::transmute_copy(&buffer) };
let cached_block = CachedBlock {
block,
index,
@@ -77,8 +76,11 @@ impl<T: Block> BlockCache<T> {
/// 从 LRU cache 里获取一个 block 的可变引用, 如果没有在 cache 中会加载.
pub(crate) fn get_block_mut<U: Block>(&mut self, index: usize) -> Option<&mut CachedBlock<U>> {
- self.load_block(index)
- .and_then(|| self.cache.get_mut(&index).map(convert_mut::<T, U>))
+ debug!("Blockcache get block mut");
+ self.load_block(index).and_then(|| {
+ debug!("block loaded");
+ self.cache.get_mut(&index).map(convert_mut::<T, U>)
+ })
}
/// 从 LRU cache 中读取一个 block 的引用, *不会* 影响 LRU cache 的结构, 如果没有在 cache 中不会加载.