mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 02:46:47 +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,
|
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(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user