Wie erstelle ich meine eigene Bio-Anfrage, um einen Sektor aus dem Laufwerk zu lesen?Wie liest man einen Sektor mit einer Bio-Anfrage im Linux-Kernel
Ich versuche Folgendes, aber es friert das System ein.
static void read_bio()
{
struct bio *b;
struct page *p;
b = bio_alloc(GFP_KERNEL, 1);
if (!b) {
printk(KERN_INFO "bio allocation failed\n");
}
bio_init(b);
b->bi_sector = 10000;
b->bi_bdev = bd; /* "/dev/sda1" */
b->bi_end_io = bio_end_clone;
p = alloc_page(GFP_KERNEL);
if (!p) {
printk(KERN_INFO "page allocation failed\n");
}
bio_add_page(b, p, PAGE_SIZE, 0);
b->bi_private = p;
bio_get(b);
submit_bio(READ, b);
printk(KERN_DEBUG "submit read request\n");
}
Ich versuchte mit sb_bread(), die viel besser funktioniert. Aber immer noch blockiert es innerhalb der Treiberanforderungsfunktion. (Ich vermute es wegen einer Sperre). Was ich versuche zu erreichen, ist, dass ich den Block lesen möchte, bevor ein Schreibvorgang für diesen Block stattfindet. Ich bearbeite dies, indem ich das make_request_fn des Blockgeräts ersetze. –