diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index ef81f3da..055e13a9 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/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, new_name: &str, ) -> Result<(), SystemError> { - let old_inode: Arc = self.find(old_name)?; + let inode: Arc = self.find(old_name)?; + // 修改其对父节点的引用 + inode + .downcast_ref::() + .ok_or(SystemError::EPERM)? + .0 + .lock() + .parent = Arc::downgrade( + &target + .clone() + .downcast_arc::() + .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(()); }