Kaynağa Gözat

refactor: ext4 init root

liujingx 10 ay önce
ebeveyn
işleme
cb3b10a556
2 değiştirilmiş dosya ile 16 ekleme ve 11 silme
  1. 10 4
      ext4_test/src/main.rs
  2. 6 7
      src/ext4/mod.rs

+ 10 - 4
ext4_test/src/main.rs

@@ -1,7 +1,7 @@
+use block_file::BlockFile;
 use ext4_rs::{Ext4, InodeMode, OpenFlags, EXT4_ROOT_INO};
 use simple_logger::SimpleLogger;
 use std::sync::Arc;
-use block_file::BlockFile;
 
 mod block_file;
 
@@ -22,7 +22,9 @@ fn make_ext4() {
 fn open_ext4() -> Ext4 {
     let file = BlockFile::new("ext4.img");
     println!("creating ext4");
-    Ext4::load(Arc::new(file)).expect("open ext4 failed")
+    let mut ext4 = Ext4::load(Arc::new(file)).expect("open ext4 failed");
+    ext4.init().expect("init ext4 failed");
+    ext4
 }
 
 fn mkdir_test(ext4: &mut Ext4) {
@@ -68,7 +70,9 @@ fn read_write_test(ext4: &mut Ext4) {
     let rfile = ext4
         .generic_open(ROOT_INO, "d3/f0", OpenFlags::O_RDONLY)
         .expect("open failed");
-    let rcount = ext4.read(rfile.inode, 0, &mut rbuffer).expect("read failed");
+    let rcount = ext4
+        .read(rfile.inode, 0, &mut rbuffer)
+        .expect("read failed");
 
     assert_eq!(wbuffer, &rbuffer[..rcount]);
 }
@@ -84,7 +88,9 @@ fn large_read_write_test(ext4: &mut Ext4) {
         .generic_open(ROOT_INO, "d3/f1", OpenFlags::O_RDONLY)
         .expect("open failed");
     let mut rbuffer = vec![0u8; wbuffer.len()];
-    let rcount = ext4.read(rfile.inode, 0,&mut rbuffer).expect("read failed");
+    let rcount = ext4
+        .read(rfile.inode, 0, &mut rbuffer)
+        .expect("read failed");
 
     assert_eq!(wbuffer, &rbuffer[..rcount]);
 }

+ 6 - 7
src/ext4/mod.rs

@@ -19,21 +19,20 @@ pub struct Ext4 {
 
 impl Ext4 {
     /// Opens and loads an Ext4 from the `block_device`.
-    ///
-    /// | Super Block | Group Descriptor | Reserved GDT Blocks |
-    /// | Block Bitmap | Inode Bitmap | Inode Table | Data Blocks |
     pub fn load(block_device: Arc<dyn BlockDevice>) -> Result<Self> {
         // Load the superblock
         // TODO: if the main superblock is corrupted, should we load the backup?
         let block = block_device.read_block(0);
         let super_block = block.read_offset_as::<SuperBlock>(BASE_OFFSET);
         // Create Ext4 instance
-        let mut ext4 = Self {
+        Ok(Self {
             super_block,
             block_device,
-        };
+        })
+    }
+    /// Initializes the root directory.
+    pub fn init(&mut self) -> Result<()> {
         // Create root directory
-        ext4.create_root_inode()?;
-        Ok(ext4)
+        self.create_root_inode().map(|_| ())
     }
 }