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