summaryrefslogtreecommitdiff
path: root/src/disk/block.rs
diff options
context:
space:
mode:
authorChuyan Zhang <me@zcy.moe>2023-11-29 03:29:34 -0800
committerChuyan Zhang <me@zcy.moe>2023-11-29 03:29:34 -0800
commit7af0771f9a3031acc36a6990d07bdb92a61c0c75 (patch)
tree3db3c79b8d385bc949c8486d97def8dadd4323e6 /src/disk/block.rs
parentceb83a7214000ccd048857b40cc0ebfc54290731 (diff)
downloadmyfs-7af0771f9a3031acc36a6990d07bdb92a61c0c75.tar.gz
myfs-7af0771f9a3031acc36a6990d07bdb92a61c0c75.zip
symlink, probably not working
Diffstat (limited to 'src/disk/block.rs')
-rw-r--r--src/disk/block.rs63
1 files changed, 50 insertions, 13 deletions
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<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)
+ 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<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;