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