bio_endio - 如何获取磁盘扇区内容

问题描述 投票:0回答:1

当时我试图使用如下构造:

__my_bio_endio (struct bio *iob)
{
struct bvec_iter src_iter;
struct bio_vec src_bv;
sector_t sector = iob->bi_iter.bi_sector;
unsigned int len, segno = 0;

...

    $TRACE("%s %s BIO=%p (op=%#x), sector=%lu, .bi_vcnt=%u, .bi_status=%d",
           pref ? pref : "",
           bio_data_dir(iob) == WRITE ? "WRITE" : "READ", iob,
           bio_op(iob),
           sector, iob->bi_vcnt, iob->bi_status);


    bio_for_each_segment (src_bv, iob, src_iter)
        {
        $TRACE("%s bvec[segno=%3.3u]: page/len/offset : %p/%u/%u",
               pref ? pref : "",
               segno, src_bv.bv_page, src_bv.bv_len, src_bv.bv_offset);

        len = src_bv.bv_len;
        sector += len >> SECTOR_SHIFT;
        segno++;
        }

... }

READ Request args:

READ (op=0x0) BIO=000000004debb98a, .bi_sector=2048, .bi_vcnt=1

这只是我在以下所看到的:

READ BIO=000000004debb98a (op=0x0), sector=2056, .bi_vcnt=1, .bi_status=0

它期望在循环中我会看到(并在需要时修改)磁盘扇区已从磁盘卷读取 - 但没有。

那么,有人可以通过示例帮助我了解如何访问磁盘缓冲区内容吗?

linux-device-driver
1个回答
1
投票

它需要在向后端设备驱动程序提交BIO请求之前保存.bi_iter字段,并在__my_bio_endio()例程中恢复它。因此,在topic中描述了处理并发BIO的更多细节

© www.soinside.com 2019 - 2024. All rights reserved.