该文件位于源码中的fs/中:
在Linux中是使用mount和umount指令来安装和卸载(或者说是挂载和卸载)文件系统的,一旦改变文件系统,那么在文件系统中的一些接口和处理函数也会发生相应的改变。在使用诸如open、read等系统调用的时候,内核是先调用VFS的通用系统调用,然后再找到当前文件系统的种类,然后具体的调用该文件系统的对应的函数来实现具体的功能,而下面的这个文件就是完成安装和卸载文件系统的功能。
在最新内核版本(2.6.36.1)中filesystems.c文件位于内核源代码下的 fs/ 里,代码共286行,虽然比较短小,但是承担的任务还是比较重要的,其中的register_filesystem函数就是完成mount的功能,unregister_filesystem函数是完成umount的功能。
源代码分析:
/*
* linux/fs/filesystems.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*
* table of configured filesystems
*/
#include <linux/syscalls.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/kmod.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
static struct file_system_type *file_systems;
/*
该结构体定义在include/linux/fs.h中:
struct file_system_type {
const char *name;//文件系统的名称
int fs_flags;//标志位
int (*get_sb) (struct file_system_type *, int,
const char *, void *, struct vfsmount *);
得到super block的函数,在security/inode.c中实现:
static int get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name,
void *data, struct vfsmount *mnt)
{
return get_sb_single(fs_type, flags, data, fill_super, mnt);
该函数在fs/super.c中实现,得到系统的super block。
}
void (*kill_sb) (struct super_block *);//删除super block
struct module *owner;//模块所有者
struct file_system_type * next;//类似链表,下一个文件类型
struct list_head fs_supers;//文件系统super的一个链
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
struct lock_class_key s_vfs_rename_key;
struct lock_class_key i_lock_key;
struct lock_class_key i_mutex_key;
struct lock_class_key i_mutex_dir_key;
struct lock_class_key i_alloc_sem_key;
/*
lock_class_key在/include/linux/lockdep.h中定义:
struct lock_class_key {
struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES];
*/
};
应该是一个类似于锁的一种对文件系统更换操作时进行加锁保护的一些变量。
*/
static DEFINE_RWLOCK(file_systems_lock);
/*
该宏在include/linux/rwlock_types.h中定义:
#define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x)
大概就是为文件系统进行加锁的操作
*/
void get_filesystem(struct file_system_type *fs)
{
__module_get(fs->owner);
}
/*
该函数是用来加载文件系统模块的,其中的函数在include/linux/module.h中定义:
static inline void __module_get(struct module *module)
{
if (module) {
preempt_disable();
__this_cpu_inc(module->refptr->incs);
trace_module_get(module, _THIS_IP_);
preempt_enable();
}
}
具体实现不用搞懂,只要知道它是把module模块加载到内核中。
*/
void put_filesystem(struct file_system_type *fs)
{
module_put(fs->owner);
}
/*
该函数是用来卸载文件系统模块的,其中函数定义在ke