mount.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. kdebug("&new_dentry->name=%#018lx, &old_dentry->name=%#018lx", &new_dentry->name, &old_dentry->name);
  30. // 拷贝名称
  31. strncpy(new_dentry->name, old_dentry->name, old_dentry->name_length);
  32. list_init(&new_dentry->child_node_list);
  33. list_init(&new_dentry->subdirs_list);
  34. new_dentry->parent = old_dentry->parent;
  35. // 将新的dentry的list结点替换掉父dentry的列表中的old_dentry的list结点
  36. list_replace(&old_dentry->child_node_list, &new_dentry->child_node_list);
  37. list_append(&mnt_list_head, &mp->mnt_list);
  38. return 0;
  39. }