null_dev.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. use crate::filesystem::vfs::file::FileMode;
  2. use crate::filesystem::vfs::make_rawdev;
  3. use crate::filesystem::vfs::{
  4. core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
  5. };
  6. use crate::{
  7. syscall::SystemError,
  8. libs::spinlock::SpinLock,
  9. time::TimeSpec,
  10. };
  11. use alloc::{
  12. string::String,
  13. sync::{Arc, Weak},
  14. vec::Vec,
  15. };
  16. // use uuid::{uuid, Uuid};
  17. use super::{DevFS, DeviceINode};
  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. #[derive(Debug)]
  30. pub struct LockedNullInode(SpinLock<NullInode>);
  31. impl LockedNullInode {
  32. pub fn new() -> Arc<Self> {
  33. let inode = NullInode {
  34. // uuid: Uuid::new_v5(),
  35. self_ref: Weak::default(),
  36. fs: Weak::default(),
  37. metadata: Metadata {
  38. dev_id: 1,
  39. inode_id: generate_inode_id(),
  40. size: 0,
  41. blk_size: 0,
  42. blocks: 0,
  43. atime: TimeSpec::default(),
  44. mtime: TimeSpec::default(),
  45. ctime: TimeSpec::default(),
  46. file_type: FileType::CharDevice, // 文件夹,block设备,char设备
  47. mode: 0o666,
  48. nlinks: 1,
  49. uid: 0,
  50. gid: 0,
  51. raw_dev: make_rawdev(1, 3), // 这里用来作为device number
  52. },
  53. };
  54. let result = Arc::new(LockedNullInode(SpinLock::new(inode)));
  55. result.0.lock().self_ref = Arc::downgrade(&result);
  56. return result;
  57. }
  58. }
  59. impl DeviceINode for LockedNullInode {
  60. fn set_fs(&self, fs: Weak<DevFS>) {
  61. self.0.lock().fs = fs;
  62. }
  63. }
  64. impl IndexNode for LockedNullInode {
  65. fn as_any_ref(&self) -> &dyn core::any::Any {
  66. self
  67. }
  68. fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
  69. Err(SystemError::ENOTSUP)
  70. }
  71. fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
  72. Err(SystemError::ENOTSUP)
  73. }
  74. fn metadata(&self) -> Result<Metadata, SystemError> {
  75. return Ok(self.0.lock().metadata.clone());
  76. }
  77. fn fs(&self) -> Arc<dyn FileSystem> {
  78. return self.0.lock().fs.upgrade().unwrap();
  79. }
  80. fn list(&self) -> Result<Vec<String>, SystemError> {
  81. Err(SystemError::ENOTSUP)
  82. }
  83. fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
  84. let mut inode = self.0.lock();
  85. inode.metadata.atime = metadata.atime;
  86. inode.metadata.mtime = metadata.mtime;
  87. inode.metadata.ctime = metadata.ctime;
  88. inode.metadata.mode = metadata.mode;
  89. inode.metadata.uid = metadata.uid;
  90. inode.metadata.gid = metadata.gid;
  91. return Ok(());
  92. }
  93. fn poll(&self) -> Result<PollStatus, SystemError> {
  94. return Ok(PollStatus {
  95. flags: PollStatus::READ_MASK | PollStatus::WRITE_MASK,
  96. });
  97. }
  98. /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
  99. fn read_at(
  100. &self,
  101. _offset: usize,
  102. len: usize,
  103. buf: &mut [u8],
  104. _data: &mut FilePrivateData,
  105. ) -> Result<usize, SystemError> {
  106. if buf.len() < len {
  107. return Err(SystemError::EINVAL);
  108. }
  109. for i in 0..len {
  110. buf[i] = 0;
  111. }
  112. return Ok(len);
  113. }
  114. /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写
  115. fn write_at(
  116. &self,
  117. _offset: usize,
  118. len: usize,
  119. buf: &[u8],
  120. _data: &mut FilePrivateData,
  121. ) -> Result<usize, SystemError> {
  122. if buf.len() < len {
  123. return Err(SystemError::EINVAL);
  124. }
  125. Ok(len)
  126. }
  127. }