From 39203abc4c0c31f8f86586db75bd73ebc6194bf1 Mon Sep 17 00:00:00 2001 From: brahmamantra <2033552517@qq.com> Date: Wed, 27 Mar 2024 14:46:36 +0000 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86ramfs=E4=B8=ADmo?= =?UTF-8?q?ve=5Fto=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/filesystem/ramfs/mod.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index ef81f3da4..05da35290 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -143,7 +143,6 @@ impl RamFS { return Ok(fs); } } - #[distributed_slice(FSMAKER)] static RAMFSMAKER: FileSystemMaker = FileSystemMaker::new( "ramfs", @@ -420,9 +419,22 @@ impl IndexNode for LockedRamFSInode { target.unlink(new_name)?; return Err(err); } + //转型为&LockedRamFSInode类型 + let target: &LockedRamFSInode = target + .downcast_ref::() + .ok_or(SystemError::EPERM)?; + let old_inode: &LockedRamFSInode = old_inode + .downcast_ref::() + .ok_or(SystemError::EPERM)?; + + //修改其对父节点的引用 + let mut old_inode=old_inode.0.lock(); + let target=target.0.lock(); + old_inode.parent=target.self_ref.clone(); return Ok(()); } + fn find(&self, name: &str) -> Result, SystemError> { let inode = self.0.lock(); From 54a80ee6d535c491344c4939eec07c1a0ee25969 Mon Sep 17 00:00:00 2001 From: brahmamantra <2033552517@qq.com> Date: Thu, 28 Mar 2024 03:07:00 +0000 Subject: [PATCH 2/6] =?UTF-8?q?=E8=BF=90=E8=A1=8C=E4=BA=86make=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/filesystem/ramfs/mod.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index 05da35290..93a553e92 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -421,20 +421,19 @@ impl IndexNode for LockedRamFSInode { } //转型为&LockedRamFSInode类型 let target: &LockedRamFSInode = target - .downcast_ref::() - .ok_or(SystemError::EPERM)?; + .downcast_ref::() + .ok_or(SystemError::EPERM)?; let old_inode: &LockedRamFSInode = old_inode - .downcast_ref::() - .ok_or(SystemError::EPERM)?; + .downcast_ref::() + .ok_or(SystemError::EPERM)?; //修改其对父节点的引用 - let mut old_inode=old_inode.0.lock(); - let target=target.0.lock(); - old_inode.parent=target.self_ref.clone(); + let mut old_inode = old_inode.0.lock(); + let target = target.0.lock(); + old_inode.parent = target.self_ref.clone(); return Ok(()); } - fn find(&self, name: &str) -> Result, SystemError> { let inode = self.0.lock(); From d216ad19043e65877ac4dda22fbcaa2d5f1e1c13 Mon Sep 17 00:00:00 2001 From: brahmamantra <2033552517@qq.com> Date: Thu, 28 Mar 2024 07:59:33 +0000 Subject: [PATCH 3/6] =?UTF-8?q?=E5=88=A9=E7=94=A8trait=20DowncastArc?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=94=81=E7=9A=84=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/filesystem/ramfs/mod.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index 93a553e92..021ea5d5f 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -2,6 +2,7 @@ use core::any::Any; use core::intrinsics::unlikely; use crate::filesystem::vfs::FSMAKER; +use crate::libs::casting::DowncastArc; use crate::libs::rwlock::RwLock; use crate::{ driver::base::device::device_number::DeviceNumber, @@ -10,6 +11,7 @@ use crate::{ libs::spinlock::{SpinLock, SpinLockGuard}, time::TimeSpec, }; + use alloc::{ collections::BTreeMap, string::String, @@ -420,17 +422,14 @@ impl IndexNode for LockedRamFSInode { return Err(err); } //转型为&LockedRamFSInode类型 - let target: &LockedRamFSInode = target - .downcast_ref::() - .ok_or(SystemError::EPERM)?; + let target = target.clone().downcast_arc::().unwrap(); let old_inode: &LockedRamFSInode = old_inode .downcast_ref::() .ok_or(SystemError::EPERM)?; //修改其对父节点的引用 let mut old_inode = old_inode.0.lock(); - let target = target.0.lock(); - old_inode.parent = target.self_ref.clone(); + old_inode.parent = Arc::downgrade(&target); return Ok(()); } From 8622ab724d69997932618237b676f1a05b1f7569 Mon Sep 17 00:00:00 2001 From: Samuel Dai Date: Thu, 28 Mar 2024 21:02:16 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=AE=8C=E5=96=84ramfs=20move=5Fto=20(#1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 完善ramfs move_to * update --- kernel/src/filesystem/ramfs/mod.rs | 33 +++++++++++++++++------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index 021ea5d5f..bab19394d 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -9,7 +9,7 @@ use crate::{ filesystem::vfs::{core::generate_inode_id, FileType}, ipc::pipe::LockedPipeInode, libs::spinlock::{SpinLock, SpinLockGuard}, - time::TimeSpec, + time::TimeSpec, libs::casting::DowncastArc }; use alloc::{ @@ -411,25 +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); } - //转型为&LockedRamFSInode类型 - let target = target.clone().downcast_arc::().unwrap(); - let old_inode: &LockedRamFSInode = old_inode - .downcast_ref::() - .ok_or(SystemError::EPERM)?; - //修改其对父节点的引用 - let mut old_inode = old_inode.0.lock(); - old_inode.parent = Arc::downgrade(&target); return Ok(()); } From 86810046472657116442ac76c1feeb601578f013 Mon Sep 17 00:00:00 2001 From: brahmamantra <2033552517@qq.com> Date: Thu, 28 Mar 2024 13:44:34 +0000 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BC=98=E5=8C=96ramfs=E7=9A=84move=5Fto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/filesystem/ramfs/mod.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index bab19394d..db36cf93a 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -2,7 +2,6 @@ use core::any::Any; use core::intrinsics::unlikely; use crate::filesystem::vfs::FSMAKER; -use crate::libs::casting::DowncastArc; use crate::libs::rwlock::RwLock; use crate::{ driver::base::device::device_number::DeviceNumber, @@ -418,12 +417,12 @@ impl IndexNode for LockedRamFSInode { .ok_or(SystemError::EPERM)? .0 .lock() - .parent - = Arc::downgrade(&target - .clone() - .downcast_arc::() - .ok_or(SystemError::EPERM)? - ); + .parent + = Arc::downgrade(&target + .clone() + .downcast_arc::() + .ok_or(SystemError::EPERM)? + ); // 在新的目录下创建一个硬链接 target.link(new_name, &inode)?; From 510bb0210119cf835606e2b95147000da29d1424 Mon Sep 17 00:00:00 2001 From: brahmamantra <2033552517@qq.com> Date: Thu, 28 Mar 2024 13:47:04 +0000 Subject: [PATCH 6/6] make fmt --- kernel/src/filesystem/ramfs/mod.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index db36cf93a..055e13a9e 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -7,8 +7,9 @@ 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, libs::casting::DowncastArc + time::TimeSpec, }; use alloc::{ @@ -417,12 +418,12 @@ impl IndexNode for LockedRamFSInode { .ok_or(SystemError::EPERM)? .0 .lock() - .parent - = Arc::downgrade(&target + .parent = Arc::downgrade( + &target .clone() .downcast_arc::() - .ok_or(SystemError::EPERM)? - ); + .ok_or(SystemError::EPERM)?, + ); // 在新的目录下创建一个硬链接 target.link(new_name, &inode)?;