How do I create my own bio request to read a sector from the disk drive ?
如何创建自己的bio请求来从磁盘驱动器读取扇区?
I am trying the following but it freezes the system.
我正在尝试下面的方法,但是它冻结了系统。
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");
}
1 个解决方案
#1
6
It is old question, but anyway here is the code for reading, I hope it will help someone:
这是一个老问题,但不管怎样,这是阅读的代码,我希望它能帮助一些人:
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;
}
And for writing:
和写作:
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
can be allocated with alloc_page(GFP_KERNEL). Also for changing data in page
use page_address(page)
. It returns void*
so you can interpret that pointer as whatever you want.
可以使用alloc_page(GFP_KERNEL)分配页面。也可以使用page_address(页面)来更改页面中的数据。它返回void*,因此您可以将该指针解释为任何您想要的。
#1
6
It is old question, but anyway here is the code for reading, I hope it will help someone:
这是一个老问题,但不管怎样,这是阅读的代码,我希望它能帮助一些人:
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;
}
And for writing:
和写作:
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
can be allocated with alloc_page(GFP_KERNEL). Also for changing data in page
use page_address(page)
. It returns void*
so you can interpret that pointer as whatever you want.
可以使用alloc_page(GFP_KERNEL)分配页面。也可以使用page_address(页面)来更改页面中的数据。它返回void*,因此您可以将该指针解释为任何您想要的。