From 7af0771f9a3031acc36a6990d07bdb92a61c0c75 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Wed, 29 Nov 2023 03:29:34 -0800 Subject: symlink, probably not working --- src/disk/block.rs | 63 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 13 deletions(-) (limited to 'src/disk/block.rs') diff --git a/src/disk/block.rs b/src/disk/block.rs index 26a7ec5..73819e2 100644 --- a/src/disk/block.rs +++ b/src/disk/block.rs @@ -19,7 +19,7 @@ impl Block for DataBlock {} #[repr(C)] #[derive(Clone)] pub struct InodeBlock { - pub(crate) inodes: [Inode; 16], + pub(crate) inodes: [Inode; 32], } impl Default for InodeBlock { @@ -42,6 +42,22 @@ impl Default for InodeBlock { Inode::empty(), Inode::empty(), Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), + Inode::empty(), ], } } @@ -49,8 +65,6 @@ impl Default for InodeBlock { impl Block for InodeBlock {} -const FULL_MAP: u16 = 0b111_111_111_111_111; - #[repr(C)] #[derive(Clone)] pub struct DirectoryEntry { @@ -115,6 +129,7 @@ impl Default for DirectoryBlock { } impl DirectoryBlock { + #[allow(unused)] pub(crate) fn is_full(&self) -> bool { self.occupancy[0] == 0xFF && self.occupancy[1] == 0xFF } @@ -133,20 +148,42 @@ impl DirectoryBlock { } } - pub(crate) fn allocate(&mut self) -> Option { - if self.occupancy[0] != 0xFF { - let leading_ones = self.occupancy[0].leading_ones(); - self.occupancy[0] |= (1 << (7 - leading_ones)) as u8; - Some(leading_ones as usize) - } else if self.occupancy[1] != 0xFF { - let leading_ones = self.occupancy[1].leading_ones(); - self.occupancy[1] |= (1 << (7 - leading_ones)) as u8; - Some(7 + leading_ones as usize) + pub(crate) fn allocate(&mut self, mut index: usize) -> bool { + if index < 7 { + index = index + 1; + let mask = (1 << (7 - index)) as u8; + if self.occupancy[0] & mask != 0 { + false + } else { + self.occupancy[0] |= mask; + true + } } else { - None + index = index - 7; + let mask = (1 << (7 - index)) as u8; + if self.occupancy[1] & mask != 0 { + false + } else { + self.occupancy[1] |= mask; + true + } } } + // pub(crate) fn allocate(&mut self) -> Option { + // if self.occupancy[0] != 0xFF { + // let leading_ones = self.occupancy[0].leading_ones(); + // self.occupancy[0] |= (1 << (7 - leading_ones)) as u8; + // Some(leading_ones as usize) + // } else if self.occupancy[1] != 0xFF { + // let leading_ones = self.occupancy[1].leading_ones(); + // self.occupancy[1] |= (1 << (7 - leading_ones)) as u8; + // Some(7 + leading_ones as usize) + // } else { + // None + // } + // } + pub(crate) fn deallocate(&mut self, mut index: usize) { if index < 7 { index = index + 1; -- cgit v1.2.3-70-g09d2