日期:2014-05-16  浏览次数:20666 次

读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的过程去处理它自己的堆栈。