diff --git a/easy-fs/src/efs.rs b/easy-fs/src/efs.rs index 94b341b..2aff7fd 100644 --- a/easy-fs/src/efs.rs +++ b/easy-fs/src/efs.rs @@ -153,4 +153,16 @@ impl EasyFileSystem { (block_id - self.data_area_start_block) as usize, ) } + /// dealloc a inode + pub fn dealloc_disk_inode(&mut self, inode_id: u32) { + get_block_cache(inode_id as usize, Arc::clone(&self.block_device)) + .lock() + .modify(0, |disk_inode: &mut DataBlock| { + disk_inode.iter_mut().for_each(|p| *p = 0); + }); + self.inode_bitmap.dealloc( + &self.block_device, + (inode_id - self.inode_area_start_block) as usize, + ); + } } diff --git a/easy-fs/src/vfs.rs b/easy-fs/src/vfs.rs index e392a48..534c09d 100644 --- a/easy-fs/src/vfs.rs +++ b/easy-fs/src/vfs.rs @@ -64,9 +64,12 @@ impl Inode { for data_block in data_blocks_dealloc.into_iter() { fs.dealloc_data(data_block); } - // fs.inode_bitmap.dealloc(&fs.block_device, self.id() as usize); } }); + + if self.link_cnt() == 0 { + fs.dealloc_disk_inode(self.id()); + } } #[allow(unused)] fn link_cnt(&self) -> usize {