Linux 核心--10.文件系统( 七 )



如果找到了一个相匹配的文件系统名,那么它就知道核心支持此文件系统并可得到读取此文件系统超块相关例程的指针 。如果找不到,但文件系统使用了可动态加载核心模块,则操作仍可继续 。此时核心将请求核心后台进程加载相应的文件系统模块 。

接下来如果由mount传递的物理设备还没有安装, 则必须找到新文件系统将要安装到的那个目录的VFS inode 。这个VFS inode可能在inode cache中也可能在支撑这个安装点所在文件系统的块设备中 。一旦找到这个inode则将对它进行检查以确定在此目录中是否已经安装了其它类型的文件系统 。多个文件系统不能使用相同目录作为安装点 。

此时VFS安装代码必须分配一个VFS超块并将安装信息传递到此文件系统的超块读例程中 。系统中所有的VFS 超块都被保存在由super_block结构构成的super_blocks数组中, 并且对应此安装应有一个这种结构 。超块读 例程将基于这些从物理设备中读取的信息来填充这些VFS超块域 。对于EXT2文件系统此信息的转化过程十分 简便,仅需要读取EXT2超块并填充VFS超块 。但其它文件系统如MS-DOS文件系统就不那么容易了 。不管哪种文件系统,对VFS超块的填充意味着文件系统必须从支持它的块设备中读取描叙它的所有信息 。如果块设备驱动不能从中读取或不包含这种类型文件系统则mount命令会失败 。






图9.6 一个已安装的文件系统

每个文件系统用一个vfsmount结构来描叙 。如图9.6所示 。它们被排入由vfsmntlist指向的的链表中 。

另外一个指针:vfsmnttail指向链表的最后一个入口, 同时mru_vfsmnt指针指向最近使用最多的文件系统 。每个vfsmount结构中由以下部分组成:包含此文件系统的块设备的设备号,此文件系统安装的目录以及文件 系统安装时分配的VFS超块指针 。VFS超块指向这种类型文件系统和此文件系统根inode的file_system_type结构 。一旦此文件系统被加载, 这个inode将一直驻留在VFS inod cache中 。


9.2.5在虚拟文件系统中搜寻文件
为了在虚拟文件系统中找到某个文件的VFS inode,VFS必须依次解析此文件名字中的间接目录直到找到此VFS inode 。每次目录查找包括一个对包含在表示父目录VFS inode中的查找函数的调用 。由于我们总是让每个文件系统的根可用并且由此系统的VFS 超块指向它,所以这是一个可行方案 。每次在实际文件系统中寻找inode 时,文件系统将在目录cache中寻找相应目录 。如果在目录cache中无相应入口则文件系统必须从底层文件系统或inode cache中取得此VFS inode 。


9.2.6Creating a File in the Virtual File System

9.2.7卸载文件系统
如果已安装文件系统中有些文件还在被系统使用则不能卸载此文件系统 。例如有进程使用/mnt/cdrom或其子目录时将不能卸载此文件系统 。如果将要卸载的文件系统中有些文件还在被使用,那么在VFS inode cache中有与其对应的VFS inode 。通过在inode链表中查找此文件系统占用设备的inode来完成此工作 。对应此已安装文件系统的VFS超块为dirty,表示它已被修改过所以必须写回到磁盘的文件系统中 。一旦写入磁盘,VFS超块占用的内存将归还到核心的空闲内存池中 。最后对应的vfsmount结构将从vfsmntlist中释放 。


9.2.8The VFS Inode Cache
操纵已安装文件系统时,它们的VFS inode将被连续读写 。虚拟文件系统通过维护一个inode cache来加速对所有已安装文件系统的访问 。每次VFS inode都可从inode cache中读取出来以加速对物理设备的访问 。

VFS inode cache以散列表形式实现,其入口时指向具有相同散列值的VFS inode链表 。每个inode的散列值可通过包含此文件系统的底层物理设备标志符和inode号计算出来 。每当虚拟文件系统访问一个inode时,系统将首先在VFS inode cache中查找 。为了在cache中寻找inode,系统先计算出其散列值然后将其作为inode散列表的索引 。这样将得到指向一系列相同散列值的inode链表 。然后依次读取每个inode直到找到那个具有相同inode号以及设备标志符的inode为止 。

推荐阅读