【问题标题】:How to read a sector using a bio request in Linux kernel如何在 Linux 内核中使用 bio 请求读取扇区
【发布时间】: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 来处理这个问题。

标签: linux kernel driver


【解决方案1】:

这是一个老问题,但无论如何这里是阅读代码,我希望它对某人有所帮助:

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

对于写作:

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 = device;
    bio->bi_sector = sector;
    bio_add_page(bio, page, size, 0);
    bio->bi_end_io = writeComplete;
    submit_bio(WRITE_FLUSH_FUA, bio);
}

page 可以用 alloc_page(GFP_KERNEL) 分配。也可以使用page_address(page) 更改page 中的数据。它返回void*,因此您可以将该指针解释为您想要的任何内容。

【讨论】:

    猜你喜欢
    • 2015-11-04
    • 2015-02-05
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多