xref: /DragonOS/kernel/src/filesystem/devfs/zero_dev.rs (revision 06500303303ec14711b4f995e2058e12703f0f2c)
10d48c3c9Slogin use crate::filesystem::vfs::file::FileMode;
2004e86ffSlogin use crate::filesystem::vfs::make_rawdev;
3004e86ffSlogin use crate::filesystem::vfs::{
4004e86ffSlogin     core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
5004e86ffSlogin };
678bf93f0SYJwu2023 use crate::{libs::spinlock::SpinLock, syscall::SystemError, time::TimeSpec};
7004e86ffSlogin use alloc::{
8004e86ffSlogin     string::String,
9004e86ffSlogin     sync::{Arc, Weak},
10004e86ffSlogin     vec::Vec,
11004e86ffSlogin };
12004e86ffSlogin // use uuid::{uuid, Uuid};
13004e86ffSlogin use super::{DevFS, DeviceINode};
14004e86ffSlogin 
15004e86ffSlogin #[derive(Debug)]
16004e86ffSlogin pub struct ZeroInode {
17004e86ffSlogin     /// uuid 暂时不知道有什么用(x
18004e86ffSlogin     // uuid: Uuid,
19004e86ffSlogin     /// 指向自身的弱引用
20004e86ffSlogin     self_ref: Weak<LockedZeroInode>,
21004e86ffSlogin     /// 指向inode所在的文件系统对象的指针
22004e86ffSlogin     fs: Weak<DevFS>,
23004e86ffSlogin     /// INode 元数据
24004e86ffSlogin     metadata: Metadata,
25004e86ffSlogin }
26004e86ffSlogin 
27004e86ffSlogin #[derive(Debug)]
28004e86ffSlogin pub struct LockedZeroInode(SpinLock<ZeroInode>);
29004e86ffSlogin 
30004e86ffSlogin impl LockedZeroInode {
31004e86ffSlogin     pub fn new() -> Arc<Self> {
32004e86ffSlogin         let inode = ZeroInode {
33004e86ffSlogin             // uuid: Uuid::new_v5(),
34004e86ffSlogin             self_ref: Weak::default(),
35004e86ffSlogin             fs: Weak::default(),
36004e86ffSlogin             metadata: Metadata {
37004e86ffSlogin                 dev_id: 1,
38004e86ffSlogin                 inode_id: generate_inode_id(),
39004e86ffSlogin                 size: 0,
40004e86ffSlogin                 blk_size: 0,
41004e86ffSlogin                 blocks: 0,
42004e86ffSlogin                 atime: TimeSpec::default(),
43004e86ffSlogin                 mtime: TimeSpec::default(),
44004e86ffSlogin                 ctime: TimeSpec::default(),
45004e86ffSlogin                 file_type: FileType::CharDevice, // 文件夹,block设备,char设备
46004e86ffSlogin                 mode: 0o666,
47004e86ffSlogin                 nlinks: 1,
48004e86ffSlogin                 uid: 0,
49004e86ffSlogin                 gid: 0,
50004e86ffSlogin                 raw_dev: make_rawdev(1, 3), // 这里用来作为device number
51004e86ffSlogin             },
52004e86ffSlogin         };
53004e86ffSlogin 
54004e86ffSlogin         let result = Arc::new(LockedZeroInode(SpinLock::new(inode)));
55004e86ffSlogin         result.0.lock().self_ref = Arc::downgrade(&result);
56004e86ffSlogin 
57004e86ffSlogin         return result;
58004e86ffSlogin     }
59004e86ffSlogin }
60004e86ffSlogin 
61004e86ffSlogin impl DeviceINode for LockedZeroInode {
62004e86ffSlogin     fn set_fs(&self, fs: Weak<DevFS>) {
63004e86ffSlogin         self.0.lock().fs = fs;
64004e86ffSlogin     }
65004e86ffSlogin }
66004e86ffSlogin 
67004e86ffSlogin impl IndexNode for LockedZeroInode {
68004e86ffSlogin     fn as_any_ref(&self) -> &dyn core::any::Any {
69004e86ffSlogin         self
70004e86ffSlogin     }
71004e86ffSlogin 
72676b8ef6SMork     fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
73*06500303SLoGin         return Ok(());
74004e86ffSlogin     }
75004e86ffSlogin 
76676b8ef6SMork     fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
77*06500303SLoGin         return Ok(());
78004e86ffSlogin     }
79004e86ffSlogin 
80676b8ef6SMork     fn metadata(&self) -> Result<Metadata, SystemError> {
81004e86ffSlogin         return Ok(self.0.lock().metadata.clone());
82004e86ffSlogin     }
83004e86ffSlogin 
84004e86ffSlogin     fn fs(&self) -> Arc<dyn FileSystem> {
85004e86ffSlogin         return self.0.lock().fs.upgrade().unwrap();
86004e86ffSlogin     }
87004e86ffSlogin 
88676b8ef6SMork     fn list(&self) -> Result<Vec<String>, SystemError> {
8979a452ceShoumkh         Err(SystemError::EOPNOTSUPP_OR_ENOTSUP)
90004e86ffSlogin     }
91004e86ffSlogin 
92676b8ef6SMork     fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
93004e86ffSlogin         let mut inode = self.0.lock();
94004e86ffSlogin         inode.metadata.atime = metadata.atime;
95004e86ffSlogin         inode.metadata.mtime = metadata.mtime;
96004e86ffSlogin         inode.metadata.ctime = metadata.ctime;
97004e86ffSlogin         inode.metadata.mode = metadata.mode;
98004e86ffSlogin         inode.metadata.uid = metadata.uid;
99004e86ffSlogin         inode.metadata.gid = metadata.gid;
100004e86ffSlogin 
101004e86ffSlogin         return Ok(());
102004e86ffSlogin     }
103004e86ffSlogin 
104676b8ef6SMork     fn poll(&self) -> Result<PollStatus, SystemError> {
105cde5492fSlogin         return Ok(PollStatus::READ | PollStatus::WRITE);
106004e86ffSlogin     }
107004e86ffSlogin 
108004e86ffSlogin     /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
109004e86ffSlogin     fn read_at(
110004e86ffSlogin         &self,
111004e86ffSlogin         _offset: usize,
112004e86ffSlogin         len: usize,
113004e86ffSlogin         buf: &mut [u8],
114004e86ffSlogin         _data: &mut FilePrivateData,
115676b8ef6SMork     ) -> Result<usize, SystemError> {
116004e86ffSlogin         if buf.len() < len {
117676b8ef6SMork             return Err(SystemError::EINVAL);
118004e86ffSlogin         }
119004e86ffSlogin 
120004e86ffSlogin         for i in 0..len {
121004e86ffSlogin             buf[i] = 0;
122004e86ffSlogin         }
123004e86ffSlogin 
124004e86ffSlogin         return Ok(len);
125004e86ffSlogin     }
126004e86ffSlogin 
127004e86ffSlogin     /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写
128004e86ffSlogin     fn write_at(
129004e86ffSlogin         &self,
130004e86ffSlogin         _offset: usize,
131004e86ffSlogin         len: usize,
132004e86ffSlogin         buf: &[u8],
133004e86ffSlogin         _data: &mut FilePrivateData,
134676b8ef6SMork     ) -> Result<usize, SystemError> {
135004e86ffSlogin         if buf.len() < len {
136676b8ef6SMork             return Err(SystemError::EINVAL);
137004e86ffSlogin         }
138004e86ffSlogin 
139004e86ffSlogin         Ok(len)
140004e86ffSlogin     }
141004e86ffSlogin }
142