手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux虚拟文件系统(安装根文件系统)

[日期:2012-02-10] 来源:Linux社区  作者:bullbat [字体: ]
[cpp]
  1. /*所有超级块对象都以双向循环链表的形式链接在一起,量表中第一个 
  2. 元素用super_blocks变量表示,而超级块对象的s_list字段存放指向链表 
  3. 相邻元素的指针*/  
  4. LIST_HEAD(super_blocks);  
[cpp]
  1. /** 
  2.  *  alloc_super -   create new superblock 
  3.  *  @type:  filesystem type superblock should belong to 
  4.  * 
  5.  *  Allocates and initializes a new &struct super_block.  alloc_super() 
  6.  *  returns a pointer new superblock or %NULL if allocation had failed. 
  7.  */  
  8. static struct super_block *alloc_super(struct file_system_type *type)  
  9. {     
  10.     /*从内存中申请sb*/  
  11.     struct super_block *s = kzalloc(sizeof(struct super_block),  GFP_USER);  
  12.     static const struct super_operations default_op;  
  13.   
  14.     if (s) {  
  15.         if (security_sb_alloc(s)) {  
  16.             kfree(s);  
  17.             s = NULL;  
  18.             goto out;  
  19.         }  
  20.         /*初始化*/  
  21.         INIT_LIST_HEAD(&s->s_files);  
  22.         INIT_LIST_HEAD(&s->s_instances);  
  23.         INIT_HLIST_HEAD(&s->s_anon);  
  24.         INIT_LIST_HEAD(&s->s_inodes);  
  25.         INIT_LIST_HEAD(&s->s_dentry_lru);  
  26.         init_rwsem(&s->s_umount);  
  27.         mutex_init(&s->s_lock);  
  28.         lockdep_set_class(&s->s_umount, &type->s_umount_key);  
  29.         /* 
  30.          * The locking rules for s_lock are up to the 
  31.          * filesystem. For example ext3fs has different 
  32.          * lock ordering than usbfs: 
  33.          */  
  34.         lockdep_set_class(&s->s_lock, &type->s_lock_key);  
  35.         /* 
  36.          * sget() can have s_umount recursion. 
  37.          * 
  38.          * When it cannot find a suitable sb, it allocates a new 
  39.          * one (this one), and tries again to find a suitable old 
  40.          * one. 
  41.          * 
  42.          * In case that succeeds, it will acquire the s_umount 
  43.          * lock of the old one. Since these are clearly distrinct 
  44.          * locks, and this object isn't exposed yet, there's no 
  45.          * risk of deadlocks. 
  46.          * 
  47.          * Annotate this by putting this lock in a different 
  48.          * subclass. 
  49.          */  
  50.         down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);  
  51.         s->s_count = S_BIAS;  
  52.         atomic_set(&s->s_active, 1);  
  53.         mutex_init(&s->s_vfs_rename_mutex);  
  54.         mutex_init(&s->s_dquot.dqio_mutex);  
  55.         mutex_init(&s->s_dquot.dqonoff_mutex);  
  56.         init_rwsem(&s->s_dquot.dqptr_sem);  
  57.         init_waitqueue_head(&s->s_wait_unfrozen);  
  58.         s->s_maxbytes = MAX_NON_LFS;  
  59.         s->dq_op = sb_dquot_ops;  
  60.         s->s_qcop = sb_quotactl_ops;  
  61.         s->s_op = &default_op;  
  62.         s->s_time_gran = 1000000000;  
  63.     }  
  64. out:  
  65.     return s;  
  66. }  

kill_litter_super的过程相反,这里不再写了。

构造根目录是由init_mount_tree()函数实现的,该函数在前面已经介绍过了。

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款