summaryrefslogtreecommitdiff
path: root/src/disk/block.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/disk/block.rs')
-rw-r--r--src/disk/block.rs168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/disk/block.rs b/src/disk/block.rs
new file mode 100644
index 0000000..d287ee6
--- /dev/null
+++ b/src/disk/block.rs
@@ -0,0 +1,168 @@
+use crate::disk::inode::Inode;
+
+pub trait Block: Default + Clone {}
+
+#[derive(Clone)]
+pub struct DataBlock(pub(crate) [u8; 4096]);
+
+impl Default for DataBlock {
+ fn default() -> Self {
+ Self([0; 4096])
+ }
+}
+
+impl Block for DataBlock {}
+
+#[derive(Clone)]
+pub struct InodeBlock {
+ pub(crate) inodes: [Inode; 16],
+}
+
+impl Default for InodeBlock {
+ fn default() -> Self {
+ Self {
+ inodes: [
+ 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(),
+ ],
+ }
+ }
+}
+
+impl Block for InodeBlock {}
+
+const FULL_MAP: u32 = 0b111_111_111_111_111;
+
+#[derive(Clone)]
+pub struct DirectoryBlock {
+ entries: [[u8; 256]; 15],
+ inode_ids: [usize; 15],
+ occupancy_map: u32,
+ reserved: [u8; 132],
+}
+
+impl Default for DirectoryBlock {
+ fn default() -> Self {
+ Self {
+ entries: [[0; 256]; 15],
+ inode_ids: [0; 15],
+ occupancy_map: 0,
+ reserved: [0xFF; 132],
+ }
+ }
+}
+
+impl Block for DirectoryBlock {}
+
+impl DirectoryBlock {
+ fn vacant(&self) -> bool {
+ self.occupancy_map & FULL_MAP != FULL_MAP
+ }
+
+ fn first_free(&self) -> Option<usize> {
+ todo!()
+ }
+
+ fn mark_busy(&mut self, entry_id: usize) {
+ todo!()
+ }
+
+ /// 需要判断 entry_name.len() <= 255
+ pub fn write_entry(&mut self, entry_name: &[u8], entry_inode_id: usize) -> Option<usize> {
+ if let Some(entry_id) = self.first_free() {
+ self.mark_busy(entry_id);
+ self.entries[entry_id].copy_from_slice(entry_name);
+ self.inode_ids[entry_id] = entry_inode_id;
+ Some(entry_id)
+ } else {
+ None
+ }
+ }
+}
+
+#[derive(Clone)]
+pub struct IndirectBlock {
+ pub entries: [u32; 1024],
+}
+
+impl Default for IndirectBlock {
+ fn default() -> Self {
+ Self { entries: [0; 1024] }
+ }
+}
+
+impl Block for IndirectBlock {}
+
+impl IndirectBlock {
+ pub fn full(&self) -> bool {
+ todo!()
+ }
+
+ pub fn allocate(&mut self) -> Option<usize> {
+ todo!()
+ }
+}
+
+#[derive(Clone)]
+pub struct DoubleIndirectBlock {
+ pub indirect: [u32; 1024],
+}
+
+impl Default for DoubleIndirectBlock {
+ fn default() -> Self {
+ Self {
+ indirect: [0; 1024],
+ }
+ }
+}
+
+impl Block for DoubleIndirectBlock {}
+
+impl DoubleIndirectBlock {
+ pub fn full(&self) -> bool {
+ todo!()
+ }
+
+ pub fn allocate(&mut self) -> Option<usize> {
+ todo!()
+ }
+}
+
+#[derive(Clone)]
+pub struct TripleIndirectBlock {
+ pub double_indirect: [u32; 1024],
+}
+
+impl Default for TripleIndirectBlock {
+ fn default() -> Self {
+ Self {
+ double_indirect: [0; 1024],
+ }
+ }
+}
+
+impl Block for TripleIndirectBlock {}
+
+impl TripleIndirectBlock {
+ pub fn full(&self) -> bool {
+ todo!()
+ }
+
+ pub fn allocate(&mut self) -> Option<usize> {
+ todo!()
+ }
+}