📄 raid1.c.txt
字号:
any problems, send mails to sindybear@163.com
相关文件
/include/linux/raid1.h
(1)
static int raid1_make_request (mddev_t *mddev, int rw,
struct buffer_head * bh)
/*
* 这个函数是raid1系统中的最为重要的一个函数,
*/
/*
* 首先分配一个raid1_bh结构,主要用来附着在相应的bh上。
*/
r1_bh = raid1_alloc_r1bh (conf);
r1_bh->master_bh = bh; //将源bh附着在raid1_bh结构中
r1_bh->mddev = mddev; //
r1_bh->cmd = rw;
if (rw == READ) {
/*
* 寻找一个镜象盘进行读操作
*/
mirror = conf->mirrors + raid1_read_balance(conf, bh);
bh_req = &r1_bh->bh_req;
memcpy(bh_req, bh, sizeof(*bh)); //将文件系统传来的bh的数据复制到新的bh中
…… //进行各种初始化
bh_req->b_end_io = raid1_end_request; //设置回调函数
bh_req->b_private = r1_bh; //将raid1_bh结构加入到这个bh中
generic_make_request (rw, bh_req); //进行读操作
return 0;
}
/*
* 以下是写操作的执行过程
*/
bhl = raid1_alloc_bh(conf, conf->raid_disks); //得到一个bh的链,有几个镜象盘就有几个bh
for (i = 0; i < disks; i++) {
struct buffer_head *mbh;
if (!conf->mirrors[i].operational) //如果镜象盘出故障,则对他什么都不错
continue;
/*
* 得到一个bh结构,并将这个bh从bhl链表中摘除
*/
mbh = bhl;
bhl = mbh->b_next;
mbh->b_next = NULL;
…… //设置结构
mbh->b_dev = conf->mirrors[i].dev; //设置给定镜象盘的设备号
…… //进行其它设置
mbh->b_end_io = raid1_end_request; //设置回调函数
mbh->b_private = r1_bh; //将raid1_bh结构加入到这个bh中
/*
* 将这个bh结构连接到raid1_bh结构中,并计数所有联入的bh
*/
mbh->b_next = r1_bh->mirror_bh_list;
r1_bh->mirror_bh_list = mbh;
sum_bhs++;
}
if (bhl) raid1_free_bh(conf,bhl); //如果bhl链表中还有空闲的bh,就释放
if (!sum_bhs) { //如果没有任何操作。
raid1_end_bh_io(r1_bh, 0); //说明盘都坏了,完成操作
return 0;
}
/*
* 将要进行I/O操作的bh的数目写入到r1_bh中,这个步骤十分重要,因为由于每一个mirror盘
* 都应该写完以后,整个系统才能够完成一次写操作,所以对于这些bh要有一个跟踪计数,
* 当每写完一个,计数在回调函数中就被减一,当减为0的时候,就是整个写操作完成的时候。
*/
md_atomic_set(&r1_bh->remaining, sum_bhs);
/*
* 将连接到raid1_bh结构中的所有的bh结构,一一取出来进行实际的操作
*/
bh = r1_bh->mirror_bh_list;
while(bh) {
struct buffer_head *bh2 = bh;
bh = bh->b_next;
generic_make_request(rw, bh2);
}
(2)
void raid1_end_request (struct buffer_head *bh, int uptodate)
struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_private); //从bh中取出raid1_bh结构
if ( (r1_bh->cmd == READ) || (r1_bh->cmd == READA) ) { //如果是读操作
raid1_end_bh_io(r1_bh, uptodate); //直接返回
}
/*
* 如果是写操作,就要减少raid1_bh中的remaining结构计数,
* 直到减少到0的时候,才说明这个raid1_bh所相关的一次raid1写操作都已经完成
* 可以执行实际的完成操作了
*/
if (atomic_dec_and_test(&r1_bh->remaining))
raid1_end_bh_io(r1_bh, test_bit(R1BH_Uptodate, &r1_bh->state));
(3)
static void raid1_end_bh_io (struct raid1_bh *r1_bh, int uptodate)
/*
* 这个函数调用的时候,必须是一个读操作或者一个写操作完全完成以后
*/
struct buffer_head *bh = r1_bh->master_bh; //从raid1_bh结构中将文件系统的bh取出来
io_request_done(bh->b_rsector, mddev_to_conf(r1_bh->mddev),
test_bit(R1BH_SyncPhase, &r1_bh->state));
bh->b_end_io(bh, uptodate); //将这个bh执行它的回调函数,完成操作
raid1_free_r1bh(r1_bh); //释放raid1_bh结构
(4)
static void inline io_request_done(unsigned long sector, raid1_conf_t *conf, int phase)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -