error: implicit declaration of function ‘elv_next_request’
在Linux 2.3.36上编译2.6.18以前驱动程序发现“error: implicit declaration of function ‘elv_next_request’”
因为,从linux-2.6.31开始elv_next_request就消失了
因此,在改版本的内核上用blk_fetch_request代替elv_next_request函数。
以前,获取I/O请求队列中下一个请求的函数是:
struct request *elv_next_request(struct request_queue *queue);
这个函数返回经过I/O调度器优化过后的下一个请求。但是这个函数有一个特点,它会把这个请求保留在请求队列中,这样的话,如果两个elv_next_request()在非常短的时间间隔内被执行,函数就会返回同一个请求。当然,我们可以用blkdev_dequeue_request()来把一个请求从请求队列中移除,但是完全没必要这么做,因为一旦块设备驱动通知内核这个请求被完成了,内核同样会把这个请求从请求队列中移除。
把请求保留在请求队列中是以前的一个做法,那时候,内核每次只能处理一个请求————比如每次只操作一个扇区。这样做有一个缺点:就像上面讲的那样,内核不知道一个请求何时真正开始被处理,也就没有办法操作一些对处理时间有要求的请求。
况且,现在的处理器足够强大,使得内核能够同时处理多个请求,同时,也要求设备驱动要亲自移除这些请求并对它们保持追踪。所以,这种 process-on-queue模型要被抛弃,Tejun更改了代码,引入了新方法,具体可以查看:
新方法的想法就是在原来驱动的基础上增加“把请求从请求队列中移除”这么一个功能,也就是在合适的地方增加 blkdev_dequeue_request() 这么一个函数,有些地方的修改(比如IDE子系统)没有这么简单,但是大多数地方都是这样修改的。
更改之后,块设备驱动的一些旧的API随之就发生改动:函数elv_next_request(); 不再存在,替代它的是
struct request *blk_peek_request(struct request_queue *queue);
这个函数同样不移除请求,移除请求的函数是: