一个疑问

        今天在调试ext4文件系统的时候,突然发生了一件很诡异的事情,请见下图:

一个疑问_第1张图片

看出点什么了嘛?对,就是bio的地址,在submit_bio的时候地址尚是正常的,但调用generic_make_request()的时候,bio的地址就变成了0xffffffff,这是一个无效的地址,内核因此产生了panic。为什么呢?仔细调研了submit_bio,发现这个函数中并没有改变bio的地址啊?submit_bio的实现如下:

void submit_bio(int rw, struct bio *bio)
{
	//count 记录该bio 要读的扇区数目
	int count = bio_sectors(bio);

	bio->bi_rw |= rw;

	/*
	 * If it's a regular read/write or a barrier with data attached,
	 * go through the normal accounting stuff before submission.
	 */
	if (bio_has_data(bio) && !(rw & REQ_DISCARD)) {
		if (rw & WRITE) {
			count_vm_events(PGPGOUT, count);
		} else {
			task_io_account_read(bio->bi_size);
			count_vm_events(PGPGIN, count);
		}

		if (unlikely(block_dump)) {
			char b[BDEVNAME_SIZE];
			printk(KERN_DEBUG "%s(%d): %s block %Lu on %s\n",
			current->comm, task_pid_nr(current),
				(rw & WRITE) ? "WRITE" : "READ",
				(unsigned long long)bio->bi_sector,
				bdevname(bio->bi_bdev, b));
		}
	}

	generic_make_request(bio);
}
从上面的代码中,着实没有看出哪里会改变bio地址的地方,不知道有没有路过的大神帮我一解心中的疑惑~

你可能感兴趣的:(一个疑问)