xref: /DragonOS/kernel/src/filesystem/devfs/mod.rs (revision 40314b30ab2a7e1fd06a05a00f693e644e446035)
1004e86ffSlogin /// 导出devfs的模块
2004e86ffSlogin pub mod null_dev;
3004e86ffSlogin pub mod zero_dev;
406b09f34Skong 
5004e86ffSlogin use super::vfs::{
6004e86ffSlogin     core::{generate_inode_id, ROOT_INODE},
773c607aaSYJwu2023     file::FileMode,
86b4e7a29SLoGin     syscall::ModeType,
973c607aaSYJwu2023     FileSystem, FileType, FsInfo, IndexNode, Metadata, PollStatus,
10004e86ffSlogin };
11004e86ffSlogin use crate::{
12b087521eSChiichen     kerror, kinfo,
13b087521eSChiichen     libs::{
14b087521eSChiichen         once::Once,
15b087521eSChiichen         spinlock::{SpinLock, SpinLockGuard},
16b087521eSChiichen     },
1720e3152eSlogin     syscall::SystemError,
1820e3152eSlogin     time::TimeSpec,
19004e86ffSlogin };
20004e86ffSlogin use alloc::{
21004e86ffSlogin     collections::BTreeMap,
22004e86ffSlogin     string::{String, ToString},
23004e86ffSlogin     sync::{Arc, Weak},
24004e86ffSlogin     vec::Vec,
25004e86ffSlogin };
26004e86ffSlogin 
27004e86ffSlogin const DEVFS_MAX_NAMELEN: usize = 64;
28004e86ffSlogin 
29004e86ffSlogin /// @brief dev文件系统
30004e86ffSlogin #[derive(Debug)]
31004e86ffSlogin pub struct DevFS {
32004e86ffSlogin     // 文件系统根节点
33004e86ffSlogin     root_inode: Arc<LockedDevFSInode>,
34004e86ffSlogin }
35004e86ffSlogin 
36004e86ffSlogin impl FileSystem for DevFS {
37004e86ffSlogin     fn as_any_ref(&self) -> &dyn core::any::Any {
38004e86ffSlogin         self
39004e86ffSlogin     }
40004e86ffSlogin 
41004e86ffSlogin     fn root_inode(&self) -> Arc<dyn super::vfs::IndexNode> {
42004e86ffSlogin         return self.root_inode.clone();
43004e86ffSlogin     }
44004e86ffSlogin 
45004e86ffSlogin     fn info(&self) -> super::vfs::FsInfo {
46004e86ffSlogin         return FsInfo {
47004e86ffSlogin             blk_dev_id: 0,
48004e86ffSlogin             max_name_len: DEVFS_MAX_NAMELEN,
49004e86ffSlogin         };
50004e86ffSlogin     }
51004e86ffSlogin }
52004e86ffSlogin 
53004e86ffSlogin impl DevFS {
54004e86ffSlogin     pub fn new() -> Arc<Self> {
55004e86ffSlogin         // 初始化root inode
56004e86ffSlogin         let root: Arc<LockedDevFSInode> = Arc::new(LockedDevFSInode(SpinLock::new(
57004e86ffSlogin             // /dev 的权限设置为 读+执行,root 可以读写
58004e86ffSlogin             // root 的 parent 是空指针
596b4e7a29SLoGin             DevFSInode::new(FileType::Dir, ModeType::from_bits_truncate(0o755), 0),
60004e86ffSlogin         )));
61004e86ffSlogin 
62004e86ffSlogin         let devfs: Arc<DevFS> = Arc::new(DevFS { root_inode: root });
63004e86ffSlogin 
64004e86ffSlogin         // 对root inode加锁,并继续完成初始化工作
65004e86ffSlogin         let mut root_guard: SpinLockGuard<DevFSInode> = devfs.root_inode.0.lock();
66004e86ffSlogin         root_guard.parent = Arc::downgrade(&devfs.root_inode);
67004e86ffSlogin         root_guard.self_ref = Arc::downgrade(&devfs.root_inode);
68004e86ffSlogin         root_guard.fs = Arc::downgrade(&devfs);
69004e86ffSlogin         // 释放锁
70004e86ffSlogin         drop(root_guard);
71004e86ffSlogin 
72004e86ffSlogin         // 创建文件夹
73004e86ffSlogin         let root: &Arc<LockedDevFSInode> = &devfs.root_inode;
74004e86ffSlogin         root.add_dir("char")
75004e86ffSlogin             .expect("DevFS: Failed to create /dev/char");
76004e86ffSlogin 
77004e86ffSlogin         root.add_dir("block")
78004e86ffSlogin             .expect("DevFS: Failed to create /dev/block");
79004e86ffSlogin         devfs.register_bultinin_device();
80004e86ffSlogin 
8133270d00Slogin         // kdebug!("ls /dev: {:?}", root.list());
82004e86ffSlogin         return devfs;
83004e86ffSlogin     }
84004e86ffSlogin 
85004e86ffSlogin     /// @brief 注册系统内部自带的设备
86004e86ffSlogin     fn register_bultinin_device(&self) {
87004e86ffSlogin         use null_dev::LockedNullInode;
88004e86ffSlogin         use zero_dev::LockedZeroInode;
89004e86ffSlogin         let dev_root: Arc<LockedDevFSInode> = self.root_inode.clone();
90004e86ffSlogin         dev_root
91004e86ffSlogin             .add_dev("null", LockedNullInode::new())
92004e86ffSlogin             .expect("DevFS: Failed to register /dev/null");
93004e86ffSlogin         dev_root
94004e86ffSlogin             .add_dev("zero", LockedZeroInode::new())
95004e86ffSlogin             .expect("DevFS: Failed to register /dev/zero");
96004e86ffSlogin     }
97004e86ffSlogin 
98004e86ffSlogin     /// @brief 在devfs内注册设备
99004e86ffSlogin     ///
100004e86ffSlogin     /// @param name 设备名称
101004e86ffSlogin     /// @param device 设备节点的结构体
10220e3152eSlogin     pub fn register_device<T: DeviceINode>(
10320e3152eSlogin         &self,
10420e3152eSlogin         name: &str,
10520e3152eSlogin         device: Arc<T>,
10620e3152eSlogin     ) -> Result<(), SystemError> {
107004e86ffSlogin         let dev_root_inode: Arc<LockedDevFSInode> = self.root_inode.clone();
10820e3152eSlogin         let metadata = device.metadata()?;
10920e3152eSlogin         match metadata.file_type {
110004e86ffSlogin             // 字节设备挂载在 /dev/char
111004e86ffSlogin             FileType::CharDevice => {
112004e86ffSlogin                 if let Err(_) = dev_root_inode.find("char") {
1136b4e7a29SLoGin                     dev_root_inode.create(
1146b4e7a29SLoGin                         "char",
1156b4e7a29SLoGin                         FileType::Dir,
1166b4e7a29SLoGin                         ModeType::from_bits_truncate(0o755),
1176b4e7a29SLoGin                     )?;
118004e86ffSlogin                 }
119004e86ffSlogin 
120004e86ffSlogin                 let any_char_inode = dev_root_inode.find("char")?;
121004e86ffSlogin                 let dev_char_inode: &LockedDevFSInode = any_char_inode
122004e86ffSlogin                     .as_any_ref()
123004e86ffSlogin                     .downcast_ref::<LockedDevFSInode>()
124004e86ffSlogin                     .unwrap();
12520e3152eSlogin                 // 在 /dev/char 下创建设备节点
126004e86ffSlogin                 dev_char_inode.add_dev(name, device.clone())?;
12720e3152eSlogin 
12820e3152eSlogin                 // 特殊处理 tty 设备,挂载在 /dev 下
12920e3152eSlogin                 if name.starts_with("tty") && name.len() > 3 {
13020e3152eSlogin                     dev_root_inode.add_dev(name, device.clone())?;
13120e3152eSlogin                 }
132004e86ffSlogin                 device.set_fs(dev_char_inode.0.lock().fs.clone());
133004e86ffSlogin             }
134004e86ffSlogin             FileType::BlockDevice => {
135004e86ffSlogin                 if let Err(_) = dev_root_inode.find("block") {
1366b4e7a29SLoGin                     dev_root_inode.create(
1376b4e7a29SLoGin                         "block",
1386b4e7a29SLoGin                         FileType::Dir,
1396b4e7a29SLoGin                         ModeType::from_bits_truncate(0o755),
1406b4e7a29SLoGin                     )?;
141004e86ffSlogin                 }
142004e86ffSlogin 
143004e86ffSlogin                 let any_block_inode = dev_root_inode.find("block")?;
144004e86ffSlogin                 let dev_block_inode: &LockedDevFSInode = any_block_inode
145004e86ffSlogin                     .as_any_ref()
146004e86ffSlogin                     .downcast_ref::<LockedDevFSInode>()
147004e86ffSlogin                     .unwrap();
148004e86ffSlogin 
149004e86ffSlogin                 dev_block_inode.add_dev(name, device.clone())?;
150004e86ffSlogin                 device.set_fs(dev_block_inode.0.lock().fs.clone());
151004e86ffSlogin             }
152*40314b30SXiaoye Zheng             FileType::KvmDevice => {
153*40314b30SXiaoye Zheng                 dev_root_inode
154*40314b30SXiaoye Zheng                     .add_dev(name, device.clone())
155*40314b30SXiaoye Zheng                     .expect("DevFS: Failed to register /dev/kvm");
156*40314b30SXiaoye Zheng             }
157004e86ffSlogin             _ => {
15879a452ceShoumkh                 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
159004e86ffSlogin             }
160004e86ffSlogin         }
161004e86ffSlogin 
162004e86ffSlogin         return Ok(());
163004e86ffSlogin     }
164004e86ffSlogin 
165004e86ffSlogin     /// @brief 卸载设备
16620e3152eSlogin     pub fn unregister_device<T: DeviceINode>(
16720e3152eSlogin         &self,
16820e3152eSlogin         name: &str,
16920e3152eSlogin         device: Arc<T>,
17020e3152eSlogin     ) -> Result<(), SystemError> {
171004e86ffSlogin         let dev_root_inode: Arc<LockedDevFSInode> = self.root_inode.clone();
172004e86ffSlogin         match device.metadata().unwrap().file_type {
173004e86ffSlogin             // 字节设备挂载在 /dev/char
174004e86ffSlogin             FileType::CharDevice => {
175004e86ffSlogin                 if let Err(_) = dev_root_inode.find("char") {
176676b8ef6SMork                     return Err(SystemError::ENOENT);
177004e86ffSlogin                 }
178004e86ffSlogin 
179004e86ffSlogin                 let any_char_inode = dev_root_inode.find("char")?;
180004e86ffSlogin                 let dev_char_inode = any_char_inode
181004e86ffSlogin                     .as_any_ref()
182004e86ffSlogin                     .downcast_ref::<LockedDevFSInode>()
183004e86ffSlogin                     .unwrap();
184004e86ffSlogin                 // TODO: 调用设备的卸载接口(当引入卸载接口之后)
185004e86ffSlogin                 dev_char_inode.remove(name)?;
186004e86ffSlogin             }
187004e86ffSlogin             FileType::BlockDevice => {
188004e86ffSlogin                 if let Err(_) = dev_root_inode.find("block") {
189676b8ef6SMork                     return Err(SystemError::ENOENT);
190004e86ffSlogin                 }
191004e86ffSlogin 
192004e86ffSlogin                 let any_block_inode = dev_root_inode.find("block")?;
193004e86ffSlogin                 let dev_block_inode = any_block_inode
194004e86ffSlogin                     .as_any_ref()
195004e86ffSlogin                     .downcast_ref::<LockedDevFSInode>()
196004e86ffSlogin                     .unwrap();
197004e86ffSlogin 
198004e86ffSlogin                 dev_block_inode.remove(name)?;
199004e86ffSlogin             }
200004e86ffSlogin             _ => {
20179a452ceShoumkh                 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
202004e86ffSlogin             }
203004e86ffSlogin         }
204004e86ffSlogin 
205004e86ffSlogin         return Ok(());
206004e86ffSlogin     }
207004e86ffSlogin }
208004e86ffSlogin 
209004e86ffSlogin /// @brief dev文件i节点(锁)
210004e86ffSlogin #[derive(Debug)]
211004e86ffSlogin pub struct LockedDevFSInode(SpinLock<DevFSInode>);
212004e86ffSlogin 
213004e86ffSlogin /// @brief dev文件i节点(无锁)
214004e86ffSlogin #[derive(Debug)]
215004e86ffSlogin pub struct DevFSInode {
216004e86ffSlogin     /// 指向父Inode的弱引用
217004e86ffSlogin     parent: Weak<LockedDevFSInode>,
218004e86ffSlogin     /// 指向自身的弱引用
219004e86ffSlogin     self_ref: Weak<LockedDevFSInode>,
220004e86ffSlogin     /// 子Inode的B树
221004e86ffSlogin     children: BTreeMap<String, Arc<dyn IndexNode>>,
222004e86ffSlogin     /// 指向inode所在的文件系统对象的指针
223004e86ffSlogin     fs: Weak<DevFS>,
224004e86ffSlogin     /// INode 元数据
225004e86ffSlogin     metadata: Metadata,
226004e86ffSlogin }
227004e86ffSlogin 
228004e86ffSlogin impl DevFSInode {
2296b4e7a29SLoGin     pub fn new(dev_type_: FileType, mode: ModeType, data_: usize) -> Self {
2306b4e7a29SLoGin         return Self::new_with_parent(Weak::default(), dev_type_, mode, data_);
231004e86ffSlogin     }
232004e86ffSlogin 
233004e86ffSlogin     pub fn new_with_parent(
234004e86ffSlogin         parent: Weak<LockedDevFSInode>,
235004e86ffSlogin         dev_type_: FileType,
2366b4e7a29SLoGin         mode: ModeType,
237004e86ffSlogin         data_: usize,
238004e86ffSlogin     ) -> Self {
239004e86ffSlogin         return DevFSInode {
240004e86ffSlogin             parent: parent,
241004e86ffSlogin             self_ref: Weak::default(),
242004e86ffSlogin             children: BTreeMap::new(),
243004e86ffSlogin             metadata: Metadata {
244004e86ffSlogin                 dev_id: 1,
245004e86ffSlogin                 inode_id: generate_inode_id(),
246004e86ffSlogin                 size: 0,
247004e86ffSlogin                 blk_size: 0,
248004e86ffSlogin                 blocks: 0,
249004e86ffSlogin                 atime: TimeSpec::default(),
250004e86ffSlogin                 mtime: TimeSpec::default(),
251004e86ffSlogin                 ctime: TimeSpec::default(),
252004e86ffSlogin                 file_type: dev_type_, // 文件夹
2536b4e7a29SLoGin                 mode,
254004e86ffSlogin                 nlinks: 1,
255004e86ffSlogin                 uid: 0,
256004e86ffSlogin                 gid: 0,
257004e86ffSlogin                 raw_dev: data_,
258004e86ffSlogin             },
259004e86ffSlogin             fs: Weak::default(),
260004e86ffSlogin         };
261004e86ffSlogin     }
262004e86ffSlogin }
263004e86ffSlogin 
264004e86ffSlogin impl LockedDevFSInode {
265676b8ef6SMork     pub fn add_dir(&self, name: &str) -> Result<(), SystemError> {
266004e86ffSlogin         let guard: SpinLockGuard<DevFSInode> = self.0.lock();
267004e86ffSlogin 
268004e86ffSlogin         if guard.children.contains_key(name) {
269676b8ef6SMork             return Err(SystemError::EEXIST);
270004e86ffSlogin         }
271004e86ffSlogin 
2726b4e7a29SLoGin         match self.do_create_with_data(
2736b4e7a29SLoGin             guard,
2746b4e7a29SLoGin             name,
2756b4e7a29SLoGin             FileType::Dir,
2766b4e7a29SLoGin             ModeType::from_bits_truncate(0o755),
2776b4e7a29SLoGin             0,
2786b4e7a29SLoGin         ) {
279004e86ffSlogin             Ok(inode) => inode,
280004e86ffSlogin             Err(err) => {
281004e86ffSlogin                 return Err(err);
282004e86ffSlogin             }
283004e86ffSlogin         };
284004e86ffSlogin 
285004e86ffSlogin         return Ok(());
286004e86ffSlogin     }
287004e86ffSlogin 
288676b8ef6SMork     pub fn add_dev(&self, name: &str, dev: Arc<dyn IndexNode>) -> Result<(), SystemError> {
289004e86ffSlogin         let mut this = self.0.lock();
290004e86ffSlogin 
291004e86ffSlogin         if this.children.contains_key(name) {
292676b8ef6SMork             return Err(SystemError::EEXIST);
293004e86ffSlogin         }
294004e86ffSlogin 
295004e86ffSlogin         this.children.insert(name.to_string(), dev);
296004e86ffSlogin         return Ok(());
297004e86ffSlogin     }
298004e86ffSlogin 
299676b8ef6SMork     pub fn remove(&self, name: &str) -> Result<(), SystemError> {
300004e86ffSlogin         let x = self
301004e86ffSlogin             .0
302004e86ffSlogin             .lock()
303004e86ffSlogin             .children
304004e86ffSlogin             .remove(name)
305676b8ef6SMork             .ok_or(SystemError::ENOENT)?;
306004e86ffSlogin 
307004e86ffSlogin         drop(x);
308004e86ffSlogin         return Ok(());
309004e86ffSlogin     }
310004e86ffSlogin 
31173c607aaSYJwu2023     fn do_create_with_data(
31273c607aaSYJwu2023         &self,
31373c607aaSYJwu2023         mut guard: SpinLockGuard<DevFSInode>,
3146b4e7a29SLoGin         name: &str,
3156b4e7a29SLoGin         file_type: FileType,
3166b4e7a29SLoGin         mode: ModeType,
3176b4e7a29SLoGin         data: usize,
318676b8ef6SMork     ) -> Result<Arc<dyn IndexNode>, SystemError> {
319004e86ffSlogin         if guard.metadata.file_type != FileType::Dir {
320676b8ef6SMork             return Err(SystemError::ENOTDIR);
321004e86ffSlogin         }
322004e86ffSlogin 
323004e86ffSlogin         // 如果有重名的,则返回
3246b4e7a29SLoGin         if guard.children.contains_key(name) {
325676b8ef6SMork             return Err(SystemError::EEXIST);
326004e86ffSlogin         }
327004e86ffSlogin 
328004e86ffSlogin         // 创建inode
329004e86ffSlogin         let result: Arc<LockedDevFSInode> = Arc::new(LockedDevFSInode(SpinLock::new(DevFSInode {
330004e86ffSlogin             parent: guard.self_ref.clone(),
331004e86ffSlogin             self_ref: Weak::default(),
332004e86ffSlogin             children: BTreeMap::new(),
333004e86ffSlogin             metadata: Metadata {
334004e86ffSlogin                 dev_id: 0,
335004e86ffSlogin                 inode_id: generate_inode_id(),
336004e86ffSlogin                 size: 0,
337004e86ffSlogin                 blk_size: 0,
338004e86ffSlogin                 blocks: 0,
339004e86ffSlogin                 atime: TimeSpec::default(),
340004e86ffSlogin                 mtime: TimeSpec::default(),
341004e86ffSlogin                 ctime: TimeSpec::default(),
3426b4e7a29SLoGin                 file_type,
3436b4e7a29SLoGin                 mode,
344004e86ffSlogin                 nlinks: 1,
345004e86ffSlogin                 uid: 0,
346004e86ffSlogin                 gid: 0,
3476b4e7a29SLoGin                 raw_dev: data,
348004e86ffSlogin             },
349004e86ffSlogin             fs: guard.fs.clone(),
350004e86ffSlogin         })));
351004e86ffSlogin 
352004e86ffSlogin         // 初始化inode的自引用的weak指针
353004e86ffSlogin         result.0.lock().self_ref = Arc::downgrade(&result);
354004e86ffSlogin 
355004e86ffSlogin         // 将子inode插入父inode的B树中
3566b4e7a29SLoGin         guard.children.insert(String::from(name), result.clone());
357004e86ffSlogin         return Ok(result);
358004e86ffSlogin     }
359004e86ffSlogin }
360004e86ffSlogin 
361004e86ffSlogin impl IndexNode for LockedDevFSInode {
362004e86ffSlogin     fn as_any_ref(&self) -> &dyn core::any::Any {
363004e86ffSlogin         self
364004e86ffSlogin     }
365004e86ffSlogin 
36620e3152eSlogin     fn open(
36720e3152eSlogin         &self,
36820e3152eSlogin         _data: &mut super::vfs::FilePrivateData,
36920e3152eSlogin         _mode: &FileMode,
37020e3152eSlogin     ) -> Result<(), SystemError> {
371004e86ffSlogin         return Ok(());
372004e86ffSlogin     }
373004e86ffSlogin 
374676b8ef6SMork     fn close(&self, _data: &mut super::vfs::FilePrivateData) -> Result<(), SystemError> {
375004e86ffSlogin         return Ok(());
376004e86ffSlogin     }
377004e86ffSlogin 
378004e86ffSlogin     fn create_with_data(
379004e86ffSlogin         &self,
380004e86ffSlogin         name: &str,
381004e86ffSlogin         file_type: FileType,
3826b4e7a29SLoGin         mode: ModeType,
383004e86ffSlogin         data: usize,
384676b8ef6SMork     ) -> Result<Arc<dyn IndexNode>, SystemError> {
385004e86ffSlogin         // 获取当前inode
386004e86ffSlogin         let guard: SpinLockGuard<DevFSInode> = self.0.lock();
387004e86ffSlogin         // 如果当前inode不是文件夹,则返回
388004e86ffSlogin         return self.do_create_with_data(guard, name, file_type, mode, data);
389004e86ffSlogin     }
390004e86ffSlogin 
391676b8ef6SMork     fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
392004e86ffSlogin         let inode = self.0.lock();
393004e86ffSlogin 
394004e86ffSlogin         if inode.metadata.file_type != FileType::Dir {
395676b8ef6SMork             return Err(SystemError::ENOTDIR);
396004e86ffSlogin         }
397004e86ffSlogin 
398004e86ffSlogin         match name {
399004e86ffSlogin             "" | "." => {
400676b8ef6SMork                 return Ok(inode.self_ref.upgrade().ok_or(SystemError::ENOENT)?);
401004e86ffSlogin             }
402004e86ffSlogin             ".." => {
403676b8ef6SMork                 return Ok(inode.parent.upgrade().ok_or(SystemError::ENOENT)?);
404004e86ffSlogin             }
405004e86ffSlogin             name => {
406004e86ffSlogin                 // 在子目录项中查找
407676b8ef6SMork                 return Ok(inode.children.get(name).ok_or(SystemError::ENOENT)?.clone());
408004e86ffSlogin             }
409004e86ffSlogin         }
410004e86ffSlogin     }
411004e86ffSlogin 
412004e86ffSlogin     fn fs(&self) -> Arc<dyn FileSystem> {
413004e86ffSlogin         return self.0.lock().fs.upgrade().unwrap();
414004e86ffSlogin     }
415004e86ffSlogin 
416676b8ef6SMork     fn get_entry_name(&self, ino: super::vfs::InodeId) -> Result<String, SystemError> {
417004e86ffSlogin         let inode: SpinLockGuard<DevFSInode> = self.0.lock();
418004e86ffSlogin         if inode.metadata.file_type != FileType::Dir {
419676b8ef6SMork             return Err(SystemError::ENOTDIR);
420004e86ffSlogin         }
421004e86ffSlogin 
4226b4e7a29SLoGin         match ino.into() {
423004e86ffSlogin             0 => {
424004e86ffSlogin                 return Ok(String::from("."));
425004e86ffSlogin             }
426004e86ffSlogin             1 => {
427004e86ffSlogin                 return Ok(String::from(".."));
428004e86ffSlogin             }
429004e86ffSlogin             ino => {
430004e86ffSlogin                 // 暴力遍历所有的children,判断inode id是否相同
431004e86ffSlogin                 // TODO: 优化这里,这个地方性能很差!
432004e86ffSlogin                 let mut key: Vec<String> = inode
433004e86ffSlogin                     .children
434004e86ffSlogin                     .keys()
4356b4e7a29SLoGin                     .filter(|k| {
4366b4e7a29SLoGin                         inode
4376b4e7a29SLoGin                             .children
4386b4e7a29SLoGin                             .get(*k)
4396b4e7a29SLoGin                             .unwrap()
4406b4e7a29SLoGin                             .metadata()
4416b4e7a29SLoGin                             .unwrap()
4426b4e7a29SLoGin                             .inode_id
4436b4e7a29SLoGin                             .into()
4446b4e7a29SLoGin                             == ino
4456b4e7a29SLoGin                     })
446004e86ffSlogin                     .cloned()
447004e86ffSlogin                     .collect();
448004e86ffSlogin 
449004e86ffSlogin                 match key.len() {
450676b8ef6SMork                     0=>{return Err(SystemError::ENOENT);}
451004e86ffSlogin                     1=>{return Ok(key.remove(0));}
4526b4e7a29SLoGin                     _ => panic!("Devfs get_entry_name: key.len()={key_len}>1, current inode_id={inode_id:?}, to find={to_find:?}", key_len=key.len(), inode_id = inode.metadata.inode_id, to_find=ino)
453004e86ffSlogin                 }
454004e86ffSlogin             }
455004e86ffSlogin         }
456004e86ffSlogin     }
457004e86ffSlogin 
458676b8ef6SMork     fn ioctl(&self, _cmd: u32, _data: usize) -> Result<usize, SystemError> {
45979a452ceShoumkh         Err(SystemError::EOPNOTSUPP_OR_ENOTSUP)
460004e86ffSlogin     }
461004e86ffSlogin 
462676b8ef6SMork     fn list(&self) -> Result<Vec<String>, SystemError> {
463004e86ffSlogin         let info = self.metadata()?;
464004e86ffSlogin         if info.file_type != FileType::Dir {
465676b8ef6SMork             return Err(SystemError::ENOTDIR);
466004e86ffSlogin         }
467004e86ffSlogin 
468004e86ffSlogin         let mut keys: Vec<String> = Vec::new();
469004e86ffSlogin         keys.push(String::from("."));
470004e86ffSlogin         keys.push(String::from(".."));
471004e86ffSlogin         keys.append(&mut self.0.lock().children.keys().cloned().collect());
472004e86ffSlogin 
473004e86ffSlogin         return Ok(keys);
474004e86ffSlogin     }
475004e86ffSlogin 
476676b8ef6SMork     fn metadata(&self) -> Result<Metadata, SystemError> {
477004e86ffSlogin         return Ok(self.0.lock().metadata.clone());
478004e86ffSlogin     }
479004e86ffSlogin 
480676b8ef6SMork     fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
481004e86ffSlogin         let mut inode = self.0.lock();
482004e86ffSlogin         inode.metadata.atime = metadata.atime;
483004e86ffSlogin         inode.metadata.mtime = metadata.mtime;
484004e86ffSlogin         inode.metadata.ctime = metadata.ctime;
485004e86ffSlogin         inode.metadata.mode = metadata.mode;
486004e86ffSlogin         inode.metadata.uid = metadata.uid;
487004e86ffSlogin         inode.metadata.gid = metadata.gid;
488004e86ffSlogin 
489004e86ffSlogin         return Ok(());
490004e86ffSlogin     }
491004e86ffSlogin 
492676b8ef6SMork     fn poll(&self) -> Result<super::vfs::PollStatus, SystemError> {
493004e86ffSlogin         // 加锁
494004e86ffSlogin         let inode: SpinLockGuard<DevFSInode> = self.0.lock();
495004e86ffSlogin 
496004e86ffSlogin         // 检查当前inode是否为一个文件夹,如果是的话,就返回错误
497004e86ffSlogin         if inode.metadata.file_type == FileType::Dir {
498676b8ef6SMork             return Err(SystemError::EISDIR);
499004e86ffSlogin         }
500004e86ffSlogin 
501cde5492fSlogin         return Ok(PollStatus::READ | PollStatus::WRITE);
502004e86ffSlogin     }
503004e86ffSlogin 
504004e86ffSlogin     /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
505004e86ffSlogin     fn read_at(
506004e86ffSlogin         &self,
507004e86ffSlogin         _offset: usize,
508004e86ffSlogin         _len: usize,
509004e86ffSlogin         _buf: &mut [u8],
510004e86ffSlogin         _data: &mut super::vfs::file::FilePrivateData,
511676b8ef6SMork     ) -> Result<usize, SystemError> {
51220e3152eSlogin         kerror!("DevFS: read_at is not supported!");
51379a452ceShoumkh         Err(SystemError::EOPNOTSUPP_OR_ENOTSUP)
514004e86ffSlogin     }
515004e86ffSlogin 
516004e86ffSlogin     /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写
517004e86ffSlogin     fn write_at(
518004e86ffSlogin         &self,
519004e86ffSlogin         _offset: usize,
520004e86ffSlogin         _len: usize,
521004e86ffSlogin         _buf: &[u8],
522004e86ffSlogin         _data: &mut super::vfs::file::FilePrivateData,
523676b8ef6SMork     ) -> Result<usize, SystemError> {
52479a452ceShoumkh         Err(SystemError::EOPNOTSUPP_OR_ENOTSUP)
525004e86ffSlogin     }
526004e86ffSlogin }
527004e86ffSlogin 
528004e86ffSlogin /// @brief 所有的设备INode都需要额外实现这个trait
529004e86ffSlogin pub trait DeviceINode: IndexNode {
530004e86ffSlogin     fn set_fs(&self, fs: Weak<DevFS>);
531004e86ffSlogin     // TODO: 增加 unregister 方法
532004e86ffSlogin }
533004e86ffSlogin 
534004e86ffSlogin /// @brief 获取devfs实例的强类型不可变引用
535004e86ffSlogin macro_rules! devfs_exact_ref {
536004e86ffSlogin     () => {{
537676b8ef6SMork         let devfs_inode: Result<Arc<dyn IndexNode>, SystemError> = ROOT_INODE().find("dev");
538004e86ffSlogin         if let Err(e) = devfs_inode {
539676b8ef6SMork             kerror!("failed to get DevFS ref. errcode = {:?}", e);
540676b8ef6SMork             return Err(SystemError::ENOENT);
541004e86ffSlogin         }
542004e86ffSlogin 
543004e86ffSlogin         let binding = devfs_inode.unwrap();
544004e86ffSlogin         let devfs_inode: &LockedDevFSInode = binding
545004e86ffSlogin             .as_any_ref()
546004e86ffSlogin             .downcast_ref::<LockedDevFSInode>()
547004e86ffSlogin             .unwrap();
548004e86ffSlogin         let binding = devfs_inode.fs();
549004e86ffSlogin         binding
550004e86ffSlogin     }
551004e86ffSlogin     .as_any_ref()
552004e86ffSlogin     .downcast_ref::<DevFS>()
553004e86ffSlogin     .unwrap()};
554004e86ffSlogin }
555004e86ffSlogin /// @brief devfs的设备注册函数
556676b8ef6SMork pub fn devfs_register<T: DeviceINode>(name: &str, device: Arc<T>) -> Result<(), SystemError> {
557004e86ffSlogin     return devfs_exact_ref!().register_device(name, device);
558004e86ffSlogin }
559004e86ffSlogin 
560004e86ffSlogin /// @brief devfs的设备卸载函数
561004e86ffSlogin #[allow(dead_code)]
562676b8ef6SMork pub fn devfs_unregister<T: DeviceINode>(name: &str, device: Arc<T>) -> Result<(), SystemError> {
563004e86ffSlogin     return devfs_exact_ref!().unregister_device(name, device);
564004e86ffSlogin }
565b087521eSChiichen 
566b087521eSChiichen pub fn devfs_init() -> Result<(), SystemError> {
567b087521eSChiichen     static INIT: Once = Once::new();
568b087521eSChiichen     let mut result = None;
569b087521eSChiichen     INIT.call_once(|| {
57034e6d6c8Syuyi2439         kinfo!("Initializing DevFS...");
571b087521eSChiichen         // 创建 devfs 实例
572b087521eSChiichen         let devfs: Arc<DevFS> = DevFS::new();
573b087521eSChiichen         // devfs 挂载
574b087521eSChiichen         let _t = ROOT_INODE()
575b087521eSChiichen             .find("dev")
576b087521eSChiichen             .expect("Cannot find /dev")
577b087521eSChiichen             .mount(devfs)
578b087521eSChiichen             .expect("Failed to mount devfs");
579b087521eSChiichen         kinfo!("DevFS mounted.");
580b087521eSChiichen         result = Some(Ok(()));
581b087521eSChiichen     });
582b087521eSChiichen 
583b087521eSChiichen     return result.unwrap();
584b087521eSChiichen }
585