16b4e7a29SLoGin use core::{fmt::Debug, intrinsics::unlikely}; 26b4e7a29SLoGin 36b4e7a29SLoGin use alloc::{ 46b4e7a29SLoGin string::String, 56b4e7a29SLoGin sync::{Arc, Weak}, 66b4e7a29SLoGin vec::Vec, 76b4e7a29SLoGin }; 86b4e7a29SLoGin use hashbrown::HashMap; 96b4e7a29SLoGin 106b4e7a29SLoGin use crate::{ 11*06d5e247SLoGin libs::{ 12*06d5e247SLoGin casting::DowncastArc, 13*06d5e247SLoGin rwlock::RwLock, 14*06d5e247SLoGin spinlock::{SpinLock, SpinLockGuard}, 15*06d5e247SLoGin }, 166b4e7a29SLoGin syscall::SystemError, 176b4e7a29SLoGin time::TimeSpec, 186b4e7a29SLoGin }; 196b4e7a29SLoGin 206b4e7a29SLoGin use self::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData}; 216b4e7a29SLoGin 226b4e7a29SLoGin use super::vfs::{ 236b4e7a29SLoGin core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, 246b4e7a29SLoGin FileType, FsInfo, IndexNode, InodeId, Metadata, PollStatus, 256b4e7a29SLoGin }; 266b4e7a29SLoGin 276b4e7a29SLoGin pub mod callback; 286b4e7a29SLoGin 296b4e7a29SLoGin #[derive(Debug)] 306b4e7a29SLoGin pub struct KernFS { 316b4e7a29SLoGin root_inode: Arc<KernFSInode>, 326b4e7a29SLoGin } 336b4e7a29SLoGin 346b4e7a29SLoGin impl FileSystem for KernFS { 356b4e7a29SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 366b4e7a29SLoGin self 376b4e7a29SLoGin } 386b4e7a29SLoGin 396b4e7a29SLoGin fn info(&self) -> FsInfo { 406b4e7a29SLoGin return FsInfo { 416b4e7a29SLoGin blk_dev_id: 0, 426b4e7a29SLoGin max_name_len: KernFS::MAX_NAMELEN, 436b4e7a29SLoGin }; 446b4e7a29SLoGin } 456b4e7a29SLoGin 466b4e7a29SLoGin fn root_inode(&self) -> Arc<dyn IndexNode> { 476b4e7a29SLoGin return self.root_inode.clone(); 486b4e7a29SLoGin } 496b4e7a29SLoGin } 506b4e7a29SLoGin 516b4e7a29SLoGin impl KernFS { 526b4e7a29SLoGin pub const MAX_NAMELEN: usize = 4096; 536b4e7a29SLoGin 546b4e7a29SLoGin #[allow(dead_code)] 556b4e7a29SLoGin pub fn new() -> Arc<Self> { 566b4e7a29SLoGin let root_inode = Self::create_root_inode(); 576b4e7a29SLoGin let fs = Arc::new(Self { 586b4e7a29SLoGin root_inode: root_inode.clone(), 596b4e7a29SLoGin }); 606b4e7a29SLoGin 616b4e7a29SLoGin { 626b4e7a29SLoGin let ptr = root_inode.as_ref() as *const KernFSInode as *mut KernFSInode; 636b4e7a29SLoGin unsafe { 646b4e7a29SLoGin (*ptr).self_ref = Arc::downgrade(&root_inode); 656b4e7a29SLoGin } 666b4e7a29SLoGin } 676b4e7a29SLoGin root_inode.inner.lock().parent = Arc::downgrade(&root_inode); 686b4e7a29SLoGin *root_inode.fs.write() = Arc::downgrade(&fs); 696b4e7a29SLoGin return fs; 706b4e7a29SLoGin } 716b4e7a29SLoGin 726b4e7a29SLoGin fn create_root_inode() -> Arc<KernFSInode> { 736b4e7a29SLoGin let metadata = Metadata { 746b4e7a29SLoGin size: 0, 756b4e7a29SLoGin mode: ModeType::from_bits_truncate(0o755), 766b4e7a29SLoGin uid: 0, 776b4e7a29SLoGin gid: 0, 786b4e7a29SLoGin blk_size: 0, 796b4e7a29SLoGin blocks: 0, 806b4e7a29SLoGin atime: TimeSpec::new(0, 0), 816b4e7a29SLoGin mtime: TimeSpec::new(0, 0), 826b4e7a29SLoGin ctime: TimeSpec::new(0, 0), 836b4e7a29SLoGin dev_id: 0, 846b4e7a29SLoGin inode_id: generate_inode_id(), 856b4e7a29SLoGin file_type: FileType::Dir, 866b4e7a29SLoGin nlinks: 1, 876b4e7a29SLoGin raw_dev: 0, 886b4e7a29SLoGin }; 896b4e7a29SLoGin let root_inode = Arc::new(KernFSInode { 90*06d5e247SLoGin name: String::from(""), 916b4e7a29SLoGin inner: SpinLock::new(InnerKernFSInode { 926b4e7a29SLoGin parent: Weak::new(), 936b4e7a29SLoGin metadata, 946b4e7a29SLoGin }), 956b4e7a29SLoGin self_ref: Weak::new(), 966b4e7a29SLoGin fs: RwLock::new(Weak::new()), 976b4e7a29SLoGin private_data: SpinLock::new(None), 986b4e7a29SLoGin callback: None, 996b4e7a29SLoGin children: SpinLock::new(HashMap::new()), 1006b4e7a29SLoGin inode_type: KernInodeType::Dir, 1016b4e7a29SLoGin }); 1026b4e7a29SLoGin 1036b4e7a29SLoGin return root_inode; 1046b4e7a29SLoGin } 1056b4e7a29SLoGin } 1066b4e7a29SLoGin 1076b4e7a29SLoGin #[derive(Debug)] 1086b4e7a29SLoGin pub struct KernFSInode { 1096b4e7a29SLoGin inner: SpinLock<InnerKernFSInode>, 1106b4e7a29SLoGin /// 指向当前Inode所属的文件系统的弱引用 1116b4e7a29SLoGin fs: RwLock<Weak<KernFS>>, 1126b4e7a29SLoGin /// 指向自身的弱引用 1136b4e7a29SLoGin self_ref: Weak<KernFSInode>, 1146b4e7a29SLoGin /// 私有数据 1156b4e7a29SLoGin private_data: SpinLock<Option<KernInodePrivateData>>, 1166b4e7a29SLoGin /// 回调函数 1176b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 1186b4e7a29SLoGin /// 子Inode 1196b4e7a29SLoGin children: SpinLock<HashMap<String, Arc<KernFSInode>>>, 1206b4e7a29SLoGin /// Inode类型 1216b4e7a29SLoGin inode_type: KernInodeType, 122*06d5e247SLoGin /// Inode名称 123*06d5e247SLoGin name: String, 1246b4e7a29SLoGin } 1256b4e7a29SLoGin 1266b4e7a29SLoGin #[derive(Debug)] 1276b4e7a29SLoGin pub struct InnerKernFSInode { 1286b4e7a29SLoGin parent: Weak<KernFSInode>, 1296b4e7a29SLoGin 1306b4e7a29SLoGin /// 当前inode的元数据 1316b4e7a29SLoGin metadata: Metadata, 1326b4e7a29SLoGin } 1336b4e7a29SLoGin 1346b4e7a29SLoGin impl IndexNode for KernFSInode { 1356b4e7a29SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 1366b4e7a29SLoGin self 1376b4e7a29SLoGin } 1386b4e7a29SLoGin 1396b4e7a29SLoGin fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> { 1406b4e7a29SLoGin if let Some(callback) = self.callback { 1416b4e7a29SLoGin let callback_data = 1426b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 1436b4e7a29SLoGin return callback.open(callback_data); 1446b4e7a29SLoGin } 1456b4e7a29SLoGin 1466b4e7a29SLoGin return Ok(()); 1476b4e7a29SLoGin } 1486b4e7a29SLoGin 1496b4e7a29SLoGin fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> { 1506b4e7a29SLoGin return Ok(()); 1516b4e7a29SLoGin } 1526b4e7a29SLoGin 1536b4e7a29SLoGin fn metadata(&self) -> Result<Metadata, SystemError> { 1546b4e7a29SLoGin return Ok(self.inner.lock().metadata.clone()); 1556b4e7a29SLoGin } 1566b4e7a29SLoGin 1576b4e7a29SLoGin fn set_metadata(&self, _metadata: &Metadata) -> Result<(), SystemError> { 1586b4e7a29SLoGin // 若文件系统没有实现此方法,则返回“不支持” 1596b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1606b4e7a29SLoGin } 1616b4e7a29SLoGin 1626b4e7a29SLoGin fn resize(&self, _len: usize) -> Result<(), SystemError> { 1636b4e7a29SLoGin return Ok(()); 1646b4e7a29SLoGin } 1656b4e7a29SLoGin 1666b4e7a29SLoGin fn create_with_data( 1676b4e7a29SLoGin &self, 1686b4e7a29SLoGin _name: &str, 1696b4e7a29SLoGin _file_type: FileType, 1706b4e7a29SLoGin _mode: ModeType, 1716b4e7a29SLoGin _data: usize, 1726b4e7a29SLoGin ) -> Result<Arc<dyn IndexNode>, SystemError> { 1736b4e7a29SLoGin // 应当通过kernfs的其它方法来创建文件,而不能从用户态直接调用此方法。 1746b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1756b4e7a29SLoGin } 1766b4e7a29SLoGin 1776b4e7a29SLoGin fn link(&self, _name: &str, _other: &Arc<dyn IndexNode>) -> Result<(), SystemError> { 1786b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 1796b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1806b4e7a29SLoGin } 1816b4e7a29SLoGin 1826b4e7a29SLoGin fn unlink(&self, _name: &str) -> Result<(), SystemError> { 1836b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 1846b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1856b4e7a29SLoGin } 1866b4e7a29SLoGin 1876b4e7a29SLoGin fn rmdir(&self, _name: &str) -> Result<(), SystemError> { 1886b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 1896b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1906b4e7a29SLoGin } 1916b4e7a29SLoGin 1926b4e7a29SLoGin fn move_( 1936b4e7a29SLoGin &self, 1946b4e7a29SLoGin _old_name: &str, 1956b4e7a29SLoGin _target: &Arc<dyn IndexNode>, 1966b4e7a29SLoGin _new_name: &str, 1976b4e7a29SLoGin ) -> Result<(), SystemError> { 1986b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 1996b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 2006b4e7a29SLoGin } 2016b4e7a29SLoGin 2026b4e7a29SLoGin fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> { 2036b4e7a29SLoGin if unlikely(name.len() > KernFS::MAX_NAMELEN) { 2046b4e7a29SLoGin return Err(SystemError::ENAMETOOLONG); 2056b4e7a29SLoGin } 2066b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 2076b4e7a29SLoGin return Err(SystemError::ENOTDIR); 2086b4e7a29SLoGin } 209*06d5e247SLoGin match name { 210*06d5e247SLoGin "" | "." => { 211*06d5e247SLoGin return Ok(self.self_ref.upgrade().ok_or(SystemError::ENOENT)?); 212*06d5e247SLoGin } 213*06d5e247SLoGin 214*06d5e247SLoGin ".." => { 215*06d5e247SLoGin return Ok(self 216*06d5e247SLoGin .inner 217*06d5e247SLoGin .lock() 218*06d5e247SLoGin .parent 219*06d5e247SLoGin .upgrade() 220*06d5e247SLoGin .ok_or(SystemError::ENOENT)?); 221*06d5e247SLoGin } 222*06d5e247SLoGin name => { 223*06d5e247SLoGin // 在子目录项中查找 224*06d5e247SLoGin return Ok(self 2256b4e7a29SLoGin .children 2266b4e7a29SLoGin .lock() 2276b4e7a29SLoGin .get(name) 228*06d5e247SLoGin .ok_or(SystemError::ENOENT)? 229*06d5e247SLoGin .clone()); 230*06d5e247SLoGin } 231*06d5e247SLoGin } 2326b4e7a29SLoGin } 2336b4e7a29SLoGin 2346b4e7a29SLoGin fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> { 2356b4e7a29SLoGin if self.inode_type != KernInodeType::Dir { 2366b4e7a29SLoGin return Err(SystemError::ENOTDIR); 2376b4e7a29SLoGin } 2386b4e7a29SLoGin 2396b4e7a29SLoGin let children = self.children.lock(); 2406b4e7a29SLoGin let r = children 2416b4e7a29SLoGin .iter() 2426b4e7a29SLoGin .find(|(_, v)| v.metadata().unwrap().inode_id == ino) 2436b4e7a29SLoGin .map(|(k, _)| k.clone()); 2446b4e7a29SLoGin 2456b4e7a29SLoGin return r.ok_or(SystemError::ENOENT); 2466b4e7a29SLoGin } 2476b4e7a29SLoGin 2486b4e7a29SLoGin fn get_entry_name_and_metadata(&self, ino: InodeId) -> Result<(String, Metadata), SystemError> { 2496b4e7a29SLoGin // 如果有条件,请在文件系统中使用高效的方式实现本接口,而不是依赖这个低效率的默认实现。 2506b4e7a29SLoGin let name = self.get_entry_name(ino)?; 2516b4e7a29SLoGin let entry = self.find(&name)?; 2526b4e7a29SLoGin return Ok((name, entry.metadata()?)); 2536b4e7a29SLoGin } 2546b4e7a29SLoGin 2556b4e7a29SLoGin fn ioctl(&self, _cmd: u32, _data: usize) -> Result<usize, SystemError> { 2566b4e7a29SLoGin // 若文件系统没有实现此方法,则返回“不支持” 2576b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 2586b4e7a29SLoGin } 2596b4e7a29SLoGin 2606b4e7a29SLoGin fn truncate(&self, _len: usize) -> Result<(), SystemError> { 2616b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 2626b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 2636b4e7a29SLoGin } 2646b4e7a29SLoGin 2656b4e7a29SLoGin fn sync(&self) -> Result<(), SystemError> { 2666b4e7a29SLoGin return Ok(()); 2676b4e7a29SLoGin } 2686b4e7a29SLoGin 2696b4e7a29SLoGin fn fs(&self) -> Arc<dyn FileSystem> { 2706b4e7a29SLoGin return self.fs.read().upgrade().unwrap(); 2716b4e7a29SLoGin } 2726b4e7a29SLoGin 2736b4e7a29SLoGin fn list(&self) -> Result<Vec<String>, SystemError> { 274*06d5e247SLoGin let info = self.metadata()?; 275*06d5e247SLoGin if info.file_type != FileType::Dir { 276*06d5e247SLoGin return Err(SystemError::ENOTDIR); 2776b4e7a29SLoGin } 278*06d5e247SLoGin 279*06d5e247SLoGin let mut keys: Vec<String> = Vec::new(); 280*06d5e247SLoGin keys.push(String::from(".")); 281*06d5e247SLoGin keys.push(String::from("..")); 282*06d5e247SLoGin self.children 283*06d5e247SLoGin .lock() 284*06d5e247SLoGin .keys() 285*06d5e247SLoGin .into_iter() 286*06d5e247SLoGin .for_each(|x| keys.push(x.clone())); 287*06d5e247SLoGin 288*06d5e247SLoGin return Ok(keys); 2896b4e7a29SLoGin } 2906b4e7a29SLoGin 2916b4e7a29SLoGin fn poll(&self) -> Result<PollStatus, SystemError> { 2926b4e7a29SLoGin // todo: 根据inode的具体attribute,返回PollStatus 2936b4e7a29SLoGin return Ok(PollStatus::READ | PollStatus::WRITE); 2946b4e7a29SLoGin } 2956b4e7a29SLoGin 2966b4e7a29SLoGin fn read_at( 2976b4e7a29SLoGin &self, 2986b4e7a29SLoGin offset: usize, 2996b4e7a29SLoGin len: usize, 3006b4e7a29SLoGin buf: &mut [u8], 3016b4e7a29SLoGin _data: &mut FilePrivateData, 3026b4e7a29SLoGin ) -> Result<usize, SystemError> { 3036b4e7a29SLoGin if self.inode_type != KernInodeType::File { 3046b4e7a29SLoGin return Err(SystemError::EISDIR); 3056b4e7a29SLoGin } 3066b4e7a29SLoGin 3076b4e7a29SLoGin if self.callback.is_none() { 308*06d5e247SLoGin kwarn!("kernfs: callback is none"); 3096b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 3106b4e7a29SLoGin } 3116b4e7a29SLoGin 3126b4e7a29SLoGin let callback_data = 3136b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 3146b4e7a29SLoGin return self 3156b4e7a29SLoGin .callback 3166b4e7a29SLoGin .as_ref() 3176b4e7a29SLoGin .unwrap() 3186b4e7a29SLoGin .read(callback_data, &mut buf[..len], offset); 3196b4e7a29SLoGin } 3206b4e7a29SLoGin 3216b4e7a29SLoGin fn write_at( 3226b4e7a29SLoGin &self, 3236b4e7a29SLoGin offset: usize, 3246b4e7a29SLoGin len: usize, 3256b4e7a29SLoGin buf: &[u8], 3266b4e7a29SLoGin _data: &mut FilePrivateData, 3276b4e7a29SLoGin ) -> Result<usize, SystemError> { 3286b4e7a29SLoGin if self.inode_type != KernInodeType::File { 3296b4e7a29SLoGin return Err(SystemError::EISDIR); 3306b4e7a29SLoGin } 3316b4e7a29SLoGin 3326b4e7a29SLoGin if self.callback.is_none() { 3336b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 3346b4e7a29SLoGin } 3356b4e7a29SLoGin 3366b4e7a29SLoGin let callback_data = 3376b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 3386b4e7a29SLoGin return self 3396b4e7a29SLoGin .callback 3406b4e7a29SLoGin .as_ref() 3416b4e7a29SLoGin .unwrap() 3426b4e7a29SLoGin .write(callback_data, &buf[..len], offset); 3436b4e7a29SLoGin } 3446b4e7a29SLoGin } 3456b4e7a29SLoGin 3466b4e7a29SLoGin impl KernFSInode { 3476b4e7a29SLoGin /// 在当前inode下增加子目录 3486b4e7a29SLoGin /// 3496b4e7a29SLoGin /// ## 参数 3506b4e7a29SLoGin /// 3516b4e7a29SLoGin /// - `name`:子目录名称 3526b4e7a29SLoGin /// - `mode`:子目录权限 3536b4e7a29SLoGin /// - `private_data`:子目录私有数据 3546b4e7a29SLoGin /// - `callback`:子目录回调函数 3556b4e7a29SLoGin /// 3566b4e7a29SLoGin /// ## 返回值 3576b4e7a29SLoGin /// 3586b4e7a29SLoGin /// - 成功:子目录inode 3596b4e7a29SLoGin /// - 失败:错误码 3606b4e7a29SLoGin #[allow(dead_code)] 3616b4e7a29SLoGin #[inline] 3626b4e7a29SLoGin pub fn add_dir( 3636b4e7a29SLoGin &self, 3646b4e7a29SLoGin name: String, 3656b4e7a29SLoGin mode: ModeType, 3666b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 3676b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 3686b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 3696b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 3706b4e7a29SLoGin return Err(SystemError::ENOTDIR); 3716b4e7a29SLoGin } 3726b4e7a29SLoGin 3736b4e7a29SLoGin return self.inner_create(name, KernInodeType::Dir, mode, private_data, callback); 3746b4e7a29SLoGin } 3756b4e7a29SLoGin 3766b4e7a29SLoGin /// 在当前inode下增加文件 3776b4e7a29SLoGin /// 3786b4e7a29SLoGin /// ## 参数 3796b4e7a29SLoGin /// 3806b4e7a29SLoGin /// - `name`:文件名称 3816b4e7a29SLoGin /// - `mode`:文件权限 3826b4e7a29SLoGin /// - `private_data`:文件私有数据 3836b4e7a29SLoGin /// - `callback`:文件回调函数 3846b4e7a29SLoGin /// 3856b4e7a29SLoGin /// ## 返回值 3866b4e7a29SLoGin /// 3876b4e7a29SLoGin /// - 成功:文件inode 3886b4e7a29SLoGin /// - 失败:错误码 3896b4e7a29SLoGin #[allow(dead_code)] 3906b4e7a29SLoGin #[inline] 3916b4e7a29SLoGin pub fn add_file( 3926b4e7a29SLoGin &self, 3936b4e7a29SLoGin name: String, 3946b4e7a29SLoGin mode: ModeType, 3956b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 3966b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 3976b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 3986b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 3996b4e7a29SLoGin return Err(SystemError::ENOTDIR); 4006b4e7a29SLoGin } 4016b4e7a29SLoGin 4026b4e7a29SLoGin return self.inner_create(name, KernInodeType::File, mode, private_data, callback); 4036b4e7a29SLoGin } 4046b4e7a29SLoGin 4056b4e7a29SLoGin fn inner_create( 4066b4e7a29SLoGin &self, 4076b4e7a29SLoGin name: String, 4086b4e7a29SLoGin file_type: KernInodeType, 4096b4e7a29SLoGin mode: ModeType, 4106b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 4116b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 4126b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 413*06d5e247SLoGin let size = if file_type == KernInodeType::File { 414*06d5e247SLoGin 4096 415*06d5e247SLoGin } else { 416*06d5e247SLoGin 0 417*06d5e247SLoGin }; 418*06d5e247SLoGin 4196b4e7a29SLoGin let metadata = Metadata { 420*06d5e247SLoGin size, 4216b4e7a29SLoGin mode, 4226b4e7a29SLoGin uid: 0, 4236b4e7a29SLoGin gid: 0, 4246b4e7a29SLoGin blk_size: 0, 4256b4e7a29SLoGin blocks: 0, 4266b4e7a29SLoGin atime: TimeSpec::new(0, 0), 4276b4e7a29SLoGin mtime: TimeSpec::new(0, 0), 4286b4e7a29SLoGin ctime: TimeSpec::new(0, 0), 4296b4e7a29SLoGin dev_id: 0, 4306b4e7a29SLoGin inode_id: generate_inode_id(), 4316b4e7a29SLoGin file_type: file_type.into(), 4326b4e7a29SLoGin nlinks: 1, 4336b4e7a29SLoGin raw_dev: 0, 4346b4e7a29SLoGin }; 4356b4e7a29SLoGin 4366b4e7a29SLoGin let new_inode: Arc<KernFSInode> = Self::new( 437*06d5e247SLoGin Some(self.self_ref.upgrade().unwrap()), 438*06d5e247SLoGin name.clone(), 4396b4e7a29SLoGin metadata, 440*06d5e247SLoGin file_type, 4416b4e7a29SLoGin private_data, 4426b4e7a29SLoGin callback, 4436b4e7a29SLoGin ); 4446b4e7a29SLoGin 4456b4e7a29SLoGin self.children.lock().insert(name, new_inode.clone()); 4466b4e7a29SLoGin 4476b4e7a29SLoGin return Ok(new_inode); 4486b4e7a29SLoGin } 4496b4e7a29SLoGin 4506b4e7a29SLoGin /// 在当前inode下删除子目录或者文件 4516b4e7a29SLoGin /// 4526b4e7a29SLoGin /// 如果要删除的是子目录,且子目录不为空,则返回ENOTEMPTY 4536b4e7a29SLoGin /// 4546b4e7a29SLoGin /// ## 参数 4556b4e7a29SLoGin /// 4566b4e7a29SLoGin /// - `name`:子目录或者文件名称 4576b4e7a29SLoGin /// 4586b4e7a29SLoGin /// ## 返回值 4596b4e7a29SLoGin /// 4606b4e7a29SLoGin /// - 成功:() 4616b4e7a29SLoGin /// - 失败:错误码 4626b4e7a29SLoGin #[allow(dead_code)] 4636b4e7a29SLoGin pub fn remove(&self, name: &str) -> Result<(), SystemError> { 4646b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 4656b4e7a29SLoGin return Err(SystemError::ENOTDIR); 4666b4e7a29SLoGin } 4676b4e7a29SLoGin 4686b4e7a29SLoGin let mut children = self.children.lock(); 4696b4e7a29SLoGin let inode = children.get(name).ok_or(SystemError::ENOENT)?; 4706b4e7a29SLoGin if inode.children.lock().is_empty() { 4716b4e7a29SLoGin children.remove(name); 4726b4e7a29SLoGin return Ok(()); 4736b4e7a29SLoGin } else { 4746b4e7a29SLoGin return Err(SystemError::ENOTEMPTY); 4756b4e7a29SLoGin } 4766b4e7a29SLoGin } 4776b4e7a29SLoGin 478*06d5e247SLoGin pub fn new( 479*06d5e247SLoGin parent: Option<Arc<KernFSInode>>, 480*06d5e247SLoGin name: String, 481*06d5e247SLoGin mut metadata: Metadata, 4826b4e7a29SLoGin inode_type: KernInodeType, 4836b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 4846b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 4856b4e7a29SLoGin ) -> Arc<KernFSInode> { 486*06d5e247SLoGin metadata.file_type = inode_type.into(); 487*06d5e247SLoGin let parent: Weak<KernFSInode> = parent.map(|x| Arc::downgrade(&x)).unwrap_or_default(); 488*06d5e247SLoGin 4896b4e7a29SLoGin let inode = Arc::new(KernFSInode { 490*06d5e247SLoGin name, 4916b4e7a29SLoGin inner: SpinLock::new(InnerKernFSInode { 492*06d5e247SLoGin parent: parent.clone(), 4936b4e7a29SLoGin metadata, 4946b4e7a29SLoGin }), 4956b4e7a29SLoGin self_ref: Weak::new(), 4966b4e7a29SLoGin fs: RwLock::new(Weak::new()), 4976b4e7a29SLoGin private_data: SpinLock::new(private_data), 4986b4e7a29SLoGin callback, 4996b4e7a29SLoGin children: SpinLock::new(HashMap::new()), 5006b4e7a29SLoGin inode_type, 5016b4e7a29SLoGin }); 5026b4e7a29SLoGin 5036b4e7a29SLoGin { 5046b4e7a29SLoGin let ptr = inode.as_ref() as *const KernFSInode as *mut KernFSInode; 5056b4e7a29SLoGin unsafe { 5066b4e7a29SLoGin (*ptr).self_ref = Arc::downgrade(&inode); 5076b4e7a29SLoGin } 5086b4e7a29SLoGin } 509*06d5e247SLoGin if parent.strong_count() > 0 { 510*06d5e247SLoGin let kernfs = parent 511*06d5e247SLoGin .upgrade() 512*06d5e247SLoGin .unwrap() 5136b4e7a29SLoGin .fs() 514*06d5e247SLoGin .downcast_arc::<KernFS>() 515*06d5e247SLoGin .expect("KernFSInode::new: parent is not a KernFS instance"); 516*06d5e247SLoGin *inode.fs.write() = Arc::downgrade(&kernfs); 517*06d5e247SLoGin } 5186b4e7a29SLoGin return inode; 5196b4e7a29SLoGin } 520*06d5e247SLoGin 521*06d5e247SLoGin pub fn name(&self) -> &str { 522*06d5e247SLoGin return &self.name; 523*06d5e247SLoGin } 524*06d5e247SLoGin 525*06d5e247SLoGin pub fn parent(&self) -> Option<Arc<KernFSInode>> { 526*06d5e247SLoGin return self.inner.lock().parent.upgrade(); 527*06d5e247SLoGin } 528*06d5e247SLoGin 529*06d5e247SLoGin pub fn private_data_mut(&self) -> SpinLockGuard<Option<KernInodePrivateData>> { 530*06d5e247SLoGin return self.private_data.lock(); 531*06d5e247SLoGin } 532*06d5e247SLoGin 533*06d5e247SLoGin /// remove a kernfs_node recursively 534*06d5e247SLoGin pub fn remove_recursive(&self) { 535*06d5e247SLoGin let mut children = self.children.lock().drain().collect::<Vec<_>>(); 536*06d5e247SLoGin while let Some((_, child)) = children.pop() { 537*06d5e247SLoGin children.append(&mut child.children.lock().drain().collect::<Vec<_>>()); 538*06d5e247SLoGin } 539*06d5e247SLoGin } 540*06d5e247SLoGin 541*06d5e247SLoGin /// 删除当前的inode(包括其自身、子目录和子文件) 542*06d5e247SLoGin #[allow(dead_code)] 543*06d5e247SLoGin pub fn remove_inode_include_self(&self) { 544*06d5e247SLoGin let parent = self.parent(); 545*06d5e247SLoGin if let Some(parent) = parent { 546*06d5e247SLoGin parent.children.lock().remove(self.name()); 547*06d5e247SLoGin } 548*06d5e247SLoGin self.remove_recursive(); 549*06d5e247SLoGin } 5506b4e7a29SLoGin } 5516b4e7a29SLoGin #[derive(Debug, Clone, Copy, PartialEq, Eq)] 552*06d5e247SLoGin pub enum KernInodeType { 5536b4e7a29SLoGin Dir, 5546b4e7a29SLoGin File, 5556b4e7a29SLoGin } 5566b4e7a29SLoGin 5576b4e7a29SLoGin impl Into<FileType> for KernInodeType { 5586b4e7a29SLoGin fn into(self) -> FileType { 5596b4e7a29SLoGin match self { 5606b4e7a29SLoGin KernInodeType::Dir => FileType::Dir, 5616b4e7a29SLoGin KernInodeType::File => FileType::File, 5626b4e7a29SLoGin } 5636b4e7a29SLoGin } 5646b4e7a29SLoGin } 565