当前位置: 技术问答>linux和unix
读generic_make_request函数时的一点疑问
来源: 互联网 发布时间:2016-02-26
本文导语: generic_make_request函数最后提交请求给驱动时是用下面的代码实现的: do { q = blk_get_queue(bh->b_rdev); if (!q) { printk(KERN_ERR ...
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 {
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的过程去处理它自己的堆栈。
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的过程去处理它自己的堆栈。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。