diff options
Diffstat (limited to 'src/disk/block.rs')
-rw-r--r-- | src/disk/block.rs | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/src/disk/block.rs b/src/disk/block.rs index 0058b3e..be3d85a 100644 --- a/src/disk/block.rs +++ b/src/disk/block.rs @@ -49,7 +49,7 @@ impl Default for InodeBlock { impl Block for InodeBlock {} -const FULL_MAP: u32 = 0b111_111_111_111_111; +const FULL_MAP: u16 = 0b111_111_111_111_111; #[repr(C)] #[derive(Clone)] @@ -84,7 +84,8 @@ impl Default for DirectoryEntry { #[derive(Clone)] pub struct DirectoryBlock { pub entries: [DirectoryEntry; 15], - reserved: [u8; 136], + pub occupancy: [u8; 2], + reserved: [u8; 134], } impl Default for DirectoryBlock { @@ -107,7 +108,50 @@ impl Default for DirectoryBlock { DirectoryEntry::default(), DirectoryEntry::default(), ], - reserved: [0xFF; 136], + occupancy: [0x80, 0x00], // 0b1000_0000 + reserved: [0xFF; 134], + } + } +} + +impl DirectoryBlock { + pub(crate) fn is_full(&self) -> bool { + self.occupancy[0] == 0xFF && self.occupancy[1] == 0xFF + } + + pub(crate) fn query(&self, mut index: usize) -> bool { + if index < 7 { // 0-6, first u8 + index = index + 1; + self.occupancy[0] & (1 << (7 - index)) as u8 != 0 + } else if index < 15 { // 7-14, second u8 + index = index - 7; + self.occupancy[1] & (1 << (7 - index)) as u8 != 0 + } else { + false + } + } + + pub(crate) fn allocate(&mut self) -> Option<usize> { + 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; + self.occupancy[0] &= !((1 << (7 - index)) as u8); + } else if index < 15 { // 7-14, second u8 + index = index - 7; + self.occupancy[1] &= !((1 << (7 - index)) as u8); } } } |