当时我试图使用如下构造:
__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
它期望在循环中我会看到(并在需要时修改)磁盘扇区已从磁盘卷读取 - 但没有。
那么,有人可以通过示例帮助我了解如何访问磁盘缓冲区内容吗?
它需要在向后端设备驱动程序提交BIO请求之前保存.bi_iter字段,并在__my_bio_endio()例程中恢复它。因此,在topic中描述了处理并发BIO的更多细节