初始化流程代码量比较少,也比较简单。主要是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源代码分析--初始化流程的更多相关文章

  1. Raid1源代码分析--写流程

    正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...

  2. Raid1源代码分析--同步流程

    同步的大流程是先读,后写.所以是分两个阶段,sync_request完成第一个阶段,sync_request_write完成第二个阶段.第一个阶段由MD发起(md_do_sync),第二个阶段由守护进 ...

  3. Raid1源代码分析--读流程(重新整理)

    五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...

  4. Raid1源代码分析--读流程

    这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...

  5. Raid1源代码分析--开篇总述

    前段时间由于一些事情耽搁了,最近将raid1方面的各流程整理了一遍.网上和书上,能找到关于MD下的raid1的文档资料比较少.决定开始写一个系列的关于raid1的博客,之前写过的一篇读流程也会在之后加 ...

  6. struts2源码分析-初始化流程

    这一篇文章主要是记录struts.xml的初始化,还原struts2.xml的初始化流程.源码依据struts2-2.3.16.3版本. struts2初始化入口,位于web.xml中: <fi ...

  7. Raid1源代码分析--Barrier机制

    本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...

  8. Raid1源代码分析--一些补充

    Raid1的源码的读.写.同步,在本系列博客中都已经分析完成.除了barrier机制要专门拿出来分析(下一篇会写)以外,有一些问题值得思考和注意,分析如下. 1.freeze_array是如何做的? ...

  9. MD中bitmap源代码分析--清除流程

    bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...

随机推荐

  1. @property属性关键字

    关于@property属性关键字使用注意:* weak(assign) :  代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 ...

  2. UVA10534-----Wavio Sequence-----动态规划之LIS

    题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)

    今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...

  4. Android获取屏幕分辨率及DisplayMetrics简介

    Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题. 手机的分辨率信息是手机的一项重要信息,很好的是,Android ...

  5. Excel01-不同的单元格输入同一数据

    第一步:按住Ctrl键,选择不同的单元格 第二步:选择完最后一个单元格后,输入需要的数据“YES”,按Ctrl+Enter键结束. 提示:按Ctrl+; 输入当前日期,再按ctrl+Enter实现全部 ...

  6. TimeSpinner( 时间微调) 组件

    本节课重点了解 EasyUI 中 Spinner(微调)组件的使用方法,这个组件依赖于Spinner(微调)组件. 一. 加载方式//class 加载方式<input id="box& ...

  7. C#,.net获取字符串中指定字符串的个数、所在位置与替换字符串

    方法一: public static int indexOf (字符串/字符,int从第几位开始,int共查几位) string tests = "1absjjkcbfka2rsbcfak2 ...

  8. 使用OpenXml实现生成数据字典文档(beta)

    最近项目在走验收流程,之前没有仔细看SOW文档,发现需要补好多份文档,其中就有数据字典,项目组不愿意花时间太多的时间弄这些文档,也不希望以后还要重复劳动力,最终决定做一个工具,方便自己生成数据字典文档 ...

  9. javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

    今天遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: <script type="text/jav ...

  10. checkbox的问题整理

    之前做过一些checkbox的小功能,由于水平有限总是在这一部分花费一些时间,趁现在时间充裕些,整理出来. checkbox是否被选中的判断 第一种: $(this).is(":checke ...