[virtual system file] sget函数解析

来源:互联网 发布:怎样登录淘宝联助手 编辑:程序博客网 时间:2024/06/15 17:50



struct super_block *sget(struct file_system_type *type,int (*test)(struct super_block *,void *),int (*set)(struct super_block *,void *),int flags,void *data) /* find or create a superblock */{struct super_block *s = NULL;struct super_block *old;int err;retry:spin_lock(&sb_lock);if (test) {/* 该if语句,用于搜索type->fs_supers链表是否有需求的super_block实例,如果有则返回该实例,如果没有退出该if */hlist_for_each_entry(old, &type->fs_supers, s_instances) {if (!test(old, data))continue;if (!grab_super(old))goto retry;if (s) {up_write(&s->s_umount);destroy_super(s);s = NULL;}return old;}}if (!s) {spin_unlock(&sb_lock);s = alloc_super(type, flags);/* 分配一个super_block的实例,并对其成员初始化 */if (!s)return ERR_PTR(-ENOMEM);goto retry;}err = set(s, data);/* 关联super_block与data */if (err) {spin_unlock(&sb_lock);up_write(&s->s_umount);destroy_super(s);return ERR_PTR(err);}s->s_type = type;strlcpy(s->s_id, type->name, sizeof(s->s_id));list_add_tail(&s->s_list, &super_blocks);hlist_add_head(&s->s_instances, &type->fs_supers); /* 将super_block添加到type->fs_supers的hash链表 */spin_unlock(&sb_lock);get_filesystem(type);register_shrinker(&s->s_shrink);return s;}EXPORT_SYMBOL(sget);

总结:sget是在@type的fs_supers链表中找是否与@data相匹配的super_block实例,通过@test方法,如果找到直接返回该实例;如果没有找到则通过alloc_super方法申请一个新的super_block实例,并将该实例用@set方法与@data关联起来与进一步的初始化,并将该实例添加到super_blocks链表和@type->fs_supers链表中,然后返回该实例。

0 0
原创粉丝点击