8.6.1 磁盘文件系统BFS

   BFSBerkeley fast file system的简写,即柏克莱快速文件系统,是一种简单的基于磁盘的文件系统。BFS将磁盘的分区分割为许多的柱面群,每一个柱面群依磁盘的大小,包含了 1 32 相邻的柱面。BFS模块的相关代码在fs/bfs/inode.c中:

 

static DECLARE_FSTYPE_DEV(bfs_fs_type, "bfs", bfs_read_super);

 

static int __init init_bfs_fs(void)

{

                      return register_filesystem(&bfs_fs_type);

}

 

static void __exit exit_bfs_fs(void)

{

                      unregister_filesystem(&bfs_fs_type);

}

 

module_init(init_bfs_fs)

module_exit(exit_bfs_fs)

 

    DECLARE_FSTYPE_DEV()bfs_fs_type文件类型的标志置为FS_REQUIRES_DEV,表示BFS需要一个实际的块设备来进行安装。

   模块的初始化函数调用register_filesystem()向VFS注册该文件系统,调用unregister_filesystem()注销该文件系统。

   一旦文件系统被注册,我们就可以安装它,在安装一个文件系统时就会调用fs_type->read_super()方法来读其超级块,具体到BFS文件系统则是调用fs/bfs/inode.c中的bfs_read_super()函数,该函数的原型为:

    static struct super_block * bfs_read_super(struct super_block * s,

        void * data, int silent)

   其中参数s是指向super_block的数据结构,在调用这个函数之前,该结构已被进行了一定的初始化,例如其s_dev域已经有了具体设备的设备号。但是,结构中的大部分内容还没有设置。而这个函数要做的工作就是从磁盘上读入该文件系统的超级块,并根据其内容设置这个super_block数据结构。另一个指针data的使用,因文件系统而异,对于BFS文件系统来说并没有使用这个参数。而参数silent,则表示在读超级块的过程中是否详细地报告出错信息。

    现在,我们又回到在VFS级的调用函数fs/super.c中的read_super()。在read_super()成功返回以后,VFS就获得了对该文件系统模块的引用。

   接下来,我们来考察以下在对该文件系统进行I/O操作时都发生些什么事情。我们已经考察过,iget(sb, ino)根据索引节点号从磁盘读入相应索引节点并在内存建立起相应的inode结构,在建立inode结构的过程中,还要做其它的事情,比如读inode->i_op inode->i_fop;打开一个文件就意味着把inode->i_fop拷贝到file->f_op