mod.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. use core::{cmp::min, fmt::Debug, intrinsics::unlikely};
  2. use alloc::{
  3. string::String,
  4. sync::{Arc, Weak},
  5. vec::Vec,
  6. };
  7. use hashbrown::HashMap;
  8. use log::warn;
  9. use system_error::SystemError;
  10. use crate::{
  11. driver::base::device::device_number::DeviceNumber,
  12. libs::{
  13. casting::DowncastArc,
  14. rwlock::RwLock,
  15. spinlock::{SpinLock, SpinLockGuard},
  16. },
  17. time::PosixTimeSpec,
  18. };
  19. use self::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
  20. use super::vfs::{
  21. file::FileMode, syscall::ModeType, vcore::generate_inode_id, FilePrivateData, FileSystem,
  22. FileType, FsInfo, IndexNode, InodeId, Magic, Metadata, SuperBlock,
  23. };
  24. pub mod callback;
  25. #[derive(Debug)]
  26. pub struct KernFS {
  27. root_inode: Arc<KernFSInode>,
  28. }
  29. impl FileSystem for KernFS {
  30. fn as_any_ref(&self) -> &dyn core::any::Any {
  31. self
  32. }
  33. fn info(&self) -> FsInfo {
  34. return FsInfo {
  35. blk_dev_id: 0,
  36. max_name_len: KernFS::MAX_NAMELEN,
  37. };
  38. }
  39. fn root_inode(&self) -> Arc<dyn IndexNode> {
  40. return self.root_inode.clone();
  41. }
  42. fn name(&self) -> &str {
  43. "kernfs"
  44. }
  45. fn super_block(&self) -> SuperBlock {
  46. SuperBlock::new(
  47. Magic::KER_MAGIC,
  48. KernFS::KERNFS_BLOCK_SIZE,
  49. KernFS::MAX_NAMELEN as u64,
  50. )
  51. }
  52. }
  53. impl KernFS {
  54. pub const MAX_NAMELEN: usize = 4096;
  55. pub const KERNFS_BLOCK_SIZE: u64 = 512;
  56. #[allow(dead_code)]
  57. pub fn new() -> Arc<Self> {
  58. let root_inode = Self::create_root_inode();
  59. let fs = Arc::new(Self {
  60. root_inode: root_inode.clone(),
  61. });
  62. {
  63. let ptr = root_inode.as_ref() as *const KernFSInode as *mut KernFSInode;
  64. unsafe {
  65. (*ptr).self_ref = Arc::downgrade(&root_inode);
  66. }
  67. }
  68. root_inode.inner.write().parent = Arc::downgrade(&root_inode);
  69. *root_inode.fs.write() = Arc::downgrade(&fs);
  70. return fs;
  71. }
  72. fn create_root_inode() -> Arc<KernFSInode> {
  73. let metadata = Metadata {
  74. size: 0,
  75. mode: ModeType::from_bits_truncate(0o755),
  76. uid: 0,
  77. gid: 0,
  78. blk_size: 0,
  79. blocks: 0,
  80. atime: PosixTimeSpec::new(0, 0),
  81. mtime: PosixTimeSpec::new(0, 0),
  82. ctime: PosixTimeSpec::new(0, 0),
  83. btime: PosixTimeSpec::new(0, 0),
  84. dev_id: 0,
  85. inode_id: generate_inode_id(),
  86. file_type: FileType::Dir,
  87. nlinks: 1,
  88. raw_dev: DeviceNumber::default(),
  89. };
  90. let root_inode = Arc::new(KernFSInode {
  91. name: String::from(""),
  92. inner: RwLock::new(InnerKernFSInode {
  93. parent: Weak::new(),
  94. metadata,
  95. symlink_target: None,
  96. symlink_target_absolute_path: None,
  97. }),
  98. self_ref: Weak::new(),
  99. fs: RwLock::new(Weak::new()),
  100. private_data: SpinLock::new(None),
  101. callback: None,
  102. children: SpinLock::new(HashMap::new()),
  103. inode_type: KernInodeType::Dir,
  104. });
  105. return root_inode;
  106. }
  107. }
  108. #[derive(Debug)]
  109. pub struct KernFSInode {
  110. inner: RwLock<InnerKernFSInode>,
  111. /// 指向当前Inode所属的文件系统的弱引用
  112. fs: RwLock<Weak<KernFS>>,
  113. /// 指向自身的弱引用
  114. self_ref: Weak<KernFSInode>,
  115. /// 私有数据
  116. private_data: SpinLock<Option<KernInodePrivateData>>,
  117. /// 回调函数
  118. callback: Option<&'static dyn KernFSCallback>,
  119. /// 子Inode
  120. children: SpinLock<HashMap<String, Arc<KernFSInode>>>,
  121. /// Inode类型
  122. inode_type: KernInodeType,
  123. /// Inode名称
  124. name: String,
  125. }
  126. #[derive(Debug)]
  127. pub struct InnerKernFSInode {
  128. parent: Weak<KernFSInode>,
  129. /// 当前inode的元数据
  130. metadata: Metadata,
  131. /// 符号链接指向的inode(仅当inode_type为SymLink时有效)
  132. symlink_target: Option<Weak<KernFSInode>>,
  133. symlink_target_absolute_path: Option<String>,
  134. }
  135. impl IndexNode for KernFSInode {
  136. fn as_any_ref(&self) -> &dyn core::any::Any {
  137. self
  138. }
  139. fn open(
  140. &self,
  141. _data: SpinLockGuard<FilePrivateData>,
  142. _mode: &FileMode,
  143. ) -> Result<(), SystemError> {
  144. if let Some(callback) = self.callback {
  145. let callback_data =
  146. KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock());
  147. return callback.open(callback_data);
  148. }
  149. return Ok(());
  150. }
  151. fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  152. return Ok(());
  153. }
  154. fn metadata(&self) -> Result<Metadata, SystemError> {
  155. return Ok(self.inner.read().metadata.clone());
  156. }
  157. fn set_metadata(&self, _metadata: &Metadata) -> Result<(), SystemError> {
  158. // 若文件系统没有实现此方法,则返回“不支持”
  159. return Err(SystemError::ENOSYS);
  160. }
  161. fn resize(&self, _len: usize) -> Result<(), SystemError> {
  162. return Ok(());
  163. }
  164. fn create_with_data(
  165. &self,
  166. _name: &str,
  167. _file_type: FileType,
  168. _mode: ModeType,
  169. _data: usize,
  170. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  171. // 应当通过kernfs的其它方法来创建文件,而不能从用户态直接调用此方法。
  172. return Err(SystemError::ENOSYS);
  173. }
  174. fn link(&self, _name: &str, _other: &Arc<dyn IndexNode>) -> Result<(), SystemError> {
  175. // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。
  176. return Err(SystemError::ENOSYS);
  177. }
  178. fn unlink(&self, _name: &str) -> Result<(), SystemError> {
  179. // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。
  180. return Err(SystemError::ENOSYS);
  181. }
  182. fn rmdir(&self, _name: &str) -> Result<(), SystemError> {
  183. // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。
  184. return Err(SystemError::ENOSYS);
  185. }
  186. fn move_to(
  187. &self,
  188. _old_name: &str,
  189. _target: &Arc<dyn IndexNode>,
  190. _new_name: &str,
  191. ) -> Result<(), SystemError> {
  192. // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。
  193. return Err(SystemError::ENOSYS);
  194. }
  195. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  196. if unlikely(name.len() > KernFS::MAX_NAMELEN) {
  197. return Err(SystemError::ENAMETOOLONG);
  198. }
  199. if unlikely(self.inode_type != KernInodeType::Dir) {
  200. return Err(SystemError::ENOTDIR);
  201. }
  202. match name {
  203. "" | "." => {
  204. return Ok(self.self_ref.upgrade().ok_or(SystemError::ENOENT)?);
  205. }
  206. ".." => {
  207. return Ok(self
  208. .inner
  209. .read()
  210. .parent
  211. .upgrade()
  212. .ok_or(SystemError::ENOENT)?);
  213. }
  214. name => {
  215. // 在子目录项中查找
  216. return Ok(self
  217. .children
  218. .lock()
  219. .get(name)
  220. .ok_or(SystemError::ENOENT)?
  221. .clone());
  222. }
  223. }
  224. }
  225. fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> {
  226. if self.inode_type != KernInodeType::Dir {
  227. return Err(SystemError::ENOTDIR);
  228. }
  229. let children = self.children.lock();
  230. let r = children
  231. .iter()
  232. .find(|(_, v)| v.metadata().unwrap().inode_id == ino)
  233. .map(|(k, _)| k.clone());
  234. return r.ok_or(SystemError::ENOENT);
  235. }
  236. fn get_entry_name_and_metadata(&self, ino: InodeId) -> Result<(String, Metadata), SystemError> {
  237. // 如果有条件,请在文件系统中使用高效的方式实现本接口,而不是依赖这个低效率的默认实现。
  238. let name = self.get_entry_name(ino)?;
  239. let entry = self.find(&name)?;
  240. return Ok((name, entry.metadata()?));
  241. }
  242. fn ioctl(
  243. &self,
  244. _cmd: u32,
  245. _data: usize,
  246. _private_data: &FilePrivateData,
  247. ) -> Result<usize, SystemError> {
  248. // 若文件系统没有实现此方法,则返回“不支持”
  249. return Err(SystemError::ENOSYS);
  250. }
  251. fn truncate(&self, _len: usize) -> Result<(), SystemError> {
  252. // 应当通过kernfs的其它方法来操作文件,而不能从用户态直接调用此方法。
  253. return Err(SystemError::ENOSYS);
  254. }
  255. fn sync(&self) -> Result<(), SystemError> {
  256. return Ok(());
  257. }
  258. fn fs(&self) -> Arc<dyn FileSystem> {
  259. return self.fs.read().upgrade().unwrap();
  260. }
  261. fn list(&self) -> Result<Vec<String>, SystemError> {
  262. let info = self.metadata()?;
  263. if info.file_type != FileType::Dir {
  264. return Err(SystemError::ENOTDIR);
  265. }
  266. let mut keys: Vec<String> = Vec::new();
  267. keys.push(String::from("."));
  268. keys.push(String::from(".."));
  269. self.children
  270. .lock()
  271. .keys()
  272. .for_each(|x| keys.push(x.clone()));
  273. return Ok(keys);
  274. }
  275. fn read_at(
  276. &self,
  277. offset: usize,
  278. len: usize,
  279. buf: &mut [u8],
  280. _data: SpinLockGuard<FilePrivateData>,
  281. ) -> Result<usize, SystemError> {
  282. if self.inode_type == KernInodeType::SymLink {
  283. let inner = self.inner.read();
  284. if offset >= inner.symlink_target_absolute_path.as_ref().unwrap().len() {
  285. return Ok(0);
  286. }
  287. let len = min(len, buf.len());
  288. let len = min(
  289. len,
  290. inner.symlink_target_absolute_path.as_ref().unwrap().len() - offset,
  291. );
  292. buf[0..len].copy_from_slice(
  293. &inner
  294. .symlink_target_absolute_path
  295. .as_ref()
  296. .unwrap()
  297. .as_bytes()[offset..offset + len],
  298. );
  299. return Ok(len);
  300. }
  301. if self.inode_type != KernInodeType::File {
  302. return Err(SystemError::EISDIR);
  303. }
  304. if self.callback.is_none() {
  305. warn!("kernfs: callback is none");
  306. return Err(SystemError::ENOSYS);
  307. }
  308. let callback_data =
  309. KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock());
  310. return self
  311. .callback
  312. .as_ref()
  313. .unwrap()
  314. .read(callback_data, &mut buf[..len], offset);
  315. }
  316. fn write_at(
  317. &self,
  318. offset: usize,
  319. len: usize,
  320. buf: &[u8],
  321. _data: SpinLockGuard<FilePrivateData>,
  322. ) -> Result<usize, SystemError> {
  323. if self.inode_type != KernInodeType::File {
  324. return Err(SystemError::EISDIR);
  325. }
  326. if self.callback.is_none() {
  327. return Err(SystemError::ENOSYS);
  328. }
  329. let callback_data =
  330. KernCallbackData::new(self.self_ref.upgrade().unwrap(), self.private_data.lock());
  331. return self
  332. .callback
  333. .as_ref()
  334. .unwrap()
  335. .write(callback_data, &buf[..len], offset);
  336. }
  337. }
  338. impl KernFSInode {
  339. pub fn new(
  340. parent: Option<Arc<KernFSInode>>,
  341. name: String,
  342. mut metadata: Metadata,
  343. inode_type: KernInodeType,
  344. private_data: Option<KernInodePrivateData>,
  345. callback: Option<&'static dyn KernFSCallback>,
  346. ) -> Arc<KernFSInode> {
  347. metadata.file_type = inode_type.into();
  348. let parent: Weak<KernFSInode> = parent.map(|x| Arc::downgrade(&x)).unwrap_or_default();
  349. let inode = Arc::new(KernFSInode {
  350. name,
  351. inner: RwLock::new(InnerKernFSInode {
  352. parent: parent.clone(),
  353. metadata,
  354. symlink_target: None,
  355. symlink_target_absolute_path: None,
  356. }),
  357. self_ref: Weak::new(),
  358. fs: RwLock::new(Weak::new()),
  359. private_data: SpinLock::new(private_data),
  360. callback,
  361. children: SpinLock::new(HashMap::new()),
  362. inode_type,
  363. });
  364. {
  365. let ptr = inode.as_ref() as *const KernFSInode as *mut KernFSInode;
  366. unsafe {
  367. (*ptr).self_ref = Arc::downgrade(&inode);
  368. }
  369. }
  370. if parent.strong_count() > 0 {
  371. let kernfs = parent
  372. .upgrade()
  373. .unwrap()
  374. .fs()
  375. .downcast_arc::<KernFS>()
  376. .expect("KernFSInode::new: parent is not a KernFS instance");
  377. *inode.fs.write() = Arc::downgrade(&kernfs);
  378. }
  379. return inode;
  380. }
  381. /// 在当前inode下增加子目录
  382. ///
  383. /// ## 参数
  384. ///
  385. /// - `name`:子目录名称
  386. /// - `mode`:子目录权限
  387. /// - `private_data`:子目录私有数据
  388. /// - `callback`:子目录回调函数
  389. ///
  390. /// ## 返回值
  391. ///
  392. /// - 成功:子目录inode
  393. /// - 失败:错误码
  394. #[allow(dead_code)]
  395. #[inline]
  396. pub fn add_dir(
  397. &self,
  398. name: String,
  399. mode: ModeType,
  400. private_data: Option<KernInodePrivateData>,
  401. callback: Option<&'static dyn KernFSCallback>,
  402. ) -> Result<Arc<KernFSInode>, SystemError> {
  403. if unlikely(self.inode_type != KernInodeType::Dir) {
  404. return Err(SystemError::ENOTDIR);
  405. }
  406. return self.inner_create(name, KernInodeType::Dir, mode, 0, private_data, callback);
  407. }
  408. /// 在当前inode下增加文件
  409. ///
  410. /// ## 参数
  411. ///
  412. /// - `name`:文件名称
  413. /// - `mode`:文件权限
  414. /// - `size`:文件大小(如果不指定,则默认为4096)
  415. /// - `private_data`:文件私有数据
  416. /// - `callback`:文件回调函数
  417. ///
  418. ///
  419. /// ## 返回值
  420. ///
  421. /// - 成功:文件inode
  422. /// - 失败:错误码
  423. #[allow(dead_code)]
  424. #[inline]
  425. pub fn add_file(
  426. &self,
  427. name: String,
  428. mode: ModeType,
  429. size: Option<usize>,
  430. private_data: Option<KernInodePrivateData>,
  431. callback: Option<&'static dyn KernFSCallback>,
  432. ) -> Result<Arc<KernFSInode>, SystemError> {
  433. if unlikely(self.inode_type != KernInodeType::Dir) {
  434. return Err(SystemError::ENOTDIR);
  435. }
  436. let size = size.unwrap_or(4096);
  437. return self.inner_create(
  438. name,
  439. KernInodeType::File,
  440. mode,
  441. size,
  442. private_data,
  443. callback,
  444. );
  445. }
  446. fn inner_create(
  447. &self,
  448. name: String,
  449. file_type: KernInodeType,
  450. mode: ModeType,
  451. mut size: usize,
  452. private_data: Option<KernInodePrivateData>,
  453. callback: Option<&'static dyn KernFSCallback>,
  454. ) -> Result<Arc<KernFSInode>, SystemError> {
  455. match file_type {
  456. KernInodeType::Dir | KernInodeType::SymLink => {
  457. size = 0;
  458. }
  459. _ => {}
  460. }
  461. let metadata = Metadata {
  462. size: size as i64,
  463. mode,
  464. uid: 0,
  465. gid: 0,
  466. blk_size: 0,
  467. blocks: 0,
  468. atime: PosixTimeSpec::new(0, 0),
  469. mtime: PosixTimeSpec::new(0, 0),
  470. ctime: PosixTimeSpec::new(0, 0),
  471. btime: PosixTimeSpec::new(0, 0),
  472. dev_id: 0,
  473. inode_id: generate_inode_id(),
  474. file_type: file_type.into(),
  475. nlinks: 1,
  476. raw_dev: DeviceNumber::default(),
  477. };
  478. let new_inode: Arc<KernFSInode> = Self::new(
  479. Some(self.self_ref.upgrade().unwrap()),
  480. name.clone(),
  481. metadata,
  482. file_type,
  483. private_data,
  484. callback,
  485. );
  486. self.children.lock().insert(name, new_inode.clone());
  487. return Ok(new_inode);
  488. }
  489. /// 在当前inode下删除子目录或者文件
  490. ///
  491. /// 如果要删除的是子目录,且子目录不为空,则返回ENOTEMPTY
  492. ///
  493. /// ## 参数
  494. ///
  495. /// - `name`:子目录或者文件名称
  496. ///
  497. /// ## 返回值
  498. ///
  499. /// - 成功:()
  500. /// - 失败:错误码
  501. #[allow(dead_code)]
  502. pub fn remove(&self, name: &str) -> Result<(), SystemError> {
  503. if unlikely(self.inode_type != KernInodeType::Dir) {
  504. return Err(SystemError::ENOTDIR);
  505. }
  506. let mut children = self.children.lock();
  507. let inode = children.get(name).ok_or(SystemError::ENOENT)?;
  508. if inode.children.lock().is_empty() {
  509. children.remove(name);
  510. return Ok(());
  511. } else {
  512. return Err(SystemError::ENOTEMPTY);
  513. }
  514. }
  515. /// add_link - create a symlink in kernfs
  516. ///
  517. /// ## 参数
  518. ///
  519. /// - `parent`: directory to create the symlink in
  520. /// - `name`: name of the symlink
  521. /// - `target`: target node for the symlink to point to
  522. ///
  523. /// Returns the created node on success
  524. ///
  525. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/fs/kernfs/symlink.c#25
  526. pub fn add_link(
  527. &self,
  528. name: String,
  529. target: &Arc<KernFSInode>,
  530. target_absolute_path: String,
  531. ) -> Result<Arc<KernFSInode>, SystemError> {
  532. // debug!("kernfs add link: name:{name}, target path={target_absolute_path}");
  533. let inode = self.inner_create(
  534. name,
  535. KernInodeType::SymLink,
  536. ModeType::S_IFLNK | ModeType::from_bits_truncate(0o777),
  537. 0,
  538. None,
  539. None,
  540. )?;
  541. inode.inner.write().symlink_target = Some(Arc::downgrade(target));
  542. inode.inner.write().symlink_target_absolute_path = Some(target_absolute_path);
  543. return Ok(inode);
  544. }
  545. pub fn name(&self) -> &str {
  546. return &self.name;
  547. }
  548. pub fn parent(&self) -> Option<Arc<KernFSInode>> {
  549. return self.inner.read().parent.upgrade();
  550. }
  551. pub fn private_data_mut(&self) -> SpinLockGuard<Option<KernInodePrivateData>> {
  552. return self.private_data.lock();
  553. }
  554. #[allow(dead_code)]
  555. pub fn symlink_target(&self) -> Option<Arc<KernFSInode>> {
  556. return self.inner.read().symlink_target.as_ref()?.upgrade();
  557. }
  558. /// remove a kernfs_node recursively
  559. pub fn remove_recursive(&self) {
  560. let mut children = self.children.lock().drain().collect::<Vec<_>>();
  561. while let Some((_, child)) = children.pop() {
  562. children.append(&mut child.children.lock().drain().collect::<Vec<_>>());
  563. }
  564. }
  565. /// 删除当前的inode(包括其自身、子目录和子文件)
  566. #[allow(dead_code)]
  567. pub fn remove_inode_include_self(&self) {
  568. let parent = self.parent();
  569. if let Some(parent) = parent {
  570. parent.children.lock().remove(self.name());
  571. }
  572. self.remove_recursive();
  573. }
  574. }
  575. #[derive(Debug, Clone, Copy, PartialEq, Eq)]
  576. pub enum KernInodeType {
  577. Dir,
  578. File,
  579. SymLink,
  580. }
  581. impl From<KernInodeType> for FileType {
  582. fn from(val: KernInodeType) -> Self {
  583. match val {
  584. KernInodeType::Dir => FileType::Dir,
  585. KernInodeType::File => FileType::File,
  586. KernInodeType::SymLink => FileType::SymLink,
  587. }
  588. }
  589. }