Refactor easy-fs
This commit is contained in:
parent
c98c7c6558
commit
17580c6902
14 changed files with 329 additions and 278 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue