初始化流程代码量比较少,也比较简单。主要是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. JS点击按钮弹出窗口

    由于没有系统学习过JS,遇到一个需求:点击按钮,弹出一个独立的窗口. 在网上百度了一下,并没有找到满意的结果,最重要的是各种方法很复杂.最终,仔细研究了一下,原来只是需要只要一个简单的函数就能满足自己 ...

  2. jquery1.7.2的源码分析(五)$.support

    $.support 的英文注释很详细的介绍的这里,就稍微的写了下 Query.support = (function() { var support, all, a, select, opt, inp ...

  3. lesson3:使用java代码的方式对不能识别的协议进行压力测试

    在我们的实际环境中,我们所使用的协议肯定不只是http的方式,对于rpc等调用协议,目前jmeter没有相应的sampler支持,这时就需要通过引入我们自己写的jar包的方式来解决这个问题.例如:当我 ...

  4. Nuget找不到服务器

    Nuget的新地址 http://nuget-prod-v2gallery.trafficmanager.net/api/v2/

  5. Python进阶之路---1.5python数据类型-字符串

    字符串 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...

  6. mac os 10.10下安装android studio问题:android studio was unable to find a valid jvm

    友情提示:小编在做到这一步前,已经确定jdk和环境变量已经安装并配置无误,关于怎么检查java环境变量请自行百度. 原因分析:android studio安装包下的info.plist配置文件中有个关 ...

  7. NodeJs获取不到POST参数

    NodeJs报错,从网页端获取不到POST参数,提示错误类似如下 TypeError: Cannot read property 'username' of undefined     at C:\U ...

  8. 难搞的Android开发环境(sdk 代理)

    概述 搞了近一周的环境搭建,在csdn上提个问,有位网友说弄一下代理,搜一下,果真有人写博客:Android SDK代理服务器解决国内不能更新下载问题 其实我下了很多个集成好的 adt-bundle- ...

  9. RAC RMAN备份

    这篇主要介绍的是RAC 环境下的RMAN 备份. 关于Oracle 备份与恢复的一些理论知识参考我的Blog:       Oracle 备份 与 恢复 概述 http://blog.csdn.net ...

  10. 服务器端操作Cookie[2]

    服务器端操作Cookie,主要注意会使用以下三个类: HttpCookie,HttpResponse,HttpRequest 关于HttpCookie: 属性 描述 例子 Domain 获取或设置与此 ...