FAT文件系统的挂载过程

有了上一篇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函数:

                                              未完...................最近没空.....................后续补上.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值