上一篇分析了vfat(FAT系列文件系统在Linux系统中的名字)自身的一些信息,这一篇看看这些信息给了谁,那就得看
register_filesystem
里面了。
文件系统注册
注册过程离不开kernel/fs/filesystems.c里面的一些东西。
static struct file_system_type *file_systems;
file_systems
是一个struct file_system_type
类型的指针变量,这个类型和vfat的身份信息类型是同一个哦。这个类型定义在kernel/include/linux/fs.h里面,请额外注意一下struct file_system_type * next;
这个成员(没错,它是个单向链表),下面要用。
struct file_system_type {
const char *name;
int fs_flags;
//...
void (*kill_sb) (struct super_block *);
struct module *owner;
struct file_system_type * next;
//...
};
下面这个函数就是在遍历由file_systems
开始的链表了。
- 如果
file_systems
为空,就返回file_systems
的地址 - 如果
file_systems
不为空,就返回链表的尾节点的next成员的地址
注意,上面两点都是返回指针的地址,不是返回指针值哦
static struct file_system_type **find_filesystem(const char *name, unsigned len)
{
struct file_system_type **p;
for (p=&file_systems; *p; p=&(*p)->next)
if (strlen((*p)->name) == len &&
strncmp((*p)->name, name, len) == 0)
break;
return p;
}
这里回到我们最初的问题——如何注册文件系统?下面这个函数就是把新文件系统的struct file_system_type
变量接到以file_systems
为首的链表尾部。
int register_filesystem(struct file_system_type * fs)
{
struct file_system_type ** p;
//...
p = find_filesystem(fs->name, strlen(fs->name));
if (*p)
res = -EBUSY;
else
*p = fs;
//...
}