有了上一篇vfs的笔记为基础,接着实际分析一个真实的文件系统挂载过程,所以选择了一个简单的fat文件系统。
fs/namespace.c中mount的系统调用为:
SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
char __user *, type, unsigned long, flags, void __user *, data)
{
int ret;
char *kernel_type;
char *kernel_dir;
char *kernel_dev;
unsigned long data_page;
ret = copy_mount_string(type, &kernel_type);//挂载类型,这里为vfat
if (ret < 0)
goto out_type;
kernel_dir = getname(dir_name);//从userspace拷贝挂载目录,比如挂载到/mnt/sdcard
if (IS_ERR(kernel_dir)) {
ret = PTR_ERR(kernel_dir);
goto out_dir;
}
ret = copy_mount_string(dev_name, &kernel_dev);//挂载的设备节点,如/dev/sdb
if (ret < 0)
goto out_dev;
ret = copy_mount_options(data, &data_page);//挂载选项,如wait noatime nodiratime nosuid nodev uid=1000等
if (ret < 0)
goto out_data;
ret = do_mount(kernel_dev, kernel_dir, kernel_type, flags,
(void *) data_page);
........................
}
经过层层调用,最终是调用文件系统自己的mount方法,type->mount(type, flags, name, data),进入到fat的file_system_type,这是在内核启动时候就注册了的,不过要注意的是所谓注册文件系统,只不过是简单的把它添加到内核的文件系统链表而已,要文件系统真正生效能使用,必须挂载才行:
static struct file_system_type vfat_fs_type = {
.owner = THIS_MODULE,
.name = "vfat",
.mount = vfat_mount,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
调用的是vfat_mount函数:
未完...................最近没空.....................后续补上.