一步一步粗谈linux文件系统(三)----超级块(superblock)【转】
本文转载自:https://blog.csdn.net/fenglifeng1987/article/details/8302921
超级块是来描述整个文件系统信息的,可以说是一个全局的数据结构,可以把它理解成文件系统的心脏
比较简单的文件系统中(如ramfs和sysfs),超级块的初始化大致分三步:
1、sget
2、fill_super
3、simple_set_mnt
sget:
/**
* sget - findor create a superblock
* @type: filesystemtype superblock should belong to
* @test: comparisoncallback
* @set: setupcallback
* @data: argumentto each of them
*/
struct super_block*sget(struct file_system_type*type, //得到一个超级快superblock
int(*test)(struct super_block *,void *),
int(*set)(struct super_block *,void *),
void*data)
这个函数的意思其实很简单明了,就是为超级块alloc一块空间出来,并有主流的初始化操作。
fill_super:
这个各个文件系统有着自己的填充函数,but万变不离其中的是,sb->s_op,sb->s_root(dentry),还有一个inode。其中inode中又会有各个系统特有的操作,i_fop,i_op,i_mapping。这个文件系统第一个inode,dentry,后续的很多操作都是基于这一步开始的。linux万物皆文件,文件皆目录(dentry),目录指节点(inode),其实很多操作皆出自inode,切记切记。
将文件系统中的操作大致赋值定型,个人觉得,如果要深入了解某个文件系统的话,这部分过程得用笔记记下来,然后接下来调用操作的时候,能一目了然。这部分真的很重要的。
simple_set_mnt:
intsimple_set_mnt(struct vfsmount *mnt, struct super_block *sb)
{
mnt->mnt_sb= sb;
mnt->mnt_root= dget(sb->s_root);
return0;
}
这部分很简单,因为最终需要返回的是mnt,而非sb,所以要将sb挂到mnt上。