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