修复了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,
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(());
}