当时我尝试使用以下构造:
A.exe
...
__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 (op=0x0) BIO=000000004debb98a, .bi_sector=2048, .bi_vcnt=1
它期望在循环中,我将看到(并根据需要进行修改)已从磁盘卷中读取磁盘扇区-但什么都没有。
因此,有人可以帮助我了解如何通过示例访问磁盘缓冲区内容吗?
答案 0 :(得分:1)
在向后端设备驱动程序提交BIO请求之前,它需要保存.bi_iter字段,并在__my_bio_endio()例程中将其还原。 因此,topic
中描述了处理并发BIO的更多细节。