Linux 文件系统注册register_filesystem与注销unregister_filesystem源码详解

  1. 参考:  http://blog.csdn.net/gxfan/article/details/3079766
  2.              http://bbs.chinaunix.net/thread-4103398-1-1.html  
  3. 在linux内核中,每一种注册了的文件系统都由一个类型为file_system_type的结构体来代表,该结构体中含有一个类型为file_system_type*的域next,linux正是通过这个next域把所有注册了的文件系统连接起来的,同时,linux内核还定义了一个指向链表中第一个元素的全局指针file_systems和一个用来用来防止并发访问该链表的读/写自旋锁file_systems_lock。
  4. //查找file_systems中指定name的文件系统类型是否存在,若在,则返回指针,否则返回file_systems末尾的next指针
  5. static struct file_system_type **find_filesystem(const char *name, unsigned len)
  6. {
  7.         struct file_system_type **p;
  8.         for (p=&file_systems; *p; p=&(*p)->next)
  9.                 if (strlen((*p)->name) == len &&
  10.                     strncmp((*p)->name, name, len) == 0)
  11.                         break;
  12.         return p;
  13. }

  14. /**
  15. *        register_filesystem - register a new filesystem
  16. *        @fs: the file system structure
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值