1*6b4e7a29SLoGin use core::{fmt::Debug, intrinsics::unlikely}; 2*6b4e7a29SLoGin 3*6b4e7a29SLoGin use alloc::{ 4*6b4e7a29SLoGin string::String, 5*6b4e7a29SLoGin sync::{Arc, Weak}, 6*6b4e7a29SLoGin vec::Vec, 7*6b4e7a29SLoGin }; 8*6b4e7a29SLoGin use hashbrown::HashMap; 9*6b4e7a29SLoGin 10*6b4e7a29SLoGin use crate::{ 11*6b4e7a29SLoGin libs::{rwlock::RwLock, spinlock::SpinLock}, 12*6b4e7a29SLoGin syscall::SystemError, 13*6b4e7a29SLoGin time::TimeSpec, 14*6b4e7a29SLoGin }; 15*6b4e7a29SLoGin 16*6b4e7a29SLoGin use self::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData}; 17*6b4e7a29SLoGin 18*6b4e7a29SLoGin use super::vfs::{ 19*6b4e7a29SLoGin core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, 20*6b4e7a29SLoGin FileType, FsInfo, IndexNode, InodeId, Metadata, PollStatus, 21*6b4e7a29SLoGin }; 22*6b4e7a29SLoGin 23*6b4e7a29SLoGin pub mod callback; 24*6b4e7a29SLoGin 25*6b4e7a29SLoGin #[derive(Debug)] 26*6b4e7a29SLoGin pub struct KernFS { 27*6b4e7a29SLoGin root_inode: Arc<KernFSInode>, 28*6b4e7a29SLoGin } 29*6b4e7a29SLoGin 30*6b4e7a29SLoGin impl FileSystem for KernFS { 31*6b4e7a29SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 32*6b4e7a29SLoGin self 33*6b4e7a29SLoGin } 34*6b4e7a29SLoGin 35*6b4e7a29SLoGin fn info(&self) -> FsInfo { 36*6b4e7a29SLoGin return FsInfo { 37*6b4e7a29SLoGin blk_dev_id: 0, 38*6b4e7a29SLoGin max_name_len: KernFS::MAX_NAMELEN, 39*6b4e7a29SLoGin }; 40*6b4e7a29SLoGin } 41*6b4e7a29SLoGin 42*6b4e7a29SLoGin fn root_inode(&self) -> Arc<dyn IndexNode> { 43*6b4e7a29SLoGin return self.root_inode.clone(); 44*6b4e7a29SLoGin } 45*6b4e7a29SLoGin } 46*6b4e7a29SLoGin 47*6b4e7a29SLoGin impl KernFS { 48*6b4e7a29SLoGin pub const MAX_NAMELEN: usize = 4096; 49*6b4e7a29SLoGin 50*6b4e7a29SLoGin #[allow(dead_code)] 51*6b4e7a29SLoGin pub fn new() -> Arc<Self> { 52*6b4e7a29SLoGin let root_inode = Self::create_root_inode(); 53*6b4e7a29SLoGin let fs = Arc::new(Self { 54*6b4e7a29SLoGin root_inode: root_inode.clone(), 55*6b4e7a29SLoGin }); 56*6b4e7a29SLoGin 57*6b4e7a29SLoGin { 58*6b4e7a29SLoGin let ptr = root_inode.as_ref() as *const KernFSInode as *mut KernFSInode; 59*6b4e7a29SLoGin unsafe { 60*6b4e7a29SLoGin (*ptr).self_ref = Arc::downgrade(&root_inode); 61*6b4e7a29SLoGin } 62*6b4e7a29SLoGin } 63*6b4e7a29SLoGin root_inode.inner.lock().parent = Arc::downgrade(&root_inode); 64*6b4e7a29SLoGin *root_inode.fs.write() = Arc::downgrade(&fs); 65*6b4e7a29SLoGin return fs; 66*6b4e7a29SLoGin } 67*6b4e7a29SLoGin 68*6b4e7a29SLoGin fn create_root_inode() -> Arc<KernFSInode> { 69*6b4e7a29SLoGin let metadata = Metadata { 70*6b4e7a29SLoGin size: 0, 71*6b4e7a29SLoGin mode: ModeType::from_bits_truncate(0o755), 72*6b4e7a29SLoGin uid: 0, 73*6b4e7a29SLoGin gid: 0, 74*6b4e7a29SLoGin blk_size: 0, 75*6b4e7a29SLoGin blocks: 0, 76*6b4e7a29SLoGin atime: TimeSpec::new(0, 0), 77*6b4e7a29SLoGin mtime: TimeSpec::new(0, 0), 78*6b4e7a29SLoGin ctime: TimeSpec::new(0, 0), 79*6b4e7a29SLoGin dev_id: 0, 80*6b4e7a29SLoGin inode_id: generate_inode_id(), 81*6b4e7a29SLoGin file_type: FileType::Dir, 82*6b4e7a29SLoGin nlinks: 1, 83*6b4e7a29SLoGin raw_dev: 0, 84*6b4e7a29SLoGin }; 85*6b4e7a29SLoGin let root_inode = Arc::new(KernFSInode { 86*6b4e7a29SLoGin inner: SpinLock::new(InnerKernFSInode { 87*6b4e7a29SLoGin parent: Weak::new(), 88*6b4e7a29SLoGin metadata, 89*6b4e7a29SLoGin }), 90*6b4e7a29SLoGin self_ref: Weak::new(), 91*6b4e7a29SLoGin fs: RwLock::new(Weak::new()), 92*6b4e7a29SLoGin private_data: SpinLock::new(None), 93*6b4e7a29SLoGin callback: None, 94*6b4e7a29SLoGin children: SpinLock::new(HashMap::new()), 95*6b4e7a29SLoGin inode_type: KernInodeType::Dir, 96*6b4e7a29SLoGin }); 97*6b4e7a29SLoGin 98*6b4e7a29SLoGin return root_inode; 99*6b4e7a29SLoGin } 100*6b4e7a29SLoGin } 101*6b4e7a29SLoGin 102*6b4e7a29SLoGin #[derive(Debug)] 103*6b4e7a29SLoGin pub struct KernFSInode { 104*6b4e7a29SLoGin inner: SpinLock<InnerKernFSInode>, 105*6b4e7a29SLoGin /// 指向当前Inode所属的文件系统的弱引用 106*6b4e7a29SLoGin fs: RwLock<Weak<KernFS>>, 107*6b4e7a29SLoGin /// 指向自身的弱引用 108*6b4e7a29SLoGin self_ref: Weak<KernFSInode>, 109*6b4e7a29SLoGin /// 私有数据 110*6b4e7a29SLoGin private_data: SpinLock<Option<KernInodePrivateData>>, 111*6b4e7a29SLoGin /// 回调函数 112*6b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 113*6b4e7a29SLoGin /// 子Inode 114*6b4e7a29SLoGin children: SpinLock<HashMap<String, Arc<KernFSInode>>>, 115*6b4e7a29SLoGin /// Inode类型 116*6b4e7a29SLoGin inode_type: KernInodeType, 117*6b4e7a29SLoGin } 118*6b4e7a29SLoGin 119*6b4e7a29SLoGin #[derive(Debug)] 120*6b4e7a29SLoGin pub struct InnerKernFSInode { 121*6b4e7a29SLoGin parent: Weak<KernFSInode>, 122*6b4e7a29SLoGin 123*6b4e7a29SLoGin /// 当前inode的元数据 124*6b4e7a29SLoGin metadata: Metadata, 125*6b4e7a29SLoGin } 126*6b4e7a29SLoGin 127*6b4e7a29SLoGin impl IndexNode for KernFSInode { 128*6b4e7a29SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 129*6b4e7a29SLoGin self 130*6b4e7a29SLoGin } 131*6b4e7a29SLoGin 132*6b4e7a29SLoGin fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> { 133*6b4e7a29SLoGin if let Some(callback) = self.callback { 134*6b4e7a29SLoGin let callback_data = 135*6b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 136*6b4e7a29SLoGin return callback.open(callback_data); 137*6b4e7a29SLoGin } 138*6b4e7a29SLoGin 139*6b4e7a29SLoGin return Ok(()); 140*6b4e7a29SLoGin } 141*6b4e7a29SLoGin 142*6b4e7a29SLoGin fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> { 143*6b4e7a29SLoGin return Ok(()); 144*6b4e7a29SLoGin } 145*6b4e7a29SLoGin 146*6b4e7a29SLoGin fn metadata(&self) -> Result<Metadata, SystemError> { 147*6b4e7a29SLoGin return Ok(self.inner.lock().metadata.clone()); 148*6b4e7a29SLoGin } 149*6b4e7a29SLoGin 150*6b4e7a29SLoGin fn set_metadata(&self, _metadata: &Metadata) -> Result<(), SystemError> { 151*6b4e7a29SLoGin // 若文件系统没有实现此方法,则返回“不支持” 152*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 153*6b4e7a29SLoGin } 154*6b4e7a29SLoGin 155*6b4e7a29SLoGin fn resize(&self, _len: usize) -> Result<(), SystemError> { 156*6b4e7a29SLoGin return Ok(()); 157*6b4e7a29SLoGin } 158*6b4e7a29SLoGin 159*6b4e7a29SLoGin fn create_with_data( 160*6b4e7a29SLoGin &self, 161*6b4e7a29SLoGin _name: &str, 162*6b4e7a29SLoGin _file_type: FileType, 163*6b4e7a29SLoGin _mode: ModeType, 164*6b4e7a29SLoGin _data: usize, 165*6b4e7a29SLoGin ) -> Result<Arc<dyn IndexNode>, SystemError> { 166*6b4e7a29SLoGin // 应当通过kernfs的其它方法来创建文件,而不能从用户态直接调用此方法。 167*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 168*6b4e7a29SLoGin } 169*6b4e7a29SLoGin 170*6b4e7a29SLoGin fn link(&self, _name: &str, _other: &Arc<dyn IndexNode>) -> Result<(), SystemError> { 171*6b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 172*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 173*6b4e7a29SLoGin } 174*6b4e7a29SLoGin 175*6b4e7a29SLoGin fn unlink(&self, _name: &str) -> Result<(), SystemError> { 176*6b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 177*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 178*6b4e7a29SLoGin } 179*6b4e7a29SLoGin 180*6b4e7a29SLoGin fn rmdir(&self, _name: &str) -> Result<(), SystemError> { 181*6b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 182*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 183*6b4e7a29SLoGin } 184*6b4e7a29SLoGin 185*6b4e7a29SLoGin fn move_( 186*6b4e7a29SLoGin &self, 187*6b4e7a29SLoGin _old_name: &str, 188*6b4e7a29SLoGin _target: &Arc<dyn IndexNode>, 189*6b4e7a29SLoGin _new_name: &str, 190*6b4e7a29SLoGin ) -> Result<(), SystemError> { 191*6b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 192*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 193*6b4e7a29SLoGin } 194*6b4e7a29SLoGin 195*6b4e7a29SLoGin fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> { 196*6b4e7a29SLoGin if unlikely(name.len() > KernFS::MAX_NAMELEN) { 197*6b4e7a29SLoGin return Err(SystemError::ENAMETOOLONG); 198*6b4e7a29SLoGin } 199*6b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 200*6b4e7a29SLoGin return Err(SystemError::ENOTDIR); 201*6b4e7a29SLoGin } 202*6b4e7a29SLoGin let x: Arc<KernFSInode> = self 203*6b4e7a29SLoGin .children 204*6b4e7a29SLoGin .lock() 205*6b4e7a29SLoGin .get(name) 206*6b4e7a29SLoGin .cloned() 207*6b4e7a29SLoGin .ok_or(SystemError::ENOENT)?; 208*6b4e7a29SLoGin return Ok(x); 209*6b4e7a29SLoGin } 210*6b4e7a29SLoGin 211*6b4e7a29SLoGin fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> { 212*6b4e7a29SLoGin if self.inode_type != KernInodeType::Dir { 213*6b4e7a29SLoGin return Err(SystemError::ENOTDIR); 214*6b4e7a29SLoGin } 215*6b4e7a29SLoGin 216*6b4e7a29SLoGin let children = self.children.lock(); 217*6b4e7a29SLoGin let r = children 218*6b4e7a29SLoGin .iter() 219*6b4e7a29SLoGin .find(|(_, v)| v.metadata().unwrap().inode_id == ino) 220*6b4e7a29SLoGin .map(|(k, _)| k.clone()); 221*6b4e7a29SLoGin 222*6b4e7a29SLoGin return r.ok_or(SystemError::ENOENT); 223*6b4e7a29SLoGin } 224*6b4e7a29SLoGin 225*6b4e7a29SLoGin fn get_entry_name_and_metadata(&self, ino: InodeId) -> Result<(String, Metadata), SystemError> { 226*6b4e7a29SLoGin // 如果有条件,请在文件系统中使用高效的方式实现本接口,而不是依赖这个低效率的默认实现。 227*6b4e7a29SLoGin let name = self.get_entry_name(ino)?; 228*6b4e7a29SLoGin let entry = self.find(&name)?; 229*6b4e7a29SLoGin return Ok((name, entry.metadata()?)); 230*6b4e7a29SLoGin } 231*6b4e7a29SLoGin 232*6b4e7a29SLoGin fn ioctl(&self, _cmd: u32, _data: usize) -> Result<usize, SystemError> { 233*6b4e7a29SLoGin // 若文件系统没有实现此方法,则返回“不支持” 234*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 235*6b4e7a29SLoGin } 236*6b4e7a29SLoGin 237*6b4e7a29SLoGin fn truncate(&self, _len: usize) -> Result<(), SystemError> { 238*6b4e7a29SLoGin // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。 239*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 240*6b4e7a29SLoGin } 241*6b4e7a29SLoGin 242*6b4e7a29SLoGin fn sync(&self) -> Result<(), SystemError> { 243*6b4e7a29SLoGin return Ok(()); 244*6b4e7a29SLoGin } 245*6b4e7a29SLoGin 246*6b4e7a29SLoGin fn fs(&self) -> Arc<dyn FileSystem> { 247*6b4e7a29SLoGin return self.fs.read().upgrade().unwrap(); 248*6b4e7a29SLoGin } 249*6b4e7a29SLoGin 250*6b4e7a29SLoGin fn list(&self) -> Result<Vec<String>, SystemError> { 251*6b4e7a29SLoGin let mut list = Vec::new(); 252*6b4e7a29SLoGin for (name, _) in self.children.lock().iter() { 253*6b4e7a29SLoGin list.push(name.clone()); 254*6b4e7a29SLoGin } 255*6b4e7a29SLoGin return Ok(list); 256*6b4e7a29SLoGin } 257*6b4e7a29SLoGin 258*6b4e7a29SLoGin fn poll(&self) -> Result<PollStatus, SystemError> { 259*6b4e7a29SLoGin // todo: 根据inode的具体attribute,返回PollStatus 260*6b4e7a29SLoGin return Ok(PollStatus::READ | PollStatus::WRITE); 261*6b4e7a29SLoGin } 262*6b4e7a29SLoGin 263*6b4e7a29SLoGin fn read_at( 264*6b4e7a29SLoGin &self, 265*6b4e7a29SLoGin offset: usize, 266*6b4e7a29SLoGin len: usize, 267*6b4e7a29SLoGin buf: &mut [u8], 268*6b4e7a29SLoGin _data: &mut FilePrivateData, 269*6b4e7a29SLoGin ) -> Result<usize, SystemError> { 270*6b4e7a29SLoGin if self.inode_type != KernInodeType::File { 271*6b4e7a29SLoGin return Err(SystemError::EISDIR); 272*6b4e7a29SLoGin } 273*6b4e7a29SLoGin 274*6b4e7a29SLoGin if self.callback.is_none() { 275*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 276*6b4e7a29SLoGin } 277*6b4e7a29SLoGin 278*6b4e7a29SLoGin let callback_data = 279*6b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 280*6b4e7a29SLoGin return self 281*6b4e7a29SLoGin .callback 282*6b4e7a29SLoGin .as_ref() 283*6b4e7a29SLoGin .unwrap() 284*6b4e7a29SLoGin .read(callback_data, &mut buf[..len], offset); 285*6b4e7a29SLoGin } 286*6b4e7a29SLoGin 287*6b4e7a29SLoGin fn write_at( 288*6b4e7a29SLoGin &self, 289*6b4e7a29SLoGin offset: usize, 290*6b4e7a29SLoGin len: usize, 291*6b4e7a29SLoGin buf: &[u8], 292*6b4e7a29SLoGin _data: &mut FilePrivateData, 293*6b4e7a29SLoGin ) -> Result<usize, SystemError> { 294*6b4e7a29SLoGin if self.inode_type != KernInodeType::File { 295*6b4e7a29SLoGin return Err(SystemError::EISDIR); 296*6b4e7a29SLoGin } 297*6b4e7a29SLoGin 298*6b4e7a29SLoGin if self.callback.is_none() { 299*6b4e7a29SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 300*6b4e7a29SLoGin } 301*6b4e7a29SLoGin 302*6b4e7a29SLoGin let callback_data = 303*6b4e7a29SLoGin KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock()); 304*6b4e7a29SLoGin return self 305*6b4e7a29SLoGin .callback 306*6b4e7a29SLoGin .as_ref() 307*6b4e7a29SLoGin .unwrap() 308*6b4e7a29SLoGin .write(callback_data, &buf[..len], offset); 309*6b4e7a29SLoGin } 310*6b4e7a29SLoGin } 311*6b4e7a29SLoGin 312*6b4e7a29SLoGin impl KernFSInode { 313*6b4e7a29SLoGin /// 在当前inode下增加子目录 314*6b4e7a29SLoGin /// 315*6b4e7a29SLoGin /// ## 参数 316*6b4e7a29SLoGin /// 317*6b4e7a29SLoGin /// - `name`:子目录名称 318*6b4e7a29SLoGin /// - `mode`:子目录权限 319*6b4e7a29SLoGin /// - `private_data`:子目录私有数据 320*6b4e7a29SLoGin /// - `callback`:子目录回调函数 321*6b4e7a29SLoGin /// 322*6b4e7a29SLoGin /// ## 返回值 323*6b4e7a29SLoGin /// 324*6b4e7a29SLoGin /// - 成功:子目录inode 325*6b4e7a29SLoGin /// - 失败:错误码 326*6b4e7a29SLoGin #[allow(dead_code)] 327*6b4e7a29SLoGin #[inline] 328*6b4e7a29SLoGin pub fn add_dir( 329*6b4e7a29SLoGin &self, 330*6b4e7a29SLoGin name: String, 331*6b4e7a29SLoGin mode: ModeType, 332*6b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 333*6b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 334*6b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 335*6b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 336*6b4e7a29SLoGin return Err(SystemError::ENOTDIR); 337*6b4e7a29SLoGin } 338*6b4e7a29SLoGin 339*6b4e7a29SLoGin return self.inner_create(name, KernInodeType::Dir, mode, private_data, callback); 340*6b4e7a29SLoGin } 341*6b4e7a29SLoGin 342*6b4e7a29SLoGin /// 在当前inode下增加文件 343*6b4e7a29SLoGin /// 344*6b4e7a29SLoGin /// ## 参数 345*6b4e7a29SLoGin /// 346*6b4e7a29SLoGin /// - `name`:文件名称 347*6b4e7a29SLoGin /// - `mode`:文件权限 348*6b4e7a29SLoGin /// - `private_data`:文件私有数据 349*6b4e7a29SLoGin /// - `callback`:文件回调函数 350*6b4e7a29SLoGin /// 351*6b4e7a29SLoGin /// ## 返回值 352*6b4e7a29SLoGin /// 353*6b4e7a29SLoGin /// - 成功:文件inode 354*6b4e7a29SLoGin /// - 失败:错误码 355*6b4e7a29SLoGin #[allow(dead_code)] 356*6b4e7a29SLoGin #[inline] 357*6b4e7a29SLoGin pub fn add_file( 358*6b4e7a29SLoGin &self, 359*6b4e7a29SLoGin name: String, 360*6b4e7a29SLoGin mode: ModeType, 361*6b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 362*6b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 363*6b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 364*6b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 365*6b4e7a29SLoGin return Err(SystemError::ENOTDIR); 366*6b4e7a29SLoGin } 367*6b4e7a29SLoGin 368*6b4e7a29SLoGin return self.inner_create(name, KernInodeType::File, mode, private_data, callback); 369*6b4e7a29SLoGin } 370*6b4e7a29SLoGin 371*6b4e7a29SLoGin fn inner_create( 372*6b4e7a29SLoGin &self, 373*6b4e7a29SLoGin name: String, 374*6b4e7a29SLoGin file_type: KernInodeType, 375*6b4e7a29SLoGin mode: ModeType, 376*6b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 377*6b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 378*6b4e7a29SLoGin ) -> Result<Arc<KernFSInode>, SystemError> { 379*6b4e7a29SLoGin let metadata = Metadata { 380*6b4e7a29SLoGin size: 0, 381*6b4e7a29SLoGin mode, 382*6b4e7a29SLoGin uid: 0, 383*6b4e7a29SLoGin gid: 0, 384*6b4e7a29SLoGin blk_size: 0, 385*6b4e7a29SLoGin blocks: 0, 386*6b4e7a29SLoGin atime: TimeSpec::new(0, 0), 387*6b4e7a29SLoGin mtime: TimeSpec::new(0, 0), 388*6b4e7a29SLoGin ctime: TimeSpec::new(0, 0), 389*6b4e7a29SLoGin dev_id: 0, 390*6b4e7a29SLoGin inode_id: generate_inode_id(), 391*6b4e7a29SLoGin file_type: file_type.into(), 392*6b4e7a29SLoGin nlinks: 1, 393*6b4e7a29SLoGin raw_dev: 0, 394*6b4e7a29SLoGin }; 395*6b4e7a29SLoGin 396*6b4e7a29SLoGin let new_inode: Arc<KernFSInode> = Self::new( 397*6b4e7a29SLoGin self.self_ref.upgrade().unwrap(), 398*6b4e7a29SLoGin metadata, 399*6b4e7a29SLoGin KernInodeType::Dir, 400*6b4e7a29SLoGin private_data, 401*6b4e7a29SLoGin callback, 402*6b4e7a29SLoGin ); 403*6b4e7a29SLoGin 404*6b4e7a29SLoGin self.children.lock().insert(name, new_inode.clone()); 405*6b4e7a29SLoGin 406*6b4e7a29SLoGin return Ok(new_inode); 407*6b4e7a29SLoGin } 408*6b4e7a29SLoGin 409*6b4e7a29SLoGin /// 在当前inode下删除子目录或者文件 410*6b4e7a29SLoGin /// 411*6b4e7a29SLoGin /// 如果要删除的是子目录,且子目录不为空,则返回ENOTEMPTY 412*6b4e7a29SLoGin /// 413*6b4e7a29SLoGin /// ## 参数 414*6b4e7a29SLoGin /// 415*6b4e7a29SLoGin /// - `name`:子目录或者文件名称 416*6b4e7a29SLoGin /// 417*6b4e7a29SLoGin /// ## 返回值 418*6b4e7a29SLoGin /// 419*6b4e7a29SLoGin /// - 成功:() 420*6b4e7a29SLoGin /// - 失败:错误码 421*6b4e7a29SLoGin #[allow(dead_code)] 422*6b4e7a29SLoGin pub fn remove(&self, name: &str) -> Result<(), SystemError> { 423*6b4e7a29SLoGin if unlikely(self.inode_type != KernInodeType::Dir) { 424*6b4e7a29SLoGin return Err(SystemError::ENOTDIR); 425*6b4e7a29SLoGin } 426*6b4e7a29SLoGin 427*6b4e7a29SLoGin let mut children = self.children.lock(); 428*6b4e7a29SLoGin let inode = children.get(name).ok_or(SystemError::ENOENT)?; 429*6b4e7a29SLoGin if inode.children.lock().is_empty() { 430*6b4e7a29SLoGin children.remove(name); 431*6b4e7a29SLoGin return Ok(()); 432*6b4e7a29SLoGin } else { 433*6b4e7a29SLoGin return Err(SystemError::ENOTEMPTY); 434*6b4e7a29SLoGin } 435*6b4e7a29SLoGin } 436*6b4e7a29SLoGin 437*6b4e7a29SLoGin pub(self) fn new( 438*6b4e7a29SLoGin parent: Arc<KernFSInode>, 439*6b4e7a29SLoGin metadata: Metadata, 440*6b4e7a29SLoGin inode_type: KernInodeType, 441*6b4e7a29SLoGin private_data: Option<KernInodePrivateData>, 442*6b4e7a29SLoGin callback: Option<&'static dyn KernFSCallback>, 443*6b4e7a29SLoGin ) -> Arc<KernFSInode> { 444*6b4e7a29SLoGin let inode = Arc::new(KernFSInode { 445*6b4e7a29SLoGin inner: SpinLock::new(InnerKernFSInode { 446*6b4e7a29SLoGin parent: Arc::downgrade(&parent), 447*6b4e7a29SLoGin metadata, 448*6b4e7a29SLoGin }), 449*6b4e7a29SLoGin self_ref: Weak::new(), 450*6b4e7a29SLoGin fs: RwLock::new(Weak::new()), 451*6b4e7a29SLoGin private_data: SpinLock::new(private_data), 452*6b4e7a29SLoGin callback, 453*6b4e7a29SLoGin children: SpinLock::new(HashMap::new()), 454*6b4e7a29SLoGin inode_type, 455*6b4e7a29SLoGin }); 456*6b4e7a29SLoGin 457*6b4e7a29SLoGin { 458*6b4e7a29SLoGin let ptr = inode.as_ref() as *const KernFSInode as *mut KernFSInode; 459*6b4e7a29SLoGin unsafe { 460*6b4e7a29SLoGin (*ptr).self_ref = Arc::downgrade(&inode); 461*6b4e7a29SLoGin } 462*6b4e7a29SLoGin } 463*6b4e7a29SLoGin *inode.fs.write() = Arc::downgrade( 464*6b4e7a29SLoGin parent 465*6b4e7a29SLoGin .fs() 466*6b4e7a29SLoGin .as_any_ref() 467*6b4e7a29SLoGin .downcast_ref() 468*6b4e7a29SLoGin .expect("KernFSInode::new: parent is not a KernFS instance"), 469*6b4e7a29SLoGin ); 470*6b4e7a29SLoGin return inode; 471*6b4e7a29SLoGin } 472*6b4e7a29SLoGin } 473*6b4e7a29SLoGin #[derive(Debug, Clone, Copy, PartialEq, Eq)] 474*6b4e7a29SLoGin pub(self) enum KernInodeType { 475*6b4e7a29SLoGin Dir, 476*6b4e7a29SLoGin File, 477*6b4e7a29SLoGin } 478*6b4e7a29SLoGin 479*6b4e7a29SLoGin impl Into<FileType> for KernInodeType { 480*6b4e7a29SLoGin fn into(self) -> FileType { 481*6b4e7a29SLoGin match self { 482*6b4e7a29SLoGin KernInodeType::Dir => FileType::Dir, 483*6b4e7a29SLoGin KernInodeType::File => FileType::File, 484*6b4e7a29SLoGin } 485*6b4e7a29SLoGin } 486*6b4e7a29SLoGin } 487