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)47static 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)53static 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);