mount.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. use core::{
  2. any::Any,
  3. fmt::Debug,
  4. sync::atomic::{compiler_fence, Ordering},
  5. };
  6. use alloc::{
  7. collections::BTreeMap,
  8. string::{String, ToString},
  9. sync::{Arc, Weak},
  10. };
  11. use system_error::SystemError;
  12. use crate::{
  13. driver::base::device::device_number::DeviceNumber,
  14. filesystem::vfs::ROOT_INODE,
  15. libs::{
  16. casting::DowncastArc,
  17. rwlock::RwLock,
  18. spinlock::{SpinLock, SpinLockGuard},
  19. },
  20. mm::{fault::PageFaultMessage, VmFaultReason},
  21. };
  22. use super::{
  23. file::{FileMode, PageCache},
  24. syscall::ModeType,
  25. utils::DName,
  26. FilePrivateData, FileSystem, FileType, IndexNode, InodeId, Magic, SuperBlock,
  27. };
  28. const MOUNTFS_BLOCK_SIZE: u64 = 512;
  29. const MOUNTFS_MAX_NAMELEN: u64 = 64;
  30. /// @brief 挂载文件系统
  31. /// 挂载文件系统的时候,套了MountFS这一层,以实现文件系统的递归挂载
  32. #[derive(Debug)]
  33. pub struct MountFS {
  34. // MountFS内部的文件系统
  35. inner_filesystem: Arc<dyn FileSystem>,
  36. /// 用来存储InodeID->挂载点的MountFS的B树
  37. mountpoints: SpinLock<BTreeMap<InodeId, Arc<MountFS>>>,
  38. /// 当前文件系统挂载到的那个挂载点的Inode
  39. self_mountpoint: Option<Arc<MountFSInode>>,
  40. /// 指向当前MountFS的弱引用
  41. self_ref: Weak<MountFS>,
  42. }
  43. /// @brief MountFS的Index Node 注意,这个IndexNode只是一个中间层。它的目的是将具体文件系统的Inode与挂载机制连接在一起。
  44. #[derive(Debug)]
  45. #[cast_to([sync] IndexNode)]
  46. pub struct MountFSInode {
  47. /// 当前挂载点对应到具体的文件系统的Inode
  48. inner_inode: Arc<dyn IndexNode>,
  49. /// 当前Inode对应的MountFS
  50. mount_fs: Arc<MountFS>,
  51. /// 指向自身的弱引用
  52. self_ref: Weak<MountFSInode>,
  53. }
  54. impl MountFS {
  55. pub fn new(
  56. inner_filesystem: Arc<dyn FileSystem>,
  57. self_mountpoint: Option<Arc<MountFSInode>>,
  58. ) -> Arc<Self> {
  59. return Arc::new_cyclic(|self_ref| MountFS {
  60. inner_filesystem,
  61. mountpoints: SpinLock::new(BTreeMap::new()),
  62. self_mountpoint,
  63. self_ref: self_ref.clone(),
  64. });
  65. }
  66. /// @brief 用Arc指针包裹MountFS对象。
  67. /// 本函数的主要功能为,初始化MountFS对象中的自引用Weak指针
  68. /// 本函数只应在构造器中被调用
  69. #[allow(dead_code)]
  70. #[deprecated]
  71. fn wrap(self) -> Arc<Self> {
  72. // 创建Arc指针
  73. let mount_fs: Arc<MountFS> = Arc::new(self);
  74. // 创建weak指针
  75. let weak: Weak<MountFS> = Arc::downgrade(&mount_fs);
  76. // 将Arc指针转为Raw指针并对其内部的self_ref字段赋值
  77. let ptr: *mut MountFS = mount_fs.as_ref() as *const Self as *mut Self;
  78. unsafe {
  79. (*ptr).self_ref = weak;
  80. // 返回初始化好的MountFS对象
  81. return mount_fs;
  82. }
  83. }
  84. /// @brief 获取挂载点的文件系统的root inode
  85. pub fn mountpoint_root_inode(&self) -> Arc<MountFSInode> {
  86. return Arc::new_cyclic(|self_ref| MountFSInode {
  87. inner_inode: self.inner_filesystem.root_inode(),
  88. mount_fs: self.self_ref.upgrade().unwrap(),
  89. self_ref: self_ref.clone(),
  90. });
  91. }
  92. pub fn inner_filesystem(&self) -> Arc<dyn FileSystem> {
  93. return self.inner_filesystem.clone();
  94. }
  95. pub fn self_ref(&self) -> Arc<Self> {
  96. self.self_ref.upgrade().unwrap()
  97. }
  98. /// 卸载文件系统
  99. /// # Errors
  100. /// 如果当前文件系统是根文件系统,那么将会返回`EINVAL`
  101. pub fn umount(&self) -> Result<Arc<MountFS>, SystemError> {
  102. self.self_mountpoint
  103. .as_ref()
  104. .ok_or(SystemError::EINVAL)?
  105. .do_umount()
  106. }
  107. }
  108. impl MountFSInode {
  109. /// @brief 用Arc指针包裹MountFSInode对象。
  110. /// 本函数的主要功能为,初始化MountFSInode对象中的自引用Weak指针
  111. /// 本函数只应在构造器中被调用
  112. #[allow(dead_code)]
  113. #[deprecated]
  114. fn wrap(self) -> Arc<Self> {
  115. // 创建Arc指针
  116. let inode: Arc<MountFSInode> = Arc::new(self);
  117. // 创建Weak指针
  118. let weak: Weak<MountFSInode> = Arc::downgrade(&inode);
  119. // 将Arc指针转为Raw指针并对其内部的self_ref字段赋值
  120. compiler_fence(Ordering::SeqCst);
  121. let ptr: *mut MountFSInode = inode.as_ref() as *const Self as *mut Self;
  122. compiler_fence(Ordering::SeqCst);
  123. unsafe {
  124. (*ptr).self_ref = weak;
  125. compiler_fence(Ordering::SeqCst);
  126. // 返回初始化好的MountFSInode对象
  127. return inode;
  128. }
  129. }
  130. /// @brief 判断当前inode是否为它所在的文件系统的root inode
  131. fn is_mountpoint_root(&self) -> Result<bool, SystemError> {
  132. return Ok(self.inner_inode.fs().root_inode().metadata()?.inode_id
  133. == self.inner_inode.metadata()?.inode_id);
  134. }
  135. /// @brief 在挂载树上进行inode替换。
  136. /// 如果当前inode是父MountFS内的一个挂载点,那么,本函数将会返回挂载到这个挂载点下的文件系统的root inode.
  137. /// 如果当前inode在父MountFS内,但不是挂载点,那么说明在这里不需要进行inode替换,因此直接返回当前inode。
  138. ///
  139. /// @return Arc<MountFSInode>
  140. fn overlaid_inode(&self) -> Arc<MountFSInode> {
  141. let inode_id = self.metadata().unwrap().inode_id;
  142. if let Some(sub_mountfs) = self.mount_fs.mountpoints.lock().get(&inode_id) {
  143. return sub_mountfs.mountpoint_root_inode();
  144. } else {
  145. return self.self_ref.upgrade().unwrap();
  146. }
  147. }
  148. fn do_find(&self, name: &str) -> Result<Arc<MountFSInode>, SystemError> {
  149. // 直接调用当前inode所在的文件系统的find方法进行查找
  150. // 由于向下查找可能会跨越文件系统的边界,因此需要尝试替换inode
  151. let inner_inode = self.inner_inode.find(name)?;
  152. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  153. inner_inode,
  154. mount_fs: self.mount_fs.clone(),
  155. self_ref: self_ref.clone(),
  156. })
  157. .overlaid_inode());
  158. }
  159. pub(super) fn do_parent(&self) -> Result<Arc<MountFSInode>, SystemError> {
  160. if self.is_mountpoint_root()? {
  161. // 当前inode是它所在的文件系统的root inode
  162. match &self.mount_fs.self_mountpoint {
  163. Some(inode) => {
  164. let inner_inode = inode.parent()?;
  165. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  166. inner_inode,
  167. mount_fs: self.mount_fs.clone(),
  168. self_ref: self_ref.clone(),
  169. }));
  170. }
  171. None => {
  172. return Ok(self.self_ref.upgrade().unwrap());
  173. }
  174. }
  175. } else {
  176. let inner_inode = self.inner_inode.parent()?;
  177. // 向上查找时,不会跨过文件系统的边界,因此直接调用当前inode所在的文件系统的find方法进行查找
  178. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  179. inner_inode,
  180. mount_fs: self.mount_fs.clone(),
  181. self_ref: self_ref.clone(),
  182. }));
  183. }
  184. }
  185. /// 移除挂载点下的文件系统
  186. fn do_umount(&self) -> Result<Arc<MountFS>, SystemError> {
  187. if self.metadata()?.file_type != FileType::Dir {
  188. return Err(SystemError::ENOTDIR);
  189. }
  190. return self
  191. .mount_fs
  192. .mountpoints
  193. .lock()
  194. .remove(&self.inner_inode.metadata()?.inode_id)
  195. .ok_or(SystemError::ENOENT);
  196. }
  197. fn do_absolute_path(&self, len: usize) -> Result<String, SystemError> {
  198. if self.metadata()?.inode_id == ROOT_INODE().metadata()?.inode_id {
  199. return Ok(String::with_capacity(len));
  200. }
  201. let name = self.dname()?;
  202. return Ok(self.do_parent()?.do_absolute_path(len + name.0.len() + 1)? + "/" + &name.0);
  203. }
  204. }
  205. impl IndexNode for MountFSInode {
  206. fn open(
  207. &self,
  208. data: SpinLockGuard<FilePrivateData>,
  209. mode: &FileMode,
  210. ) -> Result<(), SystemError> {
  211. return self.inner_inode.open(data, mode);
  212. }
  213. fn close(&self, data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  214. return self.inner_inode.close(data);
  215. }
  216. fn create_with_data(
  217. &self,
  218. name: &str,
  219. file_type: FileType,
  220. mode: ModeType,
  221. data: usize,
  222. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  223. let inner_inode = self
  224. .inner_inode
  225. .create_with_data(name, file_type, mode, data)?;
  226. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  227. inner_inode,
  228. mount_fs: self.mount_fs.clone(),
  229. self_ref: self_ref.clone(),
  230. }));
  231. }
  232. fn truncate(&self, len: usize) -> Result<(), SystemError> {
  233. return self.inner_inode.truncate(len);
  234. }
  235. fn read_at(
  236. &self,
  237. offset: usize,
  238. len: usize,
  239. buf: &mut [u8],
  240. data: SpinLockGuard<FilePrivateData>,
  241. ) -> Result<usize, SystemError> {
  242. return self.inner_inode.read_at(offset, len, buf, data);
  243. }
  244. fn write_at(
  245. &self,
  246. offset: usize,
  247. len: usize,
  248. buf: &[u8],
  249. data: SpinLockGuard<FilePrivateData>,
  250. ) -> Result<usize, SystemError> {
  251. return self.inner_inode.write_at(offset, len, buf, data);
  252. }
  253. #[inline]
  254. fn fs(&self) -> Arc<dyn FileSystem> {
  255. return self.mount_fs.clone();
  256. }
  257. #[inline]
  258. fn as_any_ref(&self) -> &dyn core::any::Any {
  259. return self.inner_inode.as_any_ref();
  260. }
  261. #[inline]
  262. fn metadata(&self) -> Result<super::Metadata, SystemError> {
  263. return self.inner_inode.metadata();
  264. }
  265. #[inline]
  266. fn set_metadata(&self, metadata: &super::Metadata) -> Result<(), SystemError> {
  267. return self.inner_inode.set_metadata(metadata);
  268. }
  269. #[inline]
  270. fn resize(&self, len: usize) -> Result<(), SystemError> {
  271. return self.inner_inode.resize(len);
  272. }
  273. #[inline]
  274. fn create(
  275. &self,
  276. name: &str,
  277. file_type: FileType,
  278. mode: ModeType,
  279. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  280. let inner_inode = self.inner_inode.create(name, file_type, mode)?;
  281. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  282. inner_inode,
  283. mount_fs: self.mount_fs.clone(),
  284. self_ref: self_ref.clone(),
  285. }));
  286. }
  287. fn link(&self, name: &str, other: &Arc<dyn IndexNode>) -> Result<(), SystemError> {
  288. return self.inner_inode.link(name, other);
  289. }
  290. /// @brief 在挂载文件系统中删除文件/文件夹
  291. #[inline]
  292. fn unlink(&self, name: &str) -> Result<(), SystemError> {
  293. let inode_id = self.inner_inode.find(name)?.metadata()?.inode_id;
  294. // 先检查这个inode是否为一个挂载点,如果当前inode是一个挂载点,那么就不能删除这个inode
  295. if self.mount_fs.mountpoints.lock().contains_key(&inode_id) {
  296. return Err(SystemError::EBUSY);
  297. }
  298. // 调用内层的inode的方法来删除这个inode
  299. return self.inner_inode.unlink(name);
  300. }
  301. #[inline]
  302. fn rmdir(&self, name: &str) -> Result<(), SystemError> {
  303. let inode_id = self.inner_inode.find(name)?.metadata()?.inode_id;
  304. // 先检查这个inode是否为一个挂载点,如果当前inode是一个挂载点,那么就不能删除这个inode
  305. if self.mount_fs.mountpoints.lock().contains_key(&inode_id) {
  306. return Err(SystemError::EBUSY);
  307. }
  308. // 调用内层的rmdir的方法来删除这个inode
  309. let r = self.inner_inode.rmdir(name);
  310. return r;
  311. }
  312. #[inline]
  313. fn move_to(
  314. &self,
  315. old_name: &str,
  316. target: &Arc<dyn IndexNode>,
  317. new_name: &str,
  318. ) -> Result<(), SystemError> {
  319. return self.inner_inode.move_to(old_name, target, new_name);
  320. }
  321. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  322. match name {
  323. // 查找的是当前目录
  324. "" | "." => self
  325. .self_ref
  326. .upgrade()
  327. .map(|inode| inode as Arc<dyn IndexNode>)
  328. .ok_or(SystemError::ENOENT),
  329. // 往父级查找
  330. ".." => self.parent(),
  331. // 在当前目录下查找
  332. // 直接调用当前inode所在的文件系统的find方法进行查找
  333. // 由于向下查找可能会跨越文件系统的边界,因此需要尝试替换inode
  334. _ => self.do_find(name).map(|inode| inode as Arc<dyn IndexNode>),
  335. }
  336. }
  337. #[inline]
  338. fn get_entry_name(&self, ino: InodeId) -> Result<alloc::string::String, SystemError> {
  339. return self.inner_inode.get_entry_name(ino);
  340. }
  341. #[inline]
  342. fn get_entry_name_and_metadata(
  343. &self,
  344. ino: InodeId,
  345. ) -> Result<(alloc::string::String, super::Metadata), SystemError> {
  346. return self.inner_inode.get_entry_name_and_metadata(ino);
  347. }
  348. #[inline]
  349. fn ioctl(
  350. &self,
  351. cmd: u32,
  352. data: usize,
  353. private_data: &FilePrivateData,
  354. ) -> Result<usize, SystemError> {
  355. return self.inner_inode.ioctl(cmd, data, private_data);
  356. }
  357. #[inline]
  358. fn kernel_ioctl(
  359. &self,
  360. arg: Arc<dyn crate::net::event_poll::KernelIoctlData>,
  361. data: &FilePrivateData,
  362. ) -> Result<usize, SystemError> {
  363. return self.inner_inode.kernel_ioctl(arg, data);
  364. }
  365. #[inline]
  366. fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> {
  367. return self.inner_inode.list();
  368. }
  369. fn mount(&self, fs: Arc<dyn FileSystem>) -> Result<Arc<MountFS>, SystemError> {
  370. let metadata = self.inner_inode.metadata()?;
  371. if metadata.file_type != FileType::Dir {
  372. return Err(SystemError::ENOTDIR);
  373. }
  374. if self.is_mountpoint_root()? {
  375. return Err(SystemError::EBUSY);
  376. }
  377. // 若已有挂载系统,保证MountFS只包一层
  378. let to_mount_fs = fs
  379. .clone()
  380. .downcast_arc::<MountFS>()
  381. .map(|it| it.inner_filesystem())
  382. .unwrap_or(fs);
  383. let new_mount_fs = MountFS::new(to_mount_fs, Some(self.self_ref.upgrade().unwrap()));
  384. self.mount_fs
  385. .mountpoints
  386. .lock()
  387. .insert(metadata.inode_id, new_mount_fs.clone());
  388. let mount_path = self.absolute_path();
  389. MOUNT_LIST().insert(mount_path?, new_mount_fs.clone());
  390. return Ok(new_mount_fs);
  391. }
  392. fn mount_from(&self, from: Arc<dyn IndexNode>) -> Result<Arc<MountFS>, SystemError> {
  393. let metadata = self.metadata()?;
  394. if from.metadata()?.file_type != FileType::Dir || metadata.file_type != FileType::Dir {
  395. return Err(SystemError::ENOTDIR);
  396. }
  397. if self.is_mountpoint_root()? {
  398. return Err(SystemError::EBUSY);
  399. }
  400. // debug!("from {:?}, to {:?}", from, self);
  401. let new_mount_fs = from.umount()?;
  402. self.mount_fs
  403. .mountpoints
  404. .lock()
  405. .insert(metadata.inode_id, new_mount_fs.clone());
  406. // MOUNT_LIST().remove(from.absolute_path()?);
  407. // MOUNT_LIST().insert(self.absolute_path()?, new_mount_fs.clone());
  408. return Ok(new_mount_fs);
  409. }
  410. fn umount(&self) -> Result<Arc<MountFS>, SystemError> {
  411. if !self.is_mountpoint_root()? {
  412. return Err(SystemError::EINVAL);
  413. }
  414. return self.mount_fs.umount();
  415. }
  416. fn absolute_path(&self) -> Result<String, SystemError> {
  417. self.do_absolute_path(0)
  418. }
  419. #[inline]
  420. fn mknod(
  421. &self,
  422. filename: &str,
  423. mode: ModeType,
  424. dev_t: DeviceNumber,
  425. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  426. let inner_inode = self.inner_inode.mknod(filename, mode, dev_t)?;
  427. return Ok(Arc::new_cyclic(|self_ref| MountFSInode {
  428. inner_inode,
  429. mount_fs: self.mount_fs.clone(),
  430. self_ref: self_ref.clone(),
  431. }));
  432. }
  433. #[inline]
  434. fn special_node(&self) -> Option<super::SpecialNodeData> {
  435. self.inner_inode.special_node()
  436. }
  437. #[inline]
  438. fn poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError> {
  439. self.inner_inode.poll(private_data)
  440. }
  441. /// 若不支持,则调用第二种情况来从父目录获取文件名
  442. /// # Performance
  443. /// 应尽可能引入DName,
  444. /// 在默认情况下,性能非常差!!!
  445. fn dname(&self) -> Result<DName, SystemError> {
  446. if self.is_mountpoint_root()? {
  447. if let Some(inode) = &self.mount_fs.self_mountpoint {
  448. return inode.inner_inode.dname();
  449. }
  450. }
  451. return self.inner_inode.dname();
  452. }
  453. fn parent(&self) -> Result<Arc<dyn IndexNode>, SystemError> {
  454. return self.do_parent().map(|inode| inode as Arc<dyn IndexNode>);
  455. }
  456. fn page_cache(&self) -> Option<Arc<PageCache>> {
  457. self.inner_inode.page_cache()
  458. }
  459. }
  460. impl FileSystem for MountFS {
  461. fn root_inode(&self) -> Arc<dyn IndexNode> {
  462. match &self.self_mountpoint {
  463. Some(inode) => return inode.mount_fs.root_inode(),
  464. // 当前文件系统是rootfs
  465. None => self.mountpoint_root_inode(),
  466. }
  467. }
  468. fn info(&self) -> super::FsInfo {
  469. return self.inner_filesystem.info();
  470. }
  471. /// @brief 本函数用于实现动态转换。
  472. /// 具体的文件系统在实现本函数时,最简单的方式就是:直接返回self
  473. fn as_any_ref(&self) -> &dyn Any {
  474. self
  475. }
  476. fn name(&self) -> &str {
  477. "mountfs"
  478. }
  479. fn super_block(&self) -> SuperBlock {
  480. SuperBlock::new(Magic::MOUNT_MAGIC, MOUNTFS_BLOCK_SIZE, MOUNTFS_MAX_NAMELEN)
  481. }
  482. unsafe fn fault(&self, pfm: &mut PageFaultMessage) -> VmFaultReason {
  483. self.inner_filesystem.fault(pfm)
  484. }
  485. unsafe fn map_pages(
  486. &self,
  487. pfm: &mut PageFaultMessage,
  488. start_pgoff: usize,
  489. end_pgoff: usize,
  490. ) -> VmFaultReason {
  491. self.inner_filesystem.map_pages(pfm, start_pgoff, end_pgoff)
  492. }
  493. }
  494. /// MountList
  495. /// ```rust
  496. /// use alloc::collection::BTreeSet;
  497. /// let map = BTreeSet::from([
  498. /// "/sys", "/dev", "/", "/bin", "/proc"
  499. /// ]);
  500. /// assert_eq!(format!("{:?}", map), "{\"/\", \"/bin\", \"/dev\", \"/proc\", \"/sys\"}");
  501. /// // {"/", "/bin", "/dev", "/proc", "/sys"}
  502. /// ```
  503. #[derive(PartialEq, Eq, Debug)]
  504. pub struct MountPath(String);
  505. impl From<&str> for MountPath {
  506. fn from(value: &str) -> Self {
  507. Self(String::from(value))
  508. }
  509. }
  510. impl From<String> for MountPath {
  511. fn from(value: String) -> Self {
  512. Self(value)
  513. }
  514. }
  515. impl AsRef<str> for MountPath {
  516. fn as_ref(&self) -> &str {
  517. &self.0
  518. }
  519. }
  520. impl PartialOrd for MountPath {
  521. fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
  522. Some(self.cmp(other))
  523. }
  524. }
  525. impl Ord for MountPath {
  526. fn cmp(&self, other: &Self) -> core::cmp::Ordering {
  527. let self_dep = self.0.chars().filter(|c| *c == '/').count();
  528. let othe_dep = other.0.chars().filter(|c| *c == '/').count();
  529. if self_dep == othe_dep {
  530. // 深度一样时反序来排
  531. // 根目录和根目录下的文件的绝对路径都只有一个'/'
  532. other.0.cmp(&self.0)
  533. } else {
  534. // 根据深度,深度
  535. othe_dep.cmp(&self_dep)
  536. }
  537. }
  538. }
  539. // 维护一个挂载点的记录,以支持特定于文件系统的索引
  540. pub struct MountList(RwLock<BTreeMap<MountPath, Arc<MountFS>>>);
  541. // pub struct MountList(Option<Arc<MountListInner>>);
  542. static mut __MOUNTS_LIST: Option<Arc<MountList>> = None;
  543. /// # init_mountlist - 初始化挂载列表
  544. ///
  545. /// 此函数用于初始化系统的挂载列表。挂载列表记录了系统中所有的文件系统挂载点及其属性。
  546. ///
  547. /// ## 参数
  548. ///
  549. /// - 无
  550. ///
  551. /// ## 返回值
  552. ///
  553. /// - 无
  554. #[inline(always)]
  555. pub fn init_mountlist() {
  556. unsafe {
  557. __MOUNTS_LIST = Some(Arc::new(MountList(RwLock::new(BTreeMap::new()))));
  558. }
  559. }
  560. /// # MOUNT_LIST - 获取全局挂载列表
  561. ///
  562. /// 该函数用于获取一个对全局挂载列表的引用。全局挂载列表是系统中所有挂载点的集合。
  563. ///
  564. /// ## 返回值
  565. /// - &'static Arc<MountList>: 返回全局挂载列表的引用。
  566. #[inline(always)]
  567. #[allow(non_snake_case)]
  568. pub fn MOUNT_LIST() -> &'static Arc<MountList> {
  569. unsafe {
  570. return __MOUNTS_LIST.as_ref().unwrap();
  571. }
  572. }
  573. impl MountList {
  574. /// # insert - 将文件系统挂载点插入到挂载表中
  575. ///
  576. /// 将一个新的文件系统挂载点插入到挂载表中。如果挂载点已经存在,则会更新对应的文件系统。
  577. ///
  578. /// 此函数是线程安全的,因为它使用了RwLock来保证并发访问。
  579. ///
  580. /// ## 参数
  581. ///
  582. /// - `path`: &str, 挂载点的路径。这个路径会被转换成`MountPath`类型。
  583. /// - `fs`: Arc<MountFS>, 共享的文件系统实例。
  584. ///
  585. /// ## 返回值
  586. ///
  587. /// - 无
  588. #[inline]
  589. pub fn insert<T: AsRef<str>>(&self, path: T, fs: Arc<MountFS>) {
  590. self.0.write().insert(MountPath::from(path.as_ref()), fs);
  591. }
  592. /// # get_mount_point - 获取挂载点的路径
  593. ///
  594. /// 这个函数用于查找给定路径的挂载点。它搜索一个内部映射,找到与路径匹配的挂载点。
  595. ///
  596. /// ## 参数
  597. ///
  598. /// - `path: T`: 这是一个可转换为字符串的引用,表示要查找其挂载点的路径。
  599. ///
  600. /// ## 返回值
  601. ///
  602. /// - `Option<(String, String, Arc<MountFS>)>`:
  603. /// - `Some((mount_point, rest_path, fs))`: 如果找到了匹配的挂载点,返回一个包含挂载点路径、剩余路径和挂载文件系统的元组。
  604. /// - `None`: 如果没有找到匹配的挂载点,返回 None。
  605. #[inline]
  606. #[allow(dead_code)]
  607. pub fn get_mount_point<T: AsRef<str>>(
  608. &self,
  609. path: T,
  610. ) -> Option<(String, String, Arc<MountFS>)> {
  611. self.0
  612. .upgradeable_read()
  613. .iter()
  614. .filter_map(|(key, fs)| {
  615. let strkey = key.as_ref();
  616. if let Some(rest) = path.as_ref().strip_prefix(strkey) {
  617. return Some((strkey.to_string(), rest.to_string(), fs.clone()));
  618. }
  619. None
  620. })
  621. .next()
  622. }
  623. /// # remove - 移除挂载点
  624. ///
  625. /// 从挂载点管理器中移除一个挂载点。
  626. ///
  627. /// 此函数用于从挂载点管理器中移除一个已经存在的挂载点。如果挂载点不存在,则不进行任何操作。
  628. ///
  629. /// ## 参数
  630. ///
  631. /// - `path: T`: `T` 实现了 `Into<MountPath>` trait,代表要移除的挂载点的路径。
  632. ///
  633. /// ## 返回值
  634. ///
  635. /// - `Option<Arc<MountFS>>`: 返回一个 `Arc<MountFS>` 类型的可选值,表示被移除的挂载点,如果挂载点不存在则返回 `None`。
  636. #[inline]
  637. pub fn remove<T: Into<MountPath>>(&self, path: T) -> Option<Arc<MountFS>> {
  638. self.0.write().remove(&path.into())
  639. }
  640. }
  641. impl Debug for MountList {
  642. fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
  643. f.debug_map().entries(MOUNT_LIST().0.read().iter()).finish()
  644. }
  645. }