【发布时间】:2012-09-25 02:02:30
【问题描述】:
如何创建自己的生物请求以从磁盘驱动器读取扇区?
我正在尝试以下操作,但它会冻结系统。
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");
}
【问题讨论】:
-
我尝试使用 sb_bread() 效果更好。但它仍然在驱动程序自定义请求函数中阻塞。 (我猜是因为一些锁)。我想要实现的是我想在该块发生写入之前读取该块,我通过替换块设备的 make_request_fn 来处理这个问题。