分类: LINUX
2009-08-14 09:16:20
磁阵的用户访问请求处理函数,完成如下操作:
1. 调用md_write_start,(如果是读操作,)等待磁阵的元数据(超级块)更新完成。
2. 如果访问要求设置屏障,而设备不支持设置屏障,则立即返回。
3. 等待设备上的屏障消除。
4. 统计
5. 申请一个raid的bio,该bio中有一个数组,数组中的元素是对应各磁盘的bio。该结构下文称为raid-bio
6. 如果是读请求,则调用读均衡算法获取一个读目标,将读请求复制到该目标盘中,递交给磁盘。
7. 如果是写请求,则:
a) 对于磁阵中所有可用的盘,将raid-bio的数组中的元素指向用户bio。此时也顺便检查了磁阵中磁盘情况,如果磁阵有磁盘损坏,则设置磁阵为降级状态。
b) 如果设置了延迟写,需要将用户bio中的数据另外拷贝一份保存。
c) 根据用户bio中的标志,确定是否设置raid-bio中的barrie标志。(如果下挂的磁盘不支持barrier操作,则会返回不支持EOPNOTSUPP,在raid1_end_write_request中加以处理,具体的处理就是在守护进程中重试)
d) 对每一个磁盘,克隆一份用户bio到raid-bio数组对应元素中,并设置相关字段(bi_end_io等)。如果是延迟写,则raid-bio中的数组元素的bvec指向保存的延迟写拷贝,而不是用户bio中的pages。
e) 调用bitmap_startwrite,通知bitmap进行写数据块对应的设置。
f) 将raid-bio数组挂到设备的pending_bio_list队列中,拔出(blk_plug_device)设备(此时拔出设备似乎没有什么意思,因为MD设备用不到调度算法)。
g) 激活守护进程。