这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。
前面几篇林林总总,从RAID-5原理,到错误,失效处理,主要还是围绕数据处理的方方面面来说的,但是RAID-5要能正常使用,没有一些控制函数的辅助是不可能的。我所说的这些控制函数可以在raid5.c快要结束的地方,在raid5_personality这个结构中找到他们的名字。
raid5_personality中的函数,除了make_request直接作用在数据路径中以外,其它的都是通过MD的控制函数间接调用的。关于MD中的控制函数跟RAID-5相比,繁复程度有过之而无不及,但因为没有特殊的算法,也就没有什么特殊的原理,主要是看它的处理过程。但是MD并不是我在RAID-5中的讨论的重点,只是为了理解RAID-5特定的控制函数而提及相关的内容。
其实raid5_personality中的函数可以用面向对象中的重载函数来理解,正如我们在一开始提到MD说的那样,这是RAID-5对MD父类方法的重载。废话少说,其中make_request和sync_request都已经谈过,不必重复,就从没说过的开始。
首先是run,顾名思义,很简单这就是在RAID-5开始运行时调用,进行一些初始化的操作,主要是对RAID-5中的conf进行初始化,这里面的代码也有点搞来搞去,但是只要明白了RAID-5的数据结构,那所有的代码就一目了然了。run函数在md.c的do_md_run中被调用。
如果说run有点构造函数的意思,那么stop函数就有析构函数的味道了。看看这个函数,不是unregister就是shrink,kfree,都是所有的资源一一释放。stop是在md.c的do_md_stop中调用。
下一个就是status函数,这是在md_seq_show中调用,这是个在/proc文件系统中使用的函数、我们通过”cat /proc/mdstat”命令行得到的信息就是通过md_seq_show显示的。其中RAID-5的信息则是由md_seq_show调用status函数来显示,这要是显示设备状态和resync或recovery状态。
error函数我们在讨论错误处理的时候已经提过。
raid5_add_disk函数是将一个rdev放入RAID-5的disk数组中。这里比较容易让人误会的是,以为这是被md.c中hot_add_disk函数调用的,我最初就是这样想当然的,但事实并非如此,这个函数真正被调用时在md_check_recovery中,而MD的hot_add_disk目的是将rdev加入到md设备,而事实上还没有加入到RAID-5中。所以,我们常将md的hot_add_disk称为为外部hot_add,而personality中hot_add_disk称为内部hot_add。
与raid5_add_disk相反,raid5_remove_disk则是从RAID-5的disk数组中将rdev踢出去。同样道理,它也不是在md的hot_remove_disk被调用,而是在md_check_recovery中被调用。但是要知道md的hot_remove_disk要想成功,前提是raid5_remove_disk已经调用成功。
raid5_spare_active函数也是在md_check_recovery中被调用,作用就是将完成了recovery的spare的rdev激活,告知RAID-5这个rdev数据已经恢复完成可以正常工作了,同时修改md的一些统计数据。
raid5_resize,这个函数应该一目了然,那就是调整RAID-5的大小。
最后一个是raid5_quiesce,这是个给外部调用来禁止或启动写操作的函数,这在某些情况下是个很重要的特性。
终于写完了。然而RAID-5只是MD的一个组成部分,要想知道RAID是怎么工作的,还是得了解MD的一些内容,接下去谈谈md.c的阅读理解。