5

Linuxカーネルとmake_requestルーチンでカスタムブロックドライバーを作成しています。書き込み時に、新しいデータを書き込む前に、バイオの指定されたセクターのデータを(物理ドライブから)読み取る必要があります。以下の抜粋は、私が達成しようとしていることのほとんどを示していますが、何らかの理由で、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