mod.rs 1008 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. use crate::constants::*;
  2. use crate::ext4_defs::*;
  3. use crate::prelude::*;
  4. mod alloc;
  5. mod dir;
  6. mod extent;
  7. mod high_level;
  8. mod journal;
  9. mod link;
  10. mod low_level;
  11. mod rw;
  12. #[derive(Debug)]
  13. pub struct Ext4 {
  14. block_device: Arc<dyn BlockDevice>,
  15. super_block: SuperBlock,
  16. }
  17. impl Ext4 {
  18. /// Opens and loads an Ext4 from the `block_device`.
  19. ///
  20. /// | Super Block | Group Descriptor | Reserved GDT Blocks |
  21. /// | Block Bitmap | Inode Bitmap | Inode Table | Data Blocks |
  22. pub fn load(block_device: Arc<dyn BlockDevice>) -> Result<Self> {
  23. // Load the superblock
  24. // TODO: if the main superblock is corrupted, should we load the backup?
  25. let block = block_device.read_block(0);
  26. let super_block = block.read_offset_as::<SuperBlock>(BASE_OFFSET);
  27. // Create Ext4 instance
  28. let mut ext4 = Self {
  29. super_block,
  30. block_device,
  31. };
  32. // Create root directory
  33. ext4.create_root_inode()?;
  34. Ok(ext4)
  35. }
  36. }