读generic_make_request函数时的一点疑问
generic_make_request函数最后提交请求给驱动时是用下面的代码实现的:
do {
q = blk_get_queue(bh-> b_rdev);
if (!q) {
printk(KERN_ERR
"generic_make_request: Trying to access "
"nonexistent block-device %s (%ld)\n ",
kdevname(bh-> b_rdev), bh-> b_rsector);
buffer_IO_error(bh);
break;
}
} while (q-> make_request_fn(q, rw, bh));
}
------解决方案--------------------用了do while说明请求不是提交一次就可以了,算法上有这个需要,要联系上下文。
------解决方案--------------------859 /*
860 * Resolve the mapping until finished. (drivers are
861 * still free to implement/resolve their own stacking
862 * by explicitly returning 0)
863 */
这段注释说明了do while的必要性,这个块设备可能正在处理别的什么,导致一次的make_request_fn可能并没有成功,于是进行下一次的请求,直到成功,在这个过程中,如果blk_get_queue返回0,将会中止这个request的过程去处理它自己的堆栈。