Comment lire un secteur en utilisant une requête bio dans le kernel Linux

Comment créer ma propre requête bio pour lire un secteur à partir du lecteur de disque?

J’essaie ce qui suit mais ça gèle le système.

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"); } 

C’est une vieille question, mais de toute façon, voici le code de lecture, j’espère que cela aidera quelqu’un:

 int readPage(struct block_device *device, sector_t sector, int size, struct page *page) { int ret; struct completion event; struct bio *bio = bio_alloc(GFP_NOIO, 1); bio->bi_bdev = device; bio->bi_sector = sector; bio_add_page(bio, page, size, 0); init_completion(&event); bio->bi_private = &event; bio->bi_end_io = readComplete; submit_bio(READ | REQ_SYNC, bio); wait_for_completion(&event); ret = test_bit(BIO_UPTODATE, &bio->bi_flags); bio_put(bio); return ret; } 

Et pour écrire:

 void writePage(struct block_device *device, sector_t sector, int size, struct page *page) { struct bio *bio = bio_alloc(GFP_NOIO, 1); bio->bi_bdev = vnode->blkDevice; bio->bi_sector = sector; bio_add_page(bio, page, size, 0); bio->bi_end_io = writeComplete; submit_bio(WRITE_FLUSH_FUA, bio); } 

page peut être allouée avec alloc_page (GFP_KERNEL). Pour modifier les données de la page utilisez également page_address(page) . Il renvoie void* afin que vous puissiez interpréter ce pointeur comme vous voulez.