|
@@ -251,6 +251,83 @@ impl LockedFATInode {
|
|
|
|
|
|
return inode;
|
|
return inode;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ #[inline(never)]
|
|
|
|
+ fn rename_file_in_current_dir(
|
|
|
|
+ &self,
|
|
|
|
+ old_name: &str,
|
|
|
|
+ new_name: &str,
|
|
|
|
+ ) -> Result<(), SystemError> {
|
|
|
|
+ let mut guard = self.0.lock();
|
|
|
|
+ let old_inode: Arc<LockedFATInode> = guard.find(old_name)?;
|
|
|
|
+ // 对目标inode上锁,以防更改
|
|
|
|
+ let old_inode_guard: SpinLockGuard<FATInode> = old_inode.0.lock();
|
|
|
|
+ let fs = old_inode_guard.fs.upgrade().unwrap();
|
|
|
|
+ // 从缓存删除
|
|
|
|
+ let old_dir = match &guard.inode_type {
|
|
|
|
+ FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
+ return Err(SystemError::ENOTDIR);
|
|
|
|
+ }
|
|
|
|
+ FATDirEntry::Dir(d) => d,
|
|
|
|
+ FATDirEntry::UnInit => {
|
|
|
|
+ error!("FATFS: param: Inode_type uninitialized.");
|
|
|
|
+ return Err(SystemError::EROFS);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ // 检查文件是否存在
|
|
|
|
+ // old_dir.check_existence(old_name, Some(false), guard.fs.upgrade().unwrap())?;
|
|
|
|
+
|
|
|
|
+ old_dir.rename(fs, old_name, new_name)?;
|
|
|
|
+ let _nod = guard.children.remove(&to_search_name(old_name));
|
|
|
|
+ Ok(())
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ #[inline(never)]
|
|
|
|
+ fn move_to_another_dir(
|
|
|
|
+ &self,
|
|
|
|
+ old_name: &str,
|
|
|
|
+ new_name: &str,
|
|
|
|
+ target: &Arc<dyn IndexNode>,
|
|
|
|
+ ) -> Result<(), SystemError> {
|
|
|
|
+ let mut old_guard = self.0.lock();
|
|
|
|
+ let other: &LockedFATInode = target
|
|
|
|
+ .downcast_ref::<LockedFATInode>()
|
|
|
|
+ .ok_or(SystemError::EPERM)?;
|
|
|
|
+
|
|
|
|
+ let new_guard = other.0.lock();
|
|
|
|
+ let old_inode: Arc<LockedFATInode> = old_guard.find(old_name)?;
|
|
|
|
+ // 对目标inode上锁,以防更改
|
|
|
|
+ let old_inode_guard: SpinLockGuard<FATInode> = old_inode.0.lock();
|
|
|
|
+ let fs = old_inode_guard.fs.upgrade().unwrap();
|
|
|
|
+
|
|
|
|
+ let old_dir = match &old_guard.inode_type {
|
|
|
|
+ FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
+ return Err(SystemError::ENOTDIR);
|
|
|
|
+ }
|
|
|
|
+ FATDirEntry::Dir(d) => d,
|
|
|
|
+ FATDirEntry::UnInit => {
|
|
|
|
+ error!("FATFS: param: Inode_type uninitialized.");
|
|
|
|
+ return Err(SystemError::EROFS);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ let new_dir = match &new_guard.inode_type {
|
|
|
|
+ FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
+ return Err(SystemError::ENOTDIR);
|
|
|
|
+ }
|
|
|
|
+ FATDirEntry::Dir(d) => d,
|
|
|
|
+ FATDirEntry::UnInit => {
|
|
|
|
+ error!("FATFA: param: Inode_type uninitialized.");
|
|
|
|
+ return Err(SystemError::EROFS);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ // 检查文件是否存在
|
|
|
|
+ old_dir.check_existence(old_name, Some(false), old_guard.fs.upgrade().unwrap())?;
|
|
|
|
+ old_dir.rename_across(fs, new_dir, old_name, new_name)?;
|
|
|
|
+ // 从缓存删除
|
|
|
|
+ let _nod = old_guard.children.remove(&to_search_name(old_name));
|
|
|
|
+
|
|
|
|
+ Ok(())
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/// FsInfo结构体(内存中的一份拷贝,当卸载卷或者sync的时候,把它写入磁盘)
|
|
/// FsInfo结构体(内存中的一份拷贝,当卸载卷或者sync的时候,把它写入磁盘)
|
|
@@ -1762,64 +1839,9 @@ impl IndexNode for LockedFATInode {
|
|
let new_id = target.metadata().unwrap().inode_id;
|
|
let new_id = target.metadata().unwrap().inode_id;
|
|
// 若在同一父目录下
|
|
// 若在同一父目录下
|
|
if old_id == new_id {
|
|
if old_id == new_id {
|
|
- let mut guard = self.0.lock();
|
|
|
|
- let old_inode: Arc<LockedFATInode> = guard.find(old_name)?;
|
|
|
|
- // 对目标inode上锁,以防更改
|
|
|
|
- let old_inode_guard: SpinLockGuard<FATInode> = old_inode.0.lock();
|
|
|
|
- let fs = old_inode_guard.fs.upgrade().unwrap();
|
|
|
|
- // 从缓存删除
|
|
|
|
- let old_dir = match &guard.inode_type {
|
|
|
|
- FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
- return Err(SystemError::ENOTDIR);
|
|
|
|
- }
|
|
|
|
- FATDirEntry::Dir(d) => d,
|
|
|
|
- FATDirEntry::UnInit => {
|
|
|
|
- error!("FATFS: param: Inode_type uninitialized.");
|
|
|
|
- return Err(SystemError::EROFS);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- // 检查文件是否存在
|
|
|
|
- // old_dir.check_existence(old_name, Some(false), guard.fs.upgrade().unwrap())?;
|
|
|
|
-
|
|
|
|
- old_dir.rename(fs, old_name, new_name)?;
|
|
|
|
- let _nod = guard.children.remove(&to_search_name(old_name));
|
|
|
|
|
|
+ self.rename_file_in_current_dir(old_name, new_name)?;
|
|
} else {
|
|
} else {
|
|
- let mut old_guard = self.0.lock();
|
|
|
|
- let other: &LockedFATInode = target
|
|
|
|
- .downcast_ref::<LockedFATInode>()
|
|
|
|
- .ok_or(SystemError::EPERM)?;
|
|
|
|
-
|
|
|
|
- let new_guard = other.0.lock();
|
|
|
|
- let old_inode: Arc<LockedFATInode> = old_guard.find(old_name)?;
|
|
|
|
- // 对目标inode上锁,以防更改
|
|
|
|
- let old_inode_guard: SpinLockGuard<FATInode> = old_inode.0.lock();
|
|
|
|
- let fs = old_inode_guard.fs.upgrade().unwrap();
|
|
|
|
-
|
|
|
|
- let old_dir = match &old_guard.inode_type {
|
|
|
|
- FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
- return Err(SystemError::ENOTDIR);
|
|
|
|
- }
|
|
|
|
- FATDirEntry::Dir(d) => d,
|
|
|
|
- FATDirEntry::UnInit => {
|
|
|
|
- error!("FATFS: param: Inode_type uninitialized.");
|
|
|
|
- return Err(SystemError::EROFS);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- let new_dir = match &new_guard.inode_type {
|
|
|
|
- FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
|
|
|
|
- return Err(SystemError::ENOTDIR);
|
|
|
|
- }
|
|
|
|
- FATDirEntry::Dir(d) => d,
|
|
|
|
- FATDirEntry::UnInit => {
|
|
|
|
- error!("FATFA: param: Inode_type uninitialized.");
|
|
|
|
- return Err(SystemError::EROFS);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- // 检查文件是否存在
|
|
|
|
- old_dir.check_existence(old_name, Some(false), old_guard.fs.upgrade().unwrap())?;
|
|
|
|
- old_dir.rename_across(fs, new_dir, old_name, new_name)?;
|
|
|
|
- // 从缓存删除
|
|
|
|
- let _nod = old_guard.children.remove(&to_search_name(old_name));
|
|
|
|
|
|
+ self.move_to_another_dir(old_name, new_name, target)?;
|
|
}
|
|
}
|
|
|
|
|
|
return Ok(());
|
|
return Ok(());
|