MD(四)进入syncd内部

这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。

 

 

看md_check_recovery中注册syncd的代码,就能知道syncd执行的动作就是函数md_do_sync。这个函数也不是省油的灯! 

 

首先来看这个函数中最前面的一个循环。这个循环的作用避免resync/recovery冲突。这里所谓“冲突”,我的理解就是同一个设备处于不同的MD中,这些MD同时做resync就会发生冲突。用一般的IDE硬盘举个例子来说,假如我们有三个硬盘hda,hdb和hdc,将他们分别创建两个分区,用hd[abc]1三个设备组建一个RAID-1,同时用hd[abc]2组建一个RAID-5,于是他们都需要做resync,他们各自的syncd都注册启动,但是只有一个能进行resync,另一个只能被delay。要避免这种冲突应该是出于resync效率的考虑,因为同一个hd上两个分离的区域同时做I/O并不是高效的做法。关于这个循环是如何完成这项避免冲突的任务的,我也不想多讨论,因为对于curr_resync的重用我也还没有完全理解,而且对于那两个指针来比较大小的做法我总觉得很奇怪,如果有谁花时间理解了这些内容,希望能跟我讲解讲解。在这个循环中最重要的无非就是match_mddev_units这个函数的调用,它能发现冲突的MD。 

 

在正式进行resync/recovery之前,先要确定有多少扇区要做resync/recovery。Resync与recovery需要的扇区数可能会不同,但通常来讲都是设备的物理大小。接着,就是对resync/recovery做初始化。首先,如果是resync,我们会将recovery_cp作为resync的起始扇区。接着,初始化一些时间戳变量,用作resync/recovery计算速度的数据。在resync/recov

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值