generic_make_request()函数会接手一个已经基本初始化好的bio,并使用make_request_fn将请求置于驱动程序的请求队列上。即把该bio传给设备对应的驱动程序。参数bio中bi_dev和bi_sector都已经设定为要进行IO的对应的设备的具体地址。其中在make_request_fn(每个设备会对应一个请求队列(request_queue),该请求队列上会有对应的make_request_fn指针)函数调用后就不应该再对bio有所改动。
但是make_request可能会递归调用generic_make_request,但是对于内核态来说,栈空间是有限的。所以为了保证递归深度不能超过1,这块做了个聪明的处理。
首先看下面这段代码:
1808 if (current->bio_list) {
1809 bio_list_add(current->bio_list, bio);
1810 return;
1811 }
其中current->bio_list是记录了由make_request_fn提交的request组成的链表,一般情况下,如果是第一次调用generic_make_request,该current->bio_list为空的。所以这个if语句并不会执行。
接下来往下看

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



