Raid1源代码分析--初始化流程
初始化流程代码量比较少,也比较简单。主要是run函数。(我阅读的代码的linux内核版本是2.6.32.61)
四、初始化流程分析
run函数顾名思义,很简单这就是在RAID1开始运行时调用,进行一些初始化的操作。主要是对RAID1中的conf进行初始化。run函数在md.c的do_md_run中被调用。
run函数的具体流程
0.传入参数mddev就是指RAID1所处的MD设备。
1. 定义相关变量。
1.1 定义conf指针,类型为raid1_private_data_s,是raid1中的重要私有数据结构。
1.2 定义rdev指针为组成该MD设备的disk指针,其类型为mdk_rdev_t。
2. 检查mddev->level是否为1。如果为1,则是使用的disk mirror技术,也就是raid1,继续下面的流程。
3. 检查reshape_position是否为MaxSector。如果相等,其实也就是不需要reshape的意思,继续下面的流程。
4. 申请raid1私有数据区conf,并且把conf结构挂接到mddev->private上,私有数据区中还申请了一个mempool,为盘阵读写缓存使用。把mddev的结构挂接在conf->poolinfo->mddev上。把conf->device_lock的结构内容挂接在mddev->queue->queue_lock。
5. 初始化私有数据区,包括:
5.1 使用MD信息对盘阵中的磁盘rdev赋值。
其中conf->mirrors为mirror_info类型的指针构成的数组的首地址。
根据conf->mirrors = kzalloc (sizeof(struct mirror_info) *mddev->raid_disks, GFP_KERNEL);可以看出,申请了raid_disks个mirror_info结构的空间,每个mirror_info结构可以对应到一个磁盘rdev。
5.2 关联MD和raid1私有数据区。即conf->raid_disks = mddev->raid_disks;和conf->mddev = mddev;
5.3 私有数据区的锁和队列的初始化。
6. 检查盘阵中磁盘状态,如果有磁盘不存在或者磁盘和盘阵中有磁盘不处于一致状态(In_sync),则处于降级状态。如果某个磁盘不是In_sync状态,该磁盘就需要全同步(conf->fullsync = 1)。
mddev->degraded就是管理raid下所有磁盘是否降级的“累计账本”,某磁盘降级则加1。
6.1 如果所有磁盘都不正常(都为降级状态),则启动失败。
6.2 如果只有一个盘可正常工作,则设置标志禁止同步。因为只有一个就没有可参照的同步磁盘,不存在同步说法。(mddev->recovery_cp = MaxSector;)
7. 找到第一个可用的磁盘记录在conf->last_used 中。(读均衡的时候会用到)
8. 注册守护进程。
9. 注册unplug回调。
10.注册拥塞处理函数。
如果说run有点构造函数的意思,那么stop函数就有析构函数的味道了。看看这个函数,都是所有的资源一一释放。stop是在md.c的do_md_stop中调用。
参考资料:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22311165&id=390818
本文来自fangpei的博客,转载请标明出处:http://www.cnblogs.com/fangpei/
Raid1源代码分析--初始化流程的更多相关文章
- Raid1源代码分析--写流程
正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...
- Raid1源代码分析--同步流程
同步的大流程是先读,后写.所以是分两个阶段,sync_request完成第一个阶段,sync_request_write完成第二个阶段.第一个阶段由MD发起(md_do_sync),第二个阶段由守护进 ...
- Raid1源代码分析--读流程(重新整理)
五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...
- Raid1源代码分析--读流程
这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...
- Raid1源代码分析--开篇总述
前段时间由于一些事情耽搁了,最近将raid1方面的各流程整理了一遍.网上和书上,能找到关于MD下的raid1的文档资料比较少.决定开始写一个系列的关于raid1的博客,之前写过的一篇读流程也会在之后加 ...
- struts2源码分析-初始化流程
这一篇文章主要是记录struts.xml的初始化,还原struts2.xml的初始化流程.源码依据struts2-2.3.16.3版本. struts2初始化入口,位于web.xml中: <fi ...
- Raid1源代码分析--Barrier机制
本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...
- Raid1源代码分析--一些补充
Raid1的源码的读.写.同步,在本系列博客中都已经分析完成.除了barrier机制要专门拿出来分析(下一篇会写)以外,有一些问题值得思考和注意,分析如下. 1.freeze_array是如何做的? ...
- MD中bitmap源代码分析--清除流程
bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...
随机推荐
- 自己写的Ext树,Ext3.4,静态全部加载
var load = function(){ /** * 书籍资料目录 */ var bookIT = new Ext.tree.TreeNode({ text:"IT", lea ...
- form表单提交之前推断
1.使用onsubmit方法 <form name="Form" action="t" method="post" onsubmit= ...
- [Angular 2] Filter items with a custom search Pipe in Angular 2
This lessons implements the Search Pipe with a new SearchBox component so you can search through eac ...
- Android NOtification 使用(震动 闪屏 铃声)
一. Notification 简介 在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以 ...
- Android设置里面默认存储器选项(default write disk)的实现
原生的Android设置里面没有默认存储器的选项,可是MTK偏偏加上了这个功能,可能MTK认为这个比較实用吧,所以,他们在原生的基础上面做了改动.加上了这个功能.可是高通平台没有这个功能.相对MTK来 ...
- Linux字符设备驱动file_operations
struct _file_operations struct _file_operations在Fs.h这个文件里面被定义的,如下所示: struct file_operations { struct ...
- display属性解析
none 此元素不会被显示 block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline-block 行内块元素.(C ...
- iis配置出现的问题及解决
唯一密钥属性“value”设置…无法添加类型为add 在配置IIS7.5时,会出现 在唯一密钥属性“value”设置为“default.aspx”(或者index.asp等)时,无法添加类型为“add ...
- visual studio插件 visual assistx
http://www.wholetomato.com/downloads/CheckForUpdate.asp?v=1925&e=&b=n&r=y&i=10&v ...
- php模块memcache和memcached区别分析
zm总结:尽量使用memcached就好了 1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcac ...