Linux kernel 等待\u完成提交\u bio,使\u请求不返回

Linux kernel 等待\u完成提交\u bio,使\u请求不返回,linux-kernel,kernel,linux-device-driver,device-driver,block-device,Linux Kernel,Kernel,Linux Device Driver,Device Driver,Block Device,我正在Linux内核和make_请求例程中编写一个自定义块驱动程序,在写入时,我需要在写入新数据之前读取bio指定扇区的数据(从物理驱动器)。我下面的摘录展示了我试图完成的大部分工作,但无论出于何种原因,我从未从等待完成中得到回报。一旦对块设备执行I/O。它会在提交简历后挂起,并且永远不会继续。每隔120秒,我就会收到一个堆栈转储和消息,说明任务是如何被阻止的。有什么想法吗?想法 ... in make_request .... if(rw != READ){ struct compl

我正在Linux内核和make_请求例程中编写一个自定义块驱动程序,在写入时,我需要在写入新数据之前读取bio指定扇区的数据(从物理驱动器)。我下面的摘录展示了我试图完成的大部分工作,但无论出于何种原因,我从未从等待完成中得到回报。一旦对块设备执行I/O。它会在提交简历后挂起,并且永远不会继续。每隔120秒,我就会收到一个堆栈转储和消息,说明任务是如何被阻止的。有什么想法吗?想法

... in make_request ....

if(rw != READ){
    struct completion event;
    struct bio *biow = bio_alloc(GFP_NOIO, bio_segments(bio));
    biow->bi_bdev = bio->bi_bdev;
    biow->bi_sector = bio->sector;
    biow->bi_rw = READ_SYNC;
    biow->bi_vcnt = bio_segments(bio);
    biow->bi_size = bio->bi_size;
    init_completion(&event);
    biow->bi_private = &event;
    biow->bi_end_io = bi_complete;
    submit_bio(READ_SYNC, biow);
    wait_for_completion(&event);
    .... some more magic occurs here ....
}
generic_make_request(bio);


代码的哪一部分负责调用该事件的
complete()
或类似内容?这部分代码是在什么条件下执行的?@Eugene,bi_complete例程设置为biow->bi_end_io。正是这个函数调用了complete()<代码>静态void bi_complete(struct bio*bio,int error){complete((struct completion*)bio->bi_private)}与内核的MD代码中的相同。哦,条件是什么?写。在我的请求中。我想先读取硬盘上的旧数据,然后再将新数据写入硬盘。所以它应该在所有写请求上执行。这个问题解决了吗?这个问题在我看来很有趣。