内核文件系统的注册

来源:互联网 发布:淘宝详情页和主图视频 编辑:程序博客网 时间:2024/05/17 22:05

内核将文件系统保存在一个静态全局变量中。位置在fs/filesystems.c

static struct file_system_type *file_systems;


linux源码中,每种实际的文件系统都用以下的数据结构表示:

struct file_system_type {const char *name;int fs_flags;int (*get_sb) (struct file_system_type *, int,       const char *, void *, struct vfsmount *);void (*kill_sb) (struct super_block *);struct module *owner;struct file_system_type * next;struct list_head fs_supers;struct lock_class_key s_lock_key;struct lock_class_key s_umount_key;struct lock_class_key s_vfs_rename_key;struct lock_class_key i_lock_key;struct lock_class_key i_mutex_key;struct lock_class_key i_mutex_dir_key;struct lock_class_key i_alloc_sem_key;};

struct file_system_type定义在include/linux/fs.h中

各个字段的含义:

  1. name:文件系统类型的名称,mount -t name /dev/abc /mnt,就是这个name
  2. fs_flags:文件系统类型标志
  3. get_sb:函数指针,读取超级块的方法
  4. kill_sb:函数指针,卸载超级块的方法
  5. owner:指向拥有这个结构的模块
  6. next:文件系统链表的下一个对象
  7. fs_supers:同一类型文件系统的超级块形成一个链表,fs_supers是这个链表的头
  8. 其他字段是一些相关的锁

不同的文件系统类型通过next连接形成单向链表,同一种文件系统类型的超级块通过都挂在双向链表fs_super上


rootfs的注册(不管怎么样,rootfs还是必须有的):

asmlinkage void __init start_kernel(void){。。。vfs_caches_init(num_physpages); 。。。}
void __init vfs_caches_init(unsigned long mempages){。。。mnt_init();。。。}
void __init mnt_init(void){。。。err = sysfs_init();if (err)printk(KERN_WARNING "%s: sysfs_init error: %d\n",__func__, err);fs_kobj = kobject_create_and_add("fs", NULL);if (!fs_kobj)printk(KERN_WARNING "%s: kobj create error\n", __func__);init_rootfs();init_mount_tree();}

int __init init_rootfs(void){int err;err = bdi_init(&ramfs_backing_dev_info);if (err)return err;err = register_filesystem(&rootfs_fs_type);if (err)bdi_destroy(&ramfs_backing_dev_info);return err;}
init_rootfs定义在fs/ramfs/inode.c中,通过调用register_filesystem完成文件系统注册


rootfs文件系统的定义如下:

static struct file_system_type rootfs_fs_type = {.name= "rootfs",.get_sb= rootfs_get_sb,.kill_sb= kill_litter_super,};


文件系统的注册:

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

int register_filesystem(struct file_system_type * fs){int res = 0;struct file_system_type ** p;BUG_ON(strchr(fs->name, '.'));if (fs->next)return -EBUSY;INIT_LIST_HEAD(&fs->fs_supers);write_lock(&file_systems_lock);p = find_filesystem(fs->name, strlen(fs->name));if (*p)res = -EBUSY;else*p = fs;write_unlock(&file_systems_lock);return res;}

register_filesystem:从全局变量file_systems中找到相同的文件系统,如果已经存在文件系统,说明已经注册过该文件系统,如果链表中不存在,就将该文件加入到链表中完成文件系统的注册,所以注册过程就是将文件系统的数据结构加入到全局的链表中。


文件系统的卸载:

int unregister_filesystem(struct file_system_type * fs){struct file_system_type ** tmp;write_lock(&file_systems_lock);tmp = &file_systems;while (*tmp) {if (fs == *tmp) {*tmp = fs->next;fs->next = NULL;write_unlock(&file_systems_lock);return 0;}tmp = &(*tmp)->next;}write_unlock(&file_systems_lock);return -EINVAL;}
将文件系统从file_systems链表中删除

0 0
原创粉丝点击