1 /** 2 * @file VFS.h 3 * @author fslongjin (longjin@RinGoTek.cn) 4 * @brief 虚拟文件系统 5 * @version 0.1 6 * @date 2022-04-20 7 * 8 * @copyright Copyright (c) 2022 9 * 10 */ 11 12 #pragma once 13 14 #include <common/blk_types.h> 15 #include <common/fcntl.h> 16 #include <common/glib.h> 17 #include <common/lockref.h> 18 #include <common/user_namespace.h> 19 #include <DragonOS/stdint.h> 20 #include <mm/slab.h> 21 22 #define VFS_DPT_MBR 0 // MBR分区表 23 #define VFS_DPT_GPT 1 // GPT分区表 24 25 #define VFS_MAX_PATHLEN 1024 26 27 /** 28 * @brief inode的属性 29 * 30 */ 31 #define VFS_IF_FILE (1UL << 0) 32 #define VFS_IF_DIR (1UL << 1) // 文件夹 33 #define VFS_IF_DEVICE (1UL << 2) 34 #define VFS_IF_DEAD (1UL << 3) /* removed, but still open directory */ 35 36 struct vfs_super_block_operations_t; 37 struct vfs_inode_operations_t; 38 39 struct vfs_index_node_t; 40 struct vfs_dir_entry_operations_t; 41 42 #define VFS_DF_MOUNTED (1 << 0) // 当前dentry是一个挂载点 43 #define VFS_DF_CANNOT_MOUNT (1 << 1) // 当前dentry是一个挂载点 44 struct vfs_dir_entry_t 45 { 46 char *name; 47 int name_length; // 名字的长度(不包含字符串末尾的'\0') 48 uint32_t d_flags; // dentry标志位 49 struct List child_node_list; 50 struct List subdirs_list; 51 52 struct lockref lockref; // 该lockref包含了dentry的自旋锁以及引用计数 53 struct vfs_index_node_t *dir_inode; 54 struct vfs_dir_entry_t *parent; 55 struct vfs_dir_entry_operations_t *dir_ops; 56 }; 57 58 struct vfs_superblock_t 59 { 60 struct vfs_dir_entry_t *root; 61 struct vfs_super_block_operations_t *sb_ops; 62 struct vfs_dir_entry_operations_t *dir_ops; // dentry's operations 63 struct block_device *blk_device; 64 void *private_sb_info; 65 }; 66 67 /** 68 * @brief inode结构体 69 * 70 */ 71 struct vfs_index_node_t 72 { 73 uint64_t file_size; // 文件大小 74 uint64_t blocks; // 占用的扇区数 75 uint64_t attribute; 76 struct lockref lockref; // 自旋锁与引用计数 77 78 struct vfs_superblock_t *sb; 79 struct vfs_file_operations_t *file_ops; 80 struct vfs_inode_operations_t *inode_ops; 81 82 void *private_inode_info; 83 }; 84 85 /** 86 * @brief 文件的mode 87 * 88 */ 89 #define VFS_FILE_MODE_READ (1 << 0) 90 #define VFS_FILE_MODE_WRITE (1 << 1) 91 #define VFS_FILE_MODE_RW (VFS_FILE_MODE_READ | VFS_FILE_MODE_WRITE) 92 93 #define vfs_file_can_read(file) (((file)->mode) & VFS_FILE_MODE_READ) 94 #define vfs_file_can_write(file) (((file)->mode) & VFS_FILE_MODE_WRITE) 95 #define vfs_file_can_rw(file) ((((file)->mode) & VFS_FILE_MODE_RW) == VFS_FILE_MODE_RW) 96 97 /** 98 * @brief 文件描述符 99 * 100 */ 101 struct vfs_file_t 102 { 103 long position; 104 uint64_t mode; 105 106 struct vfs_dir_entry_t *dEntry; 107 struct vfs_file_operations_t *file_ops; 108 void *private_data; 109 }; 110 111 struct vfs_filesystem_type_t 112 { 113 char *name; 114 int fs_flags; 115 struct vfs_superblock_t *(*read_superblock)( 116 struct block_device *blk); // 解析文件系统引导扇区的函数,为文件系统创建超级块结构。 117 struct vfs_filesystem_type_t *next; 118 }; 119 120 struct vfs_super_block_operations_t 121 { 122 void (*write_superblock)(struct vfs_superblock_t *sb); // 将超级块信息写入磁盘 123 void (*put_superblock)(struct vfs_superblock_t *sb); 124 void (*write_inode)(struct vfs_index_node_t *inode); // 将inode信息写入磁盘 125 }; 126 127 /** 128 * @brief 对vfs的inode的操作抽象 129 * 130 */ 131 struct vfs_inode_operations_t 132 { 133 /** 134 * @brief 创建新的文件 135 * @param parent_inode 父目录的inode结构体 136 * @param dest_dEntry 新文件的dentry 137 * @param mode 创建模式 138 */ 139 long (*create)(struct vfs_index_node_t *parent_inode, struct vfs_dir_entry_t *dest_dEntry, int mode); 140 /** 141 * @brief 在文件系统中查找指定的目录项 142 * @param parent_inode 父目录项(在这个目录下查找) 143 * @param dest_dEntry 构造的目标目录项的结构体(传入名称,然后更多的详细信息将在本函数中完成填写) 144 * 145 */ 146 struct vfs_dir_entry_t *(*lookup)(struct vfs_index_node_t *parent_inode, struct vfs_dir_entry_t *dest_dEntry); 147 /** 148 * @brief 创建文件夹 149 * @param inode 父目录的inode 150 * @param dEntry 新的文件夹的dentry 151 * @param mode 创建文件夹的mode 152 */ 153 long (*mkdir)(struct vfs_index_node_t *inode, struct vfs_dir_entry_t *dEntry, int mode); 154 long (*rmdir)(struct vfs_index_node_t *inode, struct vfs_dir_entry_t *dEntry); 155 long (*rename)(struct vfs_index_node_t *old_inode, struct vfs_dir_entry_t *old_dEntry, 156 struct vfs_index_node_t *new_inode, struct vfs_dir_entry_t *new_dEntry); 157 long (*getAttr)(struct vfs_dir_entry_t *dEntry, uint64_t *attr); 158 long (*setAttr)(struct vfs_dir_entry_t *dEntry, uint64_t *attr); 159 160 /** 161 * @brief 取消inode和dentry之间的链接关系(删除文件) 162 * 163 * @param inode 要被取消关联关系的目录项的【父目录项】 164 * @param dentry 要被取消关联关系的子目录项 165 */ 166 long (*unlink)(struct vfs_index_node_t *inode, struct vfs_dir_entry_t *dentry); 167 }; 168 169 struct vfs_dir_entry_operations_t 170 { 171 long (*compare)(struct vfs_dir_entry_t *parent_dEntry, char *source_filename, char *dest_filename); 172 long (*hash)(struct vfs_dir_entry_t *dEntry, char *filename); 173 long (*release)(struct vfs_dir_entry_t *dEntry); 174 long (*iput)(struct vfs_dir_entry_t *dEntry, struct vfs_index_node_t *inode); 175 }; 176 177 /** 178 * @brief 填充dirent的函数指针的类型定义 179 * 180 */ 181 typedef int (*vfs_filldir_t)(void *buf, ino_t d_ino, char *name, int namelen, unsigned char type, off_t offset); 182 183 struct vfs_file_operations_t 184 { 185 long (*open)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr); 186 long (*close)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr); 187 long (*read)(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position); 188 long (*write)(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position); 189 long (*lseek)(struct vfs_file_t *file_ptr, long offset, long origin); 190 long (*ioctl)(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr, uint64_t cmd, uint64_t arg); 191 192 long (*readdir)(struct vfs_file_t *file_ptr, void *dirent, vfs_filldir_t filler); // 读取文件夹 193 }; 194 195 /** 196 * @brief 初始化vfs 197 * 198 * @return int 错误码 199 */ 200 extern int vfs_init(); 201