Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96193
  • 博文数量: 26
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-10 15:51
文章分类

全部博文(26)

文章存档

2011年(1)

2009年(25)

我的朋友

分类: LINUX

2009-08-14 09:16:20

磁阵的用户访问请求处理函数,完成如下操作:

1.      调用md_write_start,(如果是读操作,)等待磁阵的元数据(超级块)更新完成。

2.      如果访问要求设置屏障,而设备不支持设置屏障,则立即返回。

3.      等待设备上的屏障消除。

4.      统计

5.      申请一个raidbio,该bio中有一个数组,数组中的元素是对应各磁盘的bio。该结构下文称为raid-bio

6.      如果是读请求,则调用读均衡算法获取一个读目标,将读请求复制到该目标盘中,递交给磁盘。

7.      如果是写请求,则:

a)       对于磁阵中所有可用的盘,将raid-bio的数组中的元素指向用户bio。此时也顺便检查了磁阵中磁盘情况,如果磁阵有磁盘损坏,则设置磁阵为降级状态。

b)       如果设置了延迟写,需要将用户bio中的数据另外拷贝一份保存。

c)       根据用户bio中的标志,确定是否设置raid-bio中的barrie标志。(如果下挂的磁盘不支持barrier操作,则会返回不支持EOPNOTSUPP,在raid1_end_write_request中加以处理,具体的处理就是在守护进程中重试)

d)       对每一个磁盘,克隆一份用户bioraid-bio数组对应元素中,并设置相关字段(bi_end_io等)。如果是延迟写,则raid-bio中的数组元素的bvec指向保存的延迟写拷贝,而不是用户bio中的pages

e)       调用bitmap_startwrite,通知bitmap进行写数据块对应的设置。

f)        raid-bio数组挂到设备的pending_bio_list队列中,拔出(blk_plug_device)设备(此时拔出设备似乎没有什么意思,因为MD设备用不到调度算法)。

g)       激活守护进程。

阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~