mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
修复了ramfs中move_to未更新parent字段的bug (#673)
修复了ramfs中move_to未更新parent字段的bug --------- Co-authored-by: Samuel Dai <samuka007@qq.com>
This commit is contained in:
parent
9d9a09841c
commit
924d64de8d
@ -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(());
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user