|
Linux 内核文件系统与设备操作流程分析(31) error = type->get_sb(type, flags, name, data, mnt); if (error < 0) goto out_free_secdata;
error = security_sb_kern_mount(mnt->mnt_sb, secdata); if (error) goto out_sb; // // 这里的挂接点是一个 dentry 结构 // mnt->mnt_mountpoint = mnt->mnt_root;
// // 把新的 vfsmount 结构赋给自身的 parent 这样可以 // 通过 parent 遍历出所有 mount 的文件系统 // mnt->mnt_parent = mnt; up_write(&mnt->mnt_sb->s_umount); free_secdata(secdata); return mnt;
// // 以下流程只有出错时才会走到 // out_sb: dput(mnt->mnt_root); up_write(&mnt->mnt_sb->s_umount); deactivate_super(mnt->mnt_sb); out_free_secdata: free_secdata(secdata); out_mnt: free_vfsmnt(mnt); out: return ERR_PTR(error); }
下面的 ext3_get_sb() 函数仅是个简单的封状,直接调用的 get_sb_bdev() 函数,但这里要注意 get_sb_bdev() 函数不是严格按照 ext3_get_sb() 函数 进行传递的,它本身多出了一个 ext3_fill_super 参数,而这个参数是以一个 回调函数形式提供的。
static int ext3_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) { // // 注意:这里多了一个 ext3_fill_super() 的回调函数。
|