linux内核md源代码解读 五 先容raidd5阵列的运行
1480行,新申请一个struct stripe_head。 1484行,关联struct r5conf。 1488行,grow_buffers,为每个struct r5dev申请一个page页用于stripe_head页拷贝和计算校验。页指针保存在sh->dev[].page指针中。 1494行,,设置struct stripe_head计数器,在1497行release_stripe中会递减。 1495行,递增阵列活跃条带数。 1496行,lru链表初始化。 1497行,释放struct stripe_head,添加到空闲条带空闲链表。release_stripe最终会调用到do_release_stripe,do_release_stripe里会执行到下面几行: 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 (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |