|  | @@ -1641,6 +1641,78 @@ impl IndexNode for LockedFATInode {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    fn move_to(
 | 
	
		
			
				|  |  | +        &self,
 | 
	
		
			
				|  |  | +        old_name: &str,
 | 
	
		
			
				|  |  | +        target: &Arc<dyn IndexNode>,
 | 
	
		
			
				|  |  | +        new_name: &str,
 | 
	
		
			
				|  |  | +    ) -> Result<(), SystemError> {
 | 
	
		
			
				|  |  | +        let old_id = self.metadata().unwrap().inode_id;
 | 
	
		
			
				|  |  | +        let new_id = target.metadata().unwrap().inode_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 _nod = guard.children.remove(&old_name.to_uppercase());
 | 
	
		
			
				|  |  | +            let old_dir = match &guard.inode_type {
 | 
	
		
			
				|  |  | +                FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
 | 
	
		
			
				|  |  | +                    return Err(SystemError::ENOTDIR);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                FATDirEntry::Dir(d) => d,
 | 
	
		
			
				|  |  | +                FATDirEntry::UnInit => {
 | 
	
		
			
				|  |  | +                    kerror!("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)?;
 | 
	
		
			
				|  |  | +        } 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 _nod = old_guard.children.remove(&old_name.to_uppercase());
 | 
	
		
			
				|  |  | +            let old_dir = match &old_guard.inode_type {
 | 
	
		
			
				|  |  | +                FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
 | 
	
		
			
				|  |  | +                    return Err(SystemError::ENOTDIR);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                FATDirEntry::Dir(d) => d,
 | 
	
		
			
				|  |  | +                FATDirEntry::UnInit => {
 | 
	
		
			
				|  |  | +                    kerror!("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 => {
 | 
	
		
			
				|  |  | +                    kerror!("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)?;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return Ok(());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> {
 | 
	
		
			
				|  |  |          let guard: SpinLockGuard<FATInode> = self.0.lock();
 | 
	
		
			
				|  |  |          if guard.metadata.file_type != FileType::Dir {
 |