Browse Source

修复了ramfs中move_to未更新parent字段的bug (#673)

修复了ramfs中move_to未更新parent字段的bug

---------

Co-authored-by: Samuel Dai <[email protected]>
BrahmaMantra 11 months ago
parent
commit
924d64de8d
1 changed files with 21 additions and 6 deletions
  1. 21 6
      kernel/src/filesystem/ramfs/mod.rs

+ 21 - 6
kernel/src/filesystem/ramfs/mod.rs

@@ -7,9 +7,11 @@ use crate::{
     driver::base::device::device_number::DeviceNumber,
     filesystem::vfs::{core::generate_inode_id, FileType},
     ipc::pipe::LockedPipeInode,
+    libs::casting::DowncastArc,
     libs::spinlock::{SpinLock, SpinLockGuard},
     time::TimeSpec,
 };
+
 use alloc::{
     collections::BTreeMap,
     string::String,
@@ -143,7 +145,6 @@ impl RamFS {
         return Ok(fs);
     }
 }
-
 #[distributed_slice(FSMAKER)]
 static RAMFSMAKER: FileSystemMaker = FileSystemMaker::new(
     "ramfs",
@@ -410,16 +411,30 @@ impl IndexNode for LockedRamFSInode {
         target: &Arc<dyn IndexNode>,
         new_name: &str,
     ) -> Result<(), SystemError> {
-        let old_inode: Arc<dyn IndexNode> = self.find(old_name)?;
+        let inode: Arc<dyn IndexNode> = self.find(old_name)?;
+        // 修改其对父节点的引用
+        inode
+            .downcast_ref::<LockedRamFSInode>()
+            .ok_or(SystemError::EPERM)?
+            .0
+            .lock()
+            .parent = Arc::downgrade(
+            &target
+                .clone()
+                .downcast_arc::<LockedRamFSInode>()
+                .ok_or(SystemError::EPERM)?,
+        );
 
         // 在新的目录下创建一个硬链接
-        target.link(new_name, &old_inode)?;
+        target.link(new_name, &inode)?;
+
         // 取消现有的目录下的这个硬链接
-        if let Err(err) = self.unlink(old_name) {
-            // 如果取消失败,那就取消新的目录下的硬链接
+        if let Err(e) = self.unlink(old_name) {
+            // 当操作失败时回退操作
             target.unlink(new_name)?;
-            return Err(err);
+            return Err(e);
         }
+
         return Ok(());
     }