展示Linux内核的mount_single(fs_type, flags, data, pstore_fill_super);函数源代码,尽量详细介绍其源代码
时间: 2024-05-01 16:17:14 浏览: 221
mount_single是Linux内核用于挂载单个文件系统的函数,其定义在文件fs/super.c中。其源代码如下:
```
struct file_system_type *get_fs_type(const char *name)
{
struct file_system_type *fs_type = NULL;
read_lock(&file_systems_lock);
fs_type = __get_fs_type_locked(name);
read_unlock(&file_systems_lock);
return fs_type;
}
struct super_block *mount_single(struct file_system_type *fs_type, int flags,
const void *data, int (*fill_super)(struct super_block *, void *, int))
{
struct super_block *s = NULL;
struct dentry *root = NULL;
int err;
if (!fs_type || !fill_super)
return ERR_PTR(-EINVAL);
err = security_sb_mount(fs_type, flags, data);
if (err)
return ERR_PTR(err);
s = sget(fs_type, NULL, set_anon_super, flags, NULL);
if (IS_ERR(s))
return s;
if (!(s->s_flags & MS_NOUSER))
err = user_namespace_sem(&s->s_user_ns);
if (!err)
err = fill_super(s, (void *)data, flags & MS_SILENT ? 1 : 0);
if (err)
goto out_err;
if (s->s_root) {
root = dget(s->s_root);
if (!(flags & MS_RDONLY) && sb_rdonly(s))
goto out_err;
if (!(flags & MS_NOATIME))
sb_post_addmount(s, flags & MS_RDONLY ? MNT_READONLY_ATIME : MNT_ATIME);
if (flags & MS_ACTIVE) {
err = activate_super(s, flags);
if (err)
goto out_err;
}
if (!(flags & MS_SILENT))
pr_notice("%s: mounted filesystem with%s data mode. "
"Opts: %s\n", s->s_id, sb_rdonly(s) ? " read-only" : "",
(char *)data);
dput(root);
return s;
}
out_err:
deactivate_locked_super(s);
return ERR_PTR(err);
}
```
函数的第一个参数是文件系统类型,其类型为struct file_system_type。第二个参数是挂载选项,用于指定文件系统的挂载方式,如只读挂载、读写挂载等。第三个参数是指向挂载数据的指针,其类型为void *。最后一个参数是一个函数指针,用于初始化super_block结构体。
函数首先会进行安全检查,然后调用sget函数创建一个super_block结构体。如果创建失败,函数将返回一个错误指针。否则,函数会调用fill_super函数初始化super_block结构体,如果初始化失败,函数将释放super_block结构体并返回错误指针。
如果super_block结构体初始化成功,则函数将检查是否需要进行用户命名空间的处理,然后将文件系统挂载到指定的目录下。如果挂载成功,函数将返回super_block结构体。
值得注意的是,mount_single函数只能用于挂载单个文件系统。如果需要挂载多个文件系统,应该使用mount_multi函数。
阅读全文