⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 raid1.c.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 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 + -