- 论坛徽章:
- 0
|
回复 241# iamlbccc
更换了那两个APIs还不够。由于req->buffer指向的仅是request的当前bio的数据内存,而该request下挂的所有bios的数据内存不一定连续。所以最好是挨个的处理request下的bios。附上更新后的simp_blkdev_do_request().
static void simp_blkdev_do_request(struct request_queue *q)
{
struct request *req;
while ((req = blk_fetch_request(q)) != NULL) {
if (((blk_rq_pos(req) << SECTOR_SIZE_SHIFT) + blk_rq_bytes(req))
> SIMP_BLKDEV_BYTES) {
printk(KERN_ERR SIMP_BLKDEV_DISKNAME
": bad request: block=%llu, count=%u\n",
(unsigned long long)blk_rq_pos(req),
blk_rq_sectors(req));
blk_end_request_cur(req, 0);
continue;
}
switch (rq_data_dir(req)) {
case READ:
do {
memcpy(req->buffer, simp_blkdev_data +
(blk_rq_pos(req) << SECTOR_SIZE_SHIFT),
blk_rq_cur_bytes(req));
} while (blk_end_request_cur(req, 0));
break;
case WRITE:
do {
/*
* NOTE: the data buffer for the whole request might not be contiguous,
* so we should better handle the bios one by one. The req->buffer just
* point to the current bio's data buffer.
*/
memcpy((char *)simp_blkdev_data +
(blk_rq_pos(req) << SECTOR_SIZE_SHIFT),
req->buffer, blk_rq_cur_bytes(req));
} while (blk_end_request_cur(req, 0));
break;
default:
printk(KERN_ERR "unknown requests\n");
/* No default because rq_data_dir(req) is 1 bit */
break;
}
}
} |
|