zero_dev.rs 4.5 KB

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