5

我正在 Linux 内核和 make_request 例程中编写自定义块驱动程序,在写入新数据之前,我需要读取 bio 指定扇区的数据(从物理驱动器)。我下面的摘录展示了我想要完成的大部分工作,但无论出于何种原因,我从未从 wait_for_completion 中得到回报。一旦对块设备执行 I/O。它在 submit_bio 之后挂起并且永远不会继续。每 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);

4

0 回答 0