xref: /DragonOS/kernel/src/filesystem/kernfs/mod.rs (revision 6b4e7a2972cc06663754c0e35a0e541987006fa4)
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