ソースを参照

fix: dir remove entry

liujingx 11 ヶ月 前
コミット
7e61bdfb41
3 ファイル変更24 行追加8 行削除
  1. 15 3
      ext4_test/src/main.rs
  2. 8 5
      src/ext4/dir.rs
  3. 1 0
      src/ext4_defs/file.rs

+ 15 - 3
ext4_test/src/main.rs

@@ -39,7 +39,6 @@ impl BlockDevice for BlockFile {
 
 fn logger_init() {
     SimpleLogger::new().init().unwrap();
-    log::set_max_level(log::LevelFilter::Debug);
 }
 
 fn make_ext4() {
@@ -95,10 +94,10 @@ fn read_write_test(ext4: &mut Ext4) {
 
 fn large_read_write_test(ext4: &mut Ext4) {
     let wbuffer = vec![99u8; 1024 * 1024 * 16];
-    let mut wfile = ext4.open("d3/f2", "w+", true).expect("open failed");
+    let mut wfile = ext4.open("d3/f1", "w+", true).expect("open failed");
     ext4.write(&mut wfile, &wbuffer).expect("write failed");
 
-    let mut rfile = ext4.open("d3/f2", "r", true).expect("open failed");
+    let mut rfile = ext4.open("d3/f1", "r", true).expect("open failed");
     let mut rbuffer = vec![0u8; wbuffer.len()];
     ext4.read(&mut rfile, &mut rbuffer, wbuffer.len())
         .expect("read failed");
@@ -106,8 +105,18 @@ fn large_read_write_test(ext4: &mut Ext4) {
     assert_eq!(wbuffer, rbuffer);
 }
 
+fn remove_file_test(ext4: &mut Ext4) {
+    ext4.remove_file("d3/f0").expect("remove file failed");
+    ext4.open("d3/f0", "r", true).expect_err("open failed");
+    ext4.remove_file("d3/f1").expect("remove file failed");
+    ext4.open("d3/f1", "r", true).expect_err("open failed");
+    ext4.remove_file("f1").expect("remove file failed");
+    ext4.open("f1", "r", true).expect_err("open failed");
+}
+
 fn main() {
     logger_init();
+    log::set_max_level(log::LevelFilter::Off);
     make_ext4();
     println!("ext4.img created");
     let mut ext4 = open_ext4();
@@ -120,4 +129,7 @@ fn main() {
     println!("read write test done");
     large_read_write_test(&mut ext4);
     println!("large read write test done");
+    log::set_max_level(log::LevelFilter::Debug);
+    remove_file_test(&mut ext4);
+    println!("remove file test done");
 }

+ 8 - 5
src/ext4/dir.rs

@@ -85,7 +85,8 @@ impl Ext4 {
             // Load the block from disk
             let mut block = self.read_block(fblock);
             // Try removing the entry
-            if let Ok(inode) = self.remove_entry_from_block(&mut block, name) {
+            if let Ok(inode) = Self::remove_entry_from_block(&mut block, name) {
+                self.write_block(&block);
                 return Ok(inode);
             }
             // Current block has no enough space
@@ -103,26 +104,28 @@ impl Ext4 {
         while offset < BLOCK_SIZE {
             let de: DirEntry = block.read_offset_as(offset);
             debug!("Dir entry: {} {:?}", de.rec_len(), de.name());
-            offset += de.rec_len() as usize;
             if !de.unused() && de.compare_name(name) {
                 return Ok(de);
             }
+            offset += de.rec_len() as usize;
         }
         Err(Ext4Error::new(ErrCode::ENOENT))
     }
 
     /// Remove a directory entry that matches a given name from a given block
-    fn remove_entry_from_block(&self, block: &mut Block, name: &str) -> Result<InodeId> {
+    fn remove_entry_from_block(block: &mut Block, name: &str) -> Result<InodeId> {
         info!("Dir remove entry {} from block {}", name, block.block_id);
         let mut offset = 0;
         while offset < BLOCK_SIZE {
             let mut de: DirEntry = block.read_offset_as(offset);
-            offset += de.rec_len() as usize;
             if !de.unused() && de.compare_name(name) {
+                let inode = de.inode();
                 // Mark the target entry as unused
                 de.set_unused();
-                return Ok(de.inode());
+                block.write_offset_as(offset, &de);
+                return Ok(inode);
             }
+            offset += de.rec_len() as usize;
         }
         Err(Ext4Error::new(ErrCode::ENOENT))
     }

+ 1 - 0
src/ext4_defs/file.rs

@@ -2,6 +2,7 @@ use super::MountPoint;
 use crate::prelude::*;
 
 /// 文件描述符
+#[derive(Debug)]
 pub struct File {
     /// 挂载点句柄
     pub mp: MountPoint,