int register_filesystem(struct file_system_type * fs)用于注册一个新的文件系统
其源码分析如下:
int register_filesystem(struct file_system_type * fs)
{
int res = 0;
struct file_system_type ** p;
#文件系统的名字中不能含有'.'
BUG_ON(strchr(fs->name, '.'));
#fs->next 不为null,则返回busy
if (fs->next)
return -EBUSY;
#文件系统都是在一个list中,所有要用锁保护起来
write_lock(&file_systems_lock);
#查找形参文件系统是否已经注册过,已经注册过就返回busy,负责就修改只能让其指向形参的文件系统
p = find_filesystem(fs->name, strlen(fs->name));
if (*p)
res = -EBUSY;
else
*p = fs;
write_unlock(&file_systems_lock);
return res;
}
从find_filesystem 函数可以知道所有已经注册的文件系统都是在file_systems 链表中。主要是通过name来匹配文件系统
是否已经注册
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)
#遍历已经注册的文件系统列表,用name来匹配
if (strncmp((*p)->name, name, len) == 0 &&
!(*p)->name[len])
break;
return p;
}
与之对应的是unregister_filesystem即取消一个文件系统
int unregister_filesystem(struct file_system_type * fs)
{
struct file_system_type ** tmp;
write_lock(&file_systems_lock);
#这里先用tmp 变量指向总的文件系统的链表
tmp = &file_systems;
while (*tmp) {
#比较指针释放相等,相等的话,则从file_systems中删除这个节点
if (fs == *tmp) {
*tmp = fs->next;
fs->next = NULL;
write_unlock(&file_systems_lock);
synchronize_rcu();
return 0;
}
tmp = &(*tmp)->next;
}
write_unlock(&file_systems_lock);
return -EINVAL;
}
内核文件系统API之register_filesystem和unregister_filesystem
最新推荐文章于 2023-11-24 20:22:56 发布