内核文件系统API之register_filesystem和unregister_filesystem

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
register_filesystem函数是Linux内核中用于向系统注册文件系统的函数,其源代码如下: ``` int register_filesystem(struct file_system_type *fs) { int err; down_write(&file_systems_lock); err = __register_filesystem(fs, false); up_write(&file_systems_lock); return err; } ``` 该函数接受一个file_system_type结构体指针作为参数,其中包含了要注册的文件系统的名称、挂载函数、卸载函数等信息。函数首先使用down_write函数获取文件系统锁,以确保在注册过程中不会发生并发问题。接着调用__register_filesystem函数进行具体的注册操作。最后使用up_write函数释放文件系统锁,并返回注册结果。 __register_filesystem函数的源代码如下: ``` int __register_filesystem(struct file_system_type *fs, int is_default) { struct file_system_type *old; int err = 0; /* Make sure we are not un-registering a file system while it is * being mounted. */ if (is_default) down_write(&file_systems_lock); else down_write_trylock(&file_systems_lock); old = find_filesystem(fs->name); if (old) { /* File system already exists */ err = -EBUSY; if (fs->owner != old->owner) err = -EEXIST; goto out; } err = -ENOMEM; if (fs->fs_supers) { err = radix_tree_preload(GFP_KERNEL); if (err) goto out; } err = security_fs_context_dup(fs->fs_context); if (err) goto out_radix; err = security_fs_context_parse_param(fs->fs_context, fs->name); if (err) goto out_fs_context; list_add(&fs->fs_supers, &file_systems); if (is_default) up_write(&file_systems_lock); else up_write(&file_systems_lock); return 0; out_fs_context: security_fs_context_free(fs->fs_context); out_radix: if (fs->fs_supers) radix_tree_preload_end(); out: up_write(&file_systems_lock); return err; } ``` 该函数首先获取文件系统锁,接着使用find_filesystem函数查找是否已经存在同名的文件系统。如果已经存在,则返回错误码。如果不存在,则进行一系列初始化操作,如调用radix_tree_preload函数预加载文件系统的超级块、复制安全上下文等。最后将文件系统加入到file_systems链表中,并释放文件系统锁。 总体来说,register_filesystem函数和__register_filesystem函数的功能非常简单明了,主要就是向系统注册文件系统。在实现过程中,需要注意并发问题,尤其是多线程同时注册文件系统时可能会引发竞争问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值