xref: /DragonOS/kernel/src/driver/disk/ahci/ahci_inode.rs (revision 0d48c3c9c21a2dd470d0e1e58b507db60e0887bb)
1004e86ffSlogin use crate::filesystem::devfs::{DevFS, DeviceINode};
2*0d48c3c9Slogin use crate::filesystem::vfs::file::FileMode;
3004e86ffSlogin use crate::filesystem::vfs::{
4004e86ffSlogin     core::generate_inode_id, make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode,
5004e86ffSlogin     Metadata, PollStatus,
6004e86ffSlogin };
7004e86ffSlogin use crate::io::device::BlockDevice;
8004e86ffSlogin use crate::{
9004e86ffSlogin     include::bindings::bindings::{EINVAL, ENOTSUP},
10004e86ffSlogin     libs::spinlock::SpinLock,
11004e86ffSlogin     time::TimeSpec,
12004e86ffSlogin };
13004e86ffSlogin use alloc::{
14004e86ffSlogin     string::String,
15004e86ffSlogin     sync::{Arc, Weak},
16004e86ffSlogin     vec::Vec,
17004e86ffSlogin };
18004e86ffSlogin 
19004e86ffSlogin use super::ahcidisk::LockedAhciDisk;
20004e86ffSlogin 
21004e86ffSlogin #[derive(Debug)]
22004e86ffSlogin pub struct AhciInode {
23004e86ffSlogin     /// uuid 暂时不知道有什么用(x
24004e86ffSlogin     // uuid: Uuid,
25004e86ffSlogin     /// 指向自身的弱引用
26004e86ffSlogin     self_ref: Weak<LockedAhciInode>,
27004e86ffSlogin     /// 指向inode所在的文件系统对象的指针
28004e86ffSlogin     fs: Weak<DevFS>,
29004e86ffSlogin     /// INode 元数据
30004e86ffSlogin     metadata: Metadata,
31004e86ffSlogin     /// INode 对应的磁盘
32004e86ffSlogin     disk: Arc<LockedAhciDisk>,
33004e86ffSlogin }
34004e86ffSlogin 
35004e86ffSlogin #[derive(Debug)]
36004e86ffSlogin pub struct LockedAhciInode(pub SpinLock<AhciInode>);
37004e86ffSlogin 
38004e86ffSlogin impl LockedAhciInode {
39004e86ffSlogin     pub fn new(disk: Arc<LockedAhciDisk>) -> Arc<Self> {
40004e86ffSlogin         let inode = AhciInode {
41004e86ffSlogin             // uuid: Uuid::new_v5(),
42004e86ffSlogin             self_ref: Weak::default(),
43004e86ffSlogin             fs: Weak::default(),
44004e86ffSlogin             disk: disk,
45004e86ffSlogin             metadata: Metadata {
46004e86ffSlogin                 dev_id: 1,
47004e86ffSlogin                 inode_id: generate_inode_id(),
48004e86ffSlogin                 size: 0,
49004e86ffSlogin                 blk_size: 0,
50004e86ffSlogin                 blocks: 0,
51004e86ffSlogin                 atime: TimeSpec::default(),
52004e86ffSlogin                 mtime: TimeSpec::default(),
53004e86ffSlogin                 ctime: TimeSpec::default(),
54004e86ffSlogin                 file_type: FileType::BlockDevice, // 文件夹,block设备,char设备
55004e86ffSlogin                 mode: 0o666,
56004e86ffSlogin                 nlinks: 1,
57004e86ffSlogin                 uid: 0,
58004e86ffSlogin                 gid: 0,
59004e86ffSlogin                 raw_dev: make_rawdev(1, 3), // 这里用来作为device number
60004e86ffSlogin             },
61004e86ffSlogin         };
62004e86ffSlogin 
63004e86ffSlogin         let result = Arc::new(LockedAhciInode(SpinLock::new(inode)));
64004e86ffSlogin         result.0.lock().self_ref = Arc::downgrade(&result);
65004e86ffSlogin 
66004e86ffSlogin         return result;
67004e86ffSlogin     }
68004e86ffSlogin }
69004e86ffSlogin 
70004e86ffSlogin impl DeviceINode for LockedAhciInode {
71004e86ffSlogin     fn set_fs(&self, fs: Weak<DevFS>) {
72004e86ffSlogin         self.0.lock().fs = fs;
73004e86ffSlogin     }
74004e86ffSlogin }
75004e86ffSlogin 
76004e86ffSlogin impl IndexNode for LockedAhciInode {
77004e86ffSlogin     fn as_any_ref(&self) -> &dyn core::any::Any {
78004e86ffSlogin         self
79004e86ffSlogin     }
80004e86ffSlogin 
81*0d48c3c9Slogin     fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), i32> {
82004e86ffSlogin         Err(-(ENOTSUP as i32))
83004e86ffSlogin     }
84004e86ffSlogin 
85004e86ffSlogin     fn close(&self, _data: &mut FilePrivateData) -> Result<(), i32> {
86004e86ffSlogin         Err(-(ENOTSUP as i32))
87004e86ffSlogin     }
88004e86ffSlogin 
89004e86ffSlogin     fn metadata(&self) -> Result<Metadata, i32> {
90004e86ffSlogin         return Ok(self.0.lock().metadata.clone());
91004e86ffSlogin     }
92004e86ffSlogin 
93004e86ffSlogin     fn fs(&self) -> Arc<dyn FileSystem> {
94004e86ffSlogin         return self.0.lock().fs.upgrade().unwrap();
95004e86ffSlogin     }
96004e86ffSlogin 
97004e86ffSlogin     fn list(&self) -> Result<Vec<String>, i32> {
98004e86ffSlogin         Err(-(ENOTSUP as i32))
99004e86ffSlogin     }
100004e86ffSlogin 
101004e86ffSlogin     fn set_metadata(&self, metadata: &Metadata) -> Result<(), i32> {
102004e86ffSlogin         let mut inode = self.0.lock();
103004e86ffSlogin         inode.metadata.atime = metadata.atime;
104004e86ffSlogin         inode.metadata.mtime = metadata.mtime;
105004e86ffSlogin         inode.metadata.ctime = metadata.ctime;
106004e86ffSlogin         inode.metadata.mode = metadata.mode;
107004e86ffSlogin         inode.metadata.uid = metadata.uid;
108004e86ffSlogin         inode.metadata.gid = metadata.gid;
109004e86ffSlogin 
110004e86ffSlogin         return Ok(());
111004e86ffSlogin     }
112004e86ffSlogin 
113004e86ffSlogin     fn poll(&self) -> Result<PollStatus, i32> {
114004e86ffSlogin         return Ok(PollStatus {
115004e86ffSlogin             flags: PollStatus::READ_MASK | PollStatus::WRITE_MASK,
116004e86ffSlogin         });
117004e86ffSlogin     }
118004e86ffSlogin 
119004e86ffSlogin     /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
120004e86ffSlogin     fn read_at(
121004e86ffSlogin         &self,
122004e86ffSlogin         offset: usize, // lba地址
123004e86ffSlogin         len: usize,
124004e86ffSlogin         buf: &mut [u8],
125004e86ffSlogin         data: &mut FilePrivateData,
126004e86ffSlogin     ) -> Result<usize, i32> {
127004e86ffSlogin         if buf.len() < len {
128004e86ffSlogin             return Err(-(EINVAL as i32));
129004e86ffSlogin         }
130004e86ffSlogin 
131004e86ffSlogin         if let FilePrivateData::Unused = data {
132004e86ffSlogin             return self.0.lock().disk.read_at(offset, len, buf);
133004e86ffSlogin         }
134004e86ffSlogin 
135004e86ffSlogin         return Err(-(EINVAL as i32));
136004e86ffSlogin     }
137004e86ffSlogin 
138004e86ffSlogin     /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写
139004e86ffSlogin     fn write_at(
140004e86ffSlogin         &self,
141004e86ffSlogin         offset: usize, // lba地址
142004e86ffSlogin         len: usize,
143004e86ffSlogin         buf: &[u8],
144004e86ffSlogin         data: &mut FilePrivateData,
145004e86ffSlogin     ) -> Result<usize, i32> {
146004e86ffSlogin         if buf.len() < len {
147004e86ffSlogin             return Err(-(EINVAL as i32));
148004e86ffSlogin         }
149004e86ffSlogin 
150004e86ffSlogin         if let FilePrivateData::Unused = data {
151004e86ffSlogin             return self.0.lock().disk.write_at(offset, len, buf);
152004e86ffSlogin         }
153004e86ffSlogin 
154004e86ffSlogin         return Err(-(EINVAL as i32));
155004e86ffSlogin     }
156004e86ffSlogin }
157