Skip to the content.

Immutable biovecs and biovec iterators

Kent Overstreet kmo@daterainc.com

1. Introduction

自 3.13 起,biovecs 不应在提交 bio 后修改。 相反,我们有一个新的 struct bvec_iter ,它表示一个 biovec 的范围 - 迭代器将在 bio 完成时被修改,而不是 biovec 。

更具体地说,需要部分完成bio的旧代码将更新bi_sector和bi_size,并将bi_idx推进到下一个biovec。 如果它在 Biovec 中途结束,它将增加 bv_offset 并减少 bv_len 中完成的字节数。

在新的方案中,为了部分完成bio而必须改变的所有内容都被隔离到struct bvec_iter中:bi_sector、bi_size和bi_idx已移至那里; 并且struct bvec_iter没有修改bv_offset和bv_len,而是有bi_bvec_done,它表示当前bvec中完成的字节数。

有一堆新的辅助宏用于隐藏血淋淋的细节 - 特别是,呈现部分完成的 biovec 的错觉,以便正常代码不必处理 bi_bvec_done。

从 5.12 开始,不支持 bv_len 为零的 bvec 段。

2. What’s all this get us?

拥有真正的迭代器并使 biovecs 不可变具有许多优点:

3. Other implications

4. Usage of helpers

bio_for_each_segment_all()
bio_for_each_bvec_all()
bio_first_bvec_all()
bio_first_page_all()
bio_first_folio_all()
bio_last_bvec_all()
bio_for_each_segment()
bio_for_each_segment_all()
bio_for_each_bvec()
bio_for_each_bvec_all()
rq_for_each_bvec()