mount.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "mount.h"
  2. #include "VFS.h"
  3. #include <common/glib.h>
  4. #include <common/string.h>
  5. static struct List mnt_list_head; // 挂载点链表头
  6. /**
  7. * @brief 初始化mount机制
  8. *
  9. * @return int 错误码
  10. */
  11. int mount_init()
  12. {
  13. list_init(&mnt_list_head);
  14. return 0;
  15. }
  16. /**
  17. * @brief 将new_dentry挂载
  18. *
  19. * @param old_dentry 挂载点的dentry
  20. * @param new_dentry 待挂载的新的dentry(需使用vfs_alloc_dentry来分配)
  21. * @return int 错误码
  22. */
  23. int do_mount(struct vfs_dir_entry_t *old_dentry, struct vfs_dir_entry_t *new_dentry)
  24. {
  25. struct mountpoint *mp = (struct mountpoint *)kzalloc(sizeof(struct mountpoint), 0);
  26. list_init(&mp->mnt_list);
  27. mp->dentry = old_dentry;
  28. mp->parent_dentry = old_dentry->parent;
  29. // 拷贝名称
  30. strncpy(new_dentry->name, old_dentry->name, old_dentry->name_length);
  31. kdebug("new_dentry->name=%s, old_dentry->name=%s, old_dentry->name_length=%d", new_dentry->name, old_dentry->name, old_dentry->name_length);
  32. new_dentry->d_flags |= VFS_DF_MOUNTED; // 标记新的dentry是一个挂载点
  33. list_init(&new_dentry->child_node_list);
  34. list_init(&new_dentry->subdirs_list);
  35. new_dentry->parent = old_dentry->parent;
  36. // 将新的dentry的list结点替换掉父dentry的列表中的old_dentry的list结点
  37. list_replace(&old_dentry->child_node_list, &new_dentry->child_node_list);
  38. // 后挂载的dentry在链表的末尾(umount恢复的时候需要依赖这个性质)
  39. list_append(&mnt_list_head, &mp->mnt_list);
  40. return 0;
  41. }
  42. /**
  43. * @brief 取消某个文件系统的挂载
  44. *
  45. * @param dentry 对应文件系统的根dentry
  46. * @return int 错误码
  47. */
  48. int do_umount(struct vfs_dir_entry_t *dentry)
  49. {
  50. // todo: 实现umount(主要是结点的恢复问题)
  51. return 0;
  52. }
  53. /**
  54. * @brief 根据mountpoint的父目录dentry查找第一个符合条件的mountpoint结构体
  55. *
  56. * @param dentry 父dentry
  57. * @return struct mountpoint* 第一个符合条件的mountpoint结构体的指针
  58. */
  59. struct mountpoint *mount_find_mnt_list_by_parent(struct vfs_dir_entry_t *dentry)
  60. {
  61. struct List *list = &mnt_list_head;
  62. struct mountpoint *ret = NULL;
  63. if (list_empty(list))
  64. return NULL;
  65. while (list_next(list) != &mnt_list_head)
  66. {
  67. list = list_next(list);
  68. struct mountpoint *tmp = container_of(list, struct mountpoint, mnt_list);
  69. if (dentry == tmp->parent_dentry)
  70. return tmp;
  71. }
  72. return NULL;
  73. }
  74. /**
  75. * @brief 将挂载点结构体从链表中删除并释放
  76. *
  77. * @param mp mountpoint结构体
  78. * @return int 错误码
  79. */
  80. int mount_release_mountpoint(struct mountpoint *mp)
  81. {
  82. list_del(&mp->mnt_list);
  83. return kfree(mp);
  84. }