ahci_inode.rs 4.3 KB

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