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

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

---------

Co-authored-by: Samuel Dai <samuka007@qq.com>
This commit is contained in:
BrahmaMantra 2024-03-31 15:19:12 +08:00 committed by GitHub
parent 9d9a09841c
commit 924d64de8d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -7,9 +7,11 @@ use crate::{
driver::base::device::device_number::DeviceNumber, driver::base::device::device_number::DeviceNumber,
filesystem::vfs::{core::generate_inode_id, FileType}, filesystem::vfs::{core::generate_inode_id, FileType},
ipc::pipe::LockedPipeInode, ipc::pipe::LockedPipeInode,
libs::casting::DowncastArc,
libs::spinlock::{SpinLock, SpinLockGuard}, libs::spinlock::{SpinLock, SpinLockGuard},
time::TimeSpec, time::TimeSpec,
}; };
use alloc::{ use alloc::{
collections::BTreeMap, collections::BTreeMap,
string::String, string::String,
@ -143,7 +145,6 @@ impl RamFS {
return Ok(fs); return Ok(fs);
} }
} }
#[distributed_slice(FSMAKER)] #[distributed_slice(FSMAKER)]
static RAMFSMAKER: FileSystemMaker = FileSystemMaker::new( static RAMFSMAKER: FileSystemMaker = FileSystemMaker::new(
"ramfs", "ramfs",
@ -410,16 +411,30 @@ impl IndexNode for LockedRamFSInode {
target: &Arc<dyn IndexNode>, target: &Arc<dyn IndexNode>,
new_name: &str, new_name: &str,
) -> Result<(), SystemError> { ) -> 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)?; target.unlink(new_name)?;
return Err(err); return Err(e);
} }
return Ok(()); return Ok(());
} }