1. 与文件系统相关的数据结构
1.1 文件系统类型
1.1.1 file_system_type 数据结构
用来描述特定文件系统的结构。
struct file_system_type {
const char *name; /* 文件系统名 */
int fs_flags; /* 文件系统类型标志 */
int (*get_sb) (struct file_system_type *, int,
const char *, void *, struct vfsmount *); /* 读超级块的方法 */
void (*kill_sb) (struct super_block *); /* 删除超级块方法 */
struct module *owner; /* 指向实现文件系统的模块的指针 */
struct file_system_type * next; /* 指向文件系统类型链表中下一个元素的指针 */
struct list_head fs_supers; /* 具有相同文件系统类型的超级块对象链表的头 */
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
};
next
:
所有文件系统类型对象都插入到一个单向链表中。由变量 file_systems 指向链表的第一个元素,next 字段指向链表的下一个元素。fs_supers
:
fs_supers 字段表示给定类型的已安装文件系统对应的超级块链表的头。链表的相邻元素存放在超级块对象的 s_instances 字段。get_sb
:
get_sb字段指向依赖于文件系统类型的函数,该函数分配一个新的超级块对象并初始化它,如果需要可以读取磁盘。
1.1.2 文件系统类型注册
文件系统的源代码要么包含在内核映像中,要么作为一个模块被动态加载。VFS必须对代码目前已在内核中的所有文件系统的类型进行跟踪。这就是通过进行文件系统类型注册来实现的。调用 register_filesystem() 函数来注册编译时指定的每个文件系统;该函数把 file_system_type 对象插入到链表中。相关代码示例:
static struct file_system_type ext2_fs_type = {
.owner = THIS_MODULE,
.name = "ext2",
.get_sb = ext2_get_sb,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
static int __init init_ext2_fs(void)</