内核文件系统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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值