2

我正在编写这个块设备驱动程序。从日志中我可以看到该块收到的所有请求都已得到处理。下面是从队列中获取请求的代码:

   /* Gets the current request from the dispatch queue */
    while ((req = blk_fetch_request(q)) != NULL) {
        start_sector = blk_rq_pos(req);
        sector_cnt = blk_rq_sectors(req);
        dir = rq_data_dir(req);
        printk("Received a %s request starting at %d and length %d sectors!\n",
                (dir == READ ? "READ" : "WRITE"), start_sector, sector_cnt);
        kthread_run(request_handler_thread, req, "request_handler");
        //ret = rb_transfer(req);
    }

这是结束请求的代码:

int start_sector;
int sector_cnt;
int dir;
int error = req->errors ? -EIO : 0;
start_sector = blk_rq_pos(req);
sector_cnt = blk_rq_sectors(req);
dir = rq_data_dir(req);
printk("Ending a %s request starting at %d and length %d sectors!\n",
        (dir == READ ? "READ" : "WRITE"), start_sector, sector_cnt);
__blk_end_request_cur(req, error);

从日志消息中,我可以看到获取的块请求和结束的块请求之间存在一对一的匹配。但是,我可以看到该进程已挂起并cat /proc/diskstats报告待处理的请求。

4

0 回答 0