summaryrefslogtreecommitdiff
path: root/src/disk/block.rs
diff options
context:
space:
mode:
authorChuyan Zhang <me@zcy.moe>2023-11-25 19:36:31 -0800
committerChuyan Zhang <me@zcy.moe>2023-11-25 19:36:31 -0800
commit777d5e01a34b8ebe6f1a5751b593266f93e88499 (patch)
tree3857444fd8aa3663cb210358ce71cb5d9ea3018e /src/disk/block.rs
parent76ac602c3d79bb39c133c81a38425a77bc0b8b1f (diff)
downloadmyfs-777d5e01a34b8ebe6f1a5751b593266f93e88499.tar.gz
myfs-777d5e01a34b8ebe6f1a5751b593266f93e88499.zip
Add dir entry operations
Diffstat (limited to 'src/disk/block.rs')
-rw-r--r--src/disk/block.rs50
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);
}
}
}