MD模块之处理读写过程分析-1

       md可以说是一个虚拟的设备驱动层,它属于块设备驱动,拥有块设备驱动的特点。所以,他实现了块设备操作接口

 

(对MD的大部分操作均是有md_ioctl接口来实现,少数部分也可由sys文件系统来实现)

       按我的理解,我可以把MD模块分为2个部分,一个是控制管理部分,另一个是raid级别实现部分。控制管理部分是一个大的框架,它控制各raid级别模块,他们之间的如何联系的呢?想必看过代码的人都知道了,就是md_k.h中定义的结构体struct mdk_personality,这个结构体中主要定义了一些函数操作集(就像io调度中elevator中定义的一样),这些函数分别由各个raid级别来实现,有些raid级别是不实现某些函数的,这个结构体内容如下:

 

       make_request:块设备处理请求函数。

       run:各raid模块启动函数,例如分配内存、建立线程等。

       stop:各raid模块停止函数,释放资源。

       status:/proc文件系统接口

       error_handler:处理读写发生错误的接口

       hot_add_disk:在重建过程中,将热备盘加到阵列中。

       hot_remove_disk:在重建过程中,移除失效盘接口

       spare_active:激活热备盘接口

       check_reshape:阵列扩展检查接口

       start_reshape:启动扩展接口

 

       这些函数是在raid模块加载时候注册的。

       说了这么多还没说到正题呢,呵呵。。。接下来就步入正题。Linxu中md设备是可以通过文件系统访问的,当创建一个MD设备时,用户态的读写请求通过文件系统发送到MD设备中。熟悉linxu内核的人知道,转发请求的函数就是generic_make_request,这个函数最终会调用队列的make_request_fn方法,如果发送到MD设备中,那么这个方法就由md层中的make_request函数来实现(在struct mdk_personality中定义,由各个raid模块来实现)。由于raid算法定义不同,make_request实现的方式也不同。本质上来说,md层的make_request就是把文件系统发送过来的bio根据各raid算法进行重新分发到各个磁盘上。而md层中的make_request函数最终还会调用generic_make_request来下发bio,如果这次下发的对象是具体的物理设备,make_request_fn方法就由系统的__make_request来实现,那么进入io调度层(我会在以后专门一节分析之)。

       这里我们以raid5为例,分析make_request是如何转发bio的。其他raid算法这里就不做介绍了。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值