- 论坛徽章:
- 1
|
*/
419struct super_block *sget(struct file_system_type *type,
420 int (*test)(struct super_block *,void *),
421 int (*set)(struct super_block *,void *),
422 void *data)
423{
424 struct super_block *s = NULL;
425 struct hlist_node *node;
426 struct super_block *old;
427 int err;
428
429retry:
430 spin_lock(&sb_lock);
431 if (test) {
432-449: 从该文件系统的超级块list里搜寻是否已经有人产生过同样的超级块
432 hlist_for_each_entry(old, node, &type->fs_supers, s_instances) {
433 if (!test(old, data))
434 continue;
435 if (!grab_super(old))
436 goto retry;
437 if (s) {
第一次就找到一个同名的超级快时这段代码不会执行
因为s=NULL
第一次没找到,分配一个新的超级块,然后回头再找时, 如果第二次找到了一个同名超级块,就用别人已经产生的,把新的释放掉
438 up_write(&s->s_umount);
439 destroy_super(s);
440 s = NULL;
441 }
442 down_write(&old->s_umount);
443 if (unlikely(!(old->s_flags & MS_BORN))) {
444 deactivate_locked_super(old);
445 goto retry;
446 }
447 return old;
448 }
449 }
450 if (!s) {
前面没有找到,就创建一个新的
451 spin_unlock(&sb_lock);
452 s = alloc_super(type);
453 if (!s)
454 return ERR_PTR(-ENOMEM);
455 goto retry; 然后回头到429行,在文件系统的超级块链表里再找一遍
456 }
457
458 err = set(s, data);
459 if (err) {
460 spin_unlock(&sb_lock);
461 up_write(&s->s_umount);
462 destroy_super(s);
463 return ERR_PTR(err);
464 }
465 s->s_type = type;
466 strlcpy(s->s_id, type->name, sizeof(s->s_id));
467 list_add_tail(&s->s_list, &super_blocks);
468 hlist_add_head(&s->s_instances, &type->fs_supers);
469 spin_unlock(&sb_lock);
470 get_filesystem(type);
471 register_shrinker(&s->s_shrink);
472 return s;
473}
474
475EXPORT_SYMBOL(sget);
这种算法就是:
先在list里找,看有没有别人创建一个同名的模块,如果有,就用现成的
如果没有, 就创建一个新的
创建完了后,要回到list,重新找一遍;还是没找到,就用新的。
如果第二次找到一个同名一创建的模块,还用旧的,把新的释放掉。
文件系统里super block/inode都用这样一种算法。
感觉这样的算法不是很严谨,有点撞大运的成分。
ps 顺便请教如何贴代码?
|
|