Refactor easy-fs

This commit is contained in:
Yifan Wu 2021-02-24 03:42:45 +08:00
parent c98c7c6558
commit 17580c6902
14 changed files with 329 additions and 278 deletions

View file

@ -2,7 +2,7 @@ use core::fmt::{Debug, Formatter, Result};
use super::{
BLOCK_SZ,
BlockDevice,
Dirty,
get_block_cache,
};
use alloc::sync::Arc;
use alloc::vec::Vec;
@ -87,6 +87,7 @@ impl DiskInode {
pub fn is_dir(&self) -> bool {
self.type_ == DiskInodeType::Directory
}
#[allow(unused)]
pub fn is_file(&self) -> bool {
self.type_ == DiskInodeType::File
}
@ -102,14 +103,11 @@ impl DiskInode {
self.direct[inner_id]
} else {
// only support indirect1 now
Dirty::<IndirectBlock>::new(
self.indirect1 as usize,
0,
block_device.clone()
).read(|indirect_block| {
// it will panic if file is too large
indirect_block[inner_id - INODE_DIRECT_COUNT]
})
get_block_cache(self.indirect1 as usize, Arc::clone(block_device))
.lock()
.read(0, |indirect_block: &IndirectBlock| {
indirect_block[inner_id - INODE_DIRECT_COUNT]
})
}
}
pub fn blocks_num_needed(&self, new_size: u32) -> u32 {
@ -126,11 +124,12 @@ impl DiskInode {
let last_blocks = self.blocks();
self.size = new_size;
let current_blocks = self.blocks();
Dirty::<IndirectBlock>::new(
get_block_cache(
self.indirect1 as usize,
0,
block_device.clone()
).modify(|indirect_block| {
Arc::clone(block_device)
)
.lock()
.modify(0, |indirect_block: &mut IndirectBlock| {
for i in 0..current_blocks - last_blocks {
let inner_id = (last_blocks + i) as usize;
let new_block = new_blocks[i as usize];
@ -152,11 +151,12 @@ impl DiskInode {
self.direct[i] = 0;
}
if blocks > INODE_DIRECT_COUNT {
Dirty::<IndirectBlock>::new(
get_block_cache(
self.indirect1 as usize,
0,
block_device.clone(),
).modify(|indirect_block| {
Arc::clone(block_device),
)
.lock()
.modify(0, |indirect_block: &mut IndirectBlock| {
for i in 0..blocks - INODE_DIRECT_COUNT {
v.push(indirect_block[i]);
indirect_block[i] = 0;
@ -185,11 +185,12 @@ impl DiskInode {
// read and update read size
let block_read_size = end_current_block - start;
let dst = &mut buf[read_size..read_size + block_read_size];
Dirty::<DataBlock>::new(
get_block_cache(
self.get_block_id(start_block as u32, block_device) as usize,
0,
block_device.clone()
).read(|data_block| {
Arc::clone(block_device),
)
.lock()
.read(0, |data_block: &DataBlock| {
let src = &data_block[start % BLOCK_SZ..start % BLOCK_SZ + block_read_size];
dst.copy_from_slice(src);
});
@ -219,11 +220,12 @@ impl DiskInode {
end_current_block = end_current_block.min(end);
// write and update write size
let block_write_size = end_current_block - start;
Dirty::<DataBlock>::new(
get_block_cache(
self.get_block_id(start_block as u32, block_device) as usize,
0,
block_device.clone()
).modify(|data_block| {
Arc::clone(block_device)
)
.lock()
.modify(0, |data_block: &mut DataBlock| {
let src = &buf[write_size..write_size + block_write_size];
let dst = &mut data_block[start % BLOCK_SZ..start % BLOCK_SZ + block_write_size];
dst.copy_from_slice(src);