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 /**
16  * @brief 初始化mount机制
17  *
18  * @return int 错误码
19  */
20 int mount_init();
21 
22 /**
23  * @brief 将new_dentry挂载
24  *
25  * @param old_dentry 挂载点的dentry
26  * @param new_dentry 待挂载的新的dentry(需使用vfs_alloc_dentry来分配)
27  * @return int 错误码
28  */
29 int do_mount(struct vfs_dir_entry_t *old_dentry, struct vfs_dir_entry_t *new_dentry);
30 
31 /**
32  * @brief 取消某个文件系统的挂载
33  *
34  * @param dentry 对应文件系统的根dentry
35  * @return int 错误码
36  */
37 int do_umount(struct vfs_dir_entry_t *dentry);
38 
39 // 判断dentry是否是一个挂载点
40 #define D_MOUNTED(x) ((x)->d_flags & VFS_DF_MOUNTED)
41 
42 /**
43  * @brief 将给定的dentry标记为“不可挂载”
44  *
45  * @param dentry 目标dentry
46  */
dont_mount(struct vfs_dir_entry_t * dentry)47 static inline void dont_mount(struct vfs_dir_entry_t *dentry)
48 {
49     // todo: 对dentry加锁
50     dentry->d_flags |= VFS_DF_CANNOT_MOUNT;
51 }
52 
detach_mounts(struct vfs_dir_entry_t * dentry)53 static inline void detach_mounts(struct vfs_dir_entry_t *dentry)
54 {
55     if (!D_MOUNTED(dentry))
56         return; // 如果当前文件夹不是一个挂载点,则直接返回
57 
58     // todo:如果当前文件夹是一个挂载点,则对同样挂载在当前文件夹下的dentry进行清理。以免造成内存泄露
59     // 可参考 linux5.17或以上的detach_mounts()函数
60 }
61 
62 /**
63  * @brief 根据mountpoint的父目录dentry查找第一个符合条件的mountpoint结构体
64  *
65  * @param dentry 父dentry
66  * @return struct mountpoint* 第一个符合条件的mountpoint结构体的指针
67  */
68 struct mountpoint *mount_find_mnt_list_by_parent(struct vfs_dir_entry_t *dentry);
69 
70 /**
71  * @brief 释放挂载点结构体
72  *
73  * @param mp mountpoint结构体
74  * @return int 错误码
75  */
76 int mount_release_mountpoint(struct mountpoint* mp);