引言
写到这里我们已经从mount文件系统调用的入口开始,分析到内核的mount,通过VFS层进入到具体文件系统实现的mount函数,最终得到具体文件系统的super block信息后构建出一个新的struct mount结构,返回给do_add_mount继续下面的操作。本来在这节我想从do_add_mount的代码开始把mount最后一部分——加入全局文件系统树讲完。但是写到一半我发现自己写不下去了,因为单纯的对代码进行注释没有办法解释很多基本的问题,到底挂载实例和文件系统有什么关系?我觉得不把这个说一下没有办法往下写,所以插入这样一节,我们来看一下挂载实例(struct mount/ struct vfsmount)和super block, dentry, inode, file_system_type的关系,以及一个文件系统挂载到另一个文件系统下时到底是怎么样的关系。
为了说明的方便,我们下面以这样的场景为例进行描述:
1. 系统中有xfs, ext2和minix等若干文件系统模块
2. 现有/dev/sda1和/dev/sdb1上存在xfs文件系统,/dev/sda2上为ext2文件系统,/dev/sdc1上为minix文件系统
3. 将/dev/sda1挂载到/mnt/a上,将/dev/sdb1挂载到/mnt/b上,将/dev/sdc1不挂载
4. 在第三步之后,将/dev/sda2也挂载到/mnt/a上。再将/dev/sda1同时挂载到/mnt/x上
file_system_type + super block + mount的关系
从file_system_type到super_block到mount实例的角度来看,上述关系大致是这样的: