linux内核奇遇记之md源代码解读之五
linux内核奇遇记之md源代码解读之五转载请注明出处:http://blog.csdn.net/liumangxiong
如果看懂了raid1阵列的run函数,那么看raid5阵列run就非常轻松了,因为两者要做的事情都是大同小异。raid5的run函数很长,但很大一部分跟创建运行是没有关系的,特别是有一段跟reshape相关的,大多数系统都不关注该功能,因此可以直接跳过。经过删减之后的run函数如下:
228 list_add_tail(&sh->lru, &conf->inactive_list);229 wake_up(&conf->wait_for_stripe);230 if (conf->retry_read_aligned)231 md_wakeup_thread(conf->mddev->thread);228行,添加struct stripe_head到inactive_list,即条带空闲链表。229行,唤醒等待空闲条带的请求,因为每个阵列的struct stripe_head资源是有限的,申请不到时就在等待队列上等候。231行,唤醒条块读请求。继续返回到setup_conf函数中,这里已经通过grow_stripes为阵列申请了NR_STRIPES个struct stripe_head。5262行,创建raid5主线程。这样setup_conf函数也结束了,继续返回到run函数中。5434-5437行,conf和mddev的关联和赋值。5494-5556行,mddev相关域的赋值。5558行,mddev请求队列struct queue_limits设置等等初始化。小结一下,raid5的run函数同raid1基本作用是一样的,都是向上虚拟一个块设备,向下包装磁盘,建立读写请求的通道。区别在于raid5的读写是以struct stripe_head为基础的,而在raid5的读写中也是围绕着struct stripe_head展开的。下一小节介绍raid10阵列的运行。转载请注明出处:http://blog.csdn.net/liumangxiong