1 use crate::filesystem::vfs::make_rawdev; 2 use crate::filesystem::vfs::{ 3 core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus, 4 }; 5 use crate::{ 6 include::bindings::bindings::{EINVAL, ENOTSUP}, 7 libs::spinlock::SpinLock, 8 time::TimeSpec, 9 }; 10 use alloc::{ 11 string::String, 12 sync::{Arc, Weak}, 13 vec::Vec, 14 }; 15 // use uuid::{uuid, Uuid}; 16 use super::{DevFS, DeviceINode}; 17 18 #[derive(Debug)] 19 pub struct NullInode { 20 /// uuid 暂时不知道有什么用(x 21 // uuid: Uuid, 22 /// 指向自身的弱引用 23 self_ref: Weak<LockedNullInode>, 24 /// 指向inode所在的文件系统对象的指针 25 fs: Weak<DevFS>, 26 /// INode 元数据 27 metadata: Metadata, 28 } 29 30 #[derive(Debug)] 31 pub struct LockedNullInode(SpinLock<NullInode>); 32 33 impl LockedNullInode { 34 pub fn new() -> Arc<Self> { 35 let inode = NullInode { 36 // uuid: Uuid::new_v5(), 37 self_ref: Weak::default(), 38 fs: Weak::default(), 39 metadata: Metadata { 40 dev_id: 1, 41 inode_id: generate_inode_id(), 42 size: 0, 43 blk_size: 0, 44 blocks: 0, 45 atime: TimeSpec::default(), 46 mtime: TimeSpec::default(), 47 ctime: TimeSpec::default(), 48 file_type: FileType::CharDevice, // 文件夹,block设备,char设备 49 mode: 0o666, 50 nlinks: 1, 51 uid: 0, 52 gid: 0, 53 raw_dev: make_rawdev(1, 3), // 这里用来作为device number 54 }, 55 }; 56 57 let result = Arc::new(LockedNullInode(SpinLock::new(inode))); 58 result.0.lock().self_ref = Arc::downgrade(&result); 59 60 return result; 61 } 62 } 63 64 impl DeviceINode for LockedNullInode { 65 fn set_fs(&self, fs: Weak<DevFS>) { 66 self.0.lock().fs = fs; 67 } 68 } 69 70 impl IndexNode for LockedNullInode { 71 fn as_any_ref(&self) -> &dyn core::any::Any { 72 self 73 } 74 75 fn open(&self, _data: &mut FilePrivateData) -> Result<(), i32> { 76 Err(-(ENOTSUP as i32)) 77 } 78 79 fn close(&self, _data: &mut FilePrivateData) -> Result<(), i32> { 80 Err(-(ENOTSUP as i32)) 81 } 82 83 fn metadata(&self) -> Result<Metadata, i32> { 84 return Ok(self.0.lock().metadata.clone()); 85 } 86 87 fn fs(&self) -> Arc<dyn FileSystem> { 88 return self.0.lock().fs.upgrade().unwrap(); 89 } 90 91 fn list(&self) -> Result<Vec<String>, i32> { 92 Err(-(ENOTSUP as i32)) 93 } 94 95 fn set_metadata(&self, metadata: &Metadata) -> Result<(), i32> { 96 let mut inode = self.0.lock(); 97 inode.metadata.atime = metadata.atime; 98 inode.metadata.mtime = metadata.mtime; 99 inode.metadata.ctime = metadata.ctime; 100 inode.metadata.mode = metadata.mode; 101 inode.metadata.uid = metadata.uid; 102 inode.metadata.gid = metadata.gid; 103 104 return Ok(()); 105 } 106 107 fn poll(&self) -> Result<PollStatus, i32> { 108 return Ok(PollStatus { 109 flags: PollStatus::READ_MASK | PollStatus::WRITE_MASK, 110 }); 111 } 112 113 /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写 114 fn read_at( 115 &self, 116 _offset: usize, 117 len: usize, 118 buf: &mut [u8], 119 _data: &mut FilePrivateData, 120 ) -> Result<usize, i32> { 121 if buf.len() < len { 122 return Err(-(EINVAL as i32)); 123 } 124 125 for i in 0..len { 126 buf[i] = 0; 127 } 128 129 return Ok(len); 130 } 131 132 /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写 133 fn write_at( 134 &self, 135 _offset: usize, 136 len: usize, 137 buf: &[u8], 138 _data: &mut FilePrivateData, 139 ) -> Result<usize, i32> { 140 if buf.len() < len { 141 return Err(-(EINVAL as i32)); 142 } 143 144 Ok(len) 145 } 146 } 147