mount.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #pragma once
  2. #include <common/glib.h>
  3. #include "VFS.h"
  4. /**
  5. * @brief 挂载点结构体(用来表示dentry被挂载其他文件系统之后,原先存在的数据)
  6. *
  7. */
  8. struct mountpoint
  9. {
  10. struct List mnt_list; // 挂载点串在一起的链表
  11. struct vfs_dir_entry_t *dentry; // 被挂载前,当前目录项的dentry
  12. struct vfs_dir_entry_t *parent_dentry; // 被挂载前,父目录项的dentry
  13. };
  14. /**
  15. * @brief 初始化mount机制
  16. *
  17. * @return int 错误码
  18. */
  19. int mount_init();
  20. /**
  21. * @brief 将new_dentry挂载
  22. *
  23. * @param old_dentry 挂载点的dentry
  24. * @param new_dentry 待挂载的新的dentry(需使用vfs_alloc_dentry来分配)
  25. * @return int 错误码
  26. */
  27. int do_mount(struct vfs_dir_entry_t *old_dentry, struct vfs_dir_entry_t *new_dentry);
  28. /**
  29. * @brief 取消某个文件系统的挂载
  30. *
  31. * @param dentry 对应文件系统的根dentry
  32. * @return int 错误码
  33. */
  34. int do_umount(struct vfs_dir_entry_t *dentry);
  35. // 判断dentry是否是一个挂载点
  36. #define D_MOUNTED(x) ((x)->d_flags & VFS_DF_MOUNTED)
  37. /**
  38. * @brief 将给定的dentry标记为“不可挂载”
  39. *
  40. * @param dentry 目标dentry
  41. */
  42. static inline void dont_mount(struct vfs_dir_entry_t *dentry)
  43. {
  44. // todo: 对dentry加锁
  45. dentry->d_flags |= VFS_DF_CANNOT_MOUNT;
  46. }
  47. static inline void detach_mounts(struct vfs_dir_entry_t *dentry)
  48. {
  49. if (!D_MOUNTED(dentry))
  50. return; // 如果当前文件夹不是一个挂载点,则直接返回
  51. // todo:如果当前文件夹是一个挂载点,则对同样挂载在当前文件夹下的dentry进行清理。以免造成内存泄露
  52. // 可参考 linux5.17或以上的detach_mounts()函数
  53. }
  54. /**
  55. * @brief 根据mountpoint的父目录dentry查找第一个符合条件的mountpoint结构体
  56. *
  57. * @param dentry 父dentry
  58. * @return struct mountpoint* 第一个符合条件的mountpoint结构体的指针
  59. */
  60. struct mountpoint *mount_find_mnt_list_by_parent(struct vfs_dir_entry_t *dentry);
  61. /**
  62. * @brief 释放挂载点结构体
  63. *
  64. * @param mp mountpoint结构体
  65. * @return int 错误码
  66. */
  67. int mount_release_mountpoint(struct mountpoint* mp);