zero_dev.rs 3.9 KB

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