[PATCH v1 01/27] block: bio: introduce 3 helpers for cleanup

Ming Lei
2016-04-14T12:03:17Z

Some drivers access bio->bi_vcnt and bio->bi_io_vec directly.
Firstly it isn't a good practice. Secondly it may cause trouble
for converting to multipage bvecs because currently drivers may
suppose one bvec always include one page, and use the two fields
to figure out how to handle pages.

So this patches introduces 3 helpers for cleaning up this kind
of usage.

bio_pages() can be convertd to support multipage bvecs easily.

For bio_get_base_vec() and bio_set_vec_table(), they are often
used during initializing a new bio or in case of single bvec
bio. With the two new helpers, it becomes easy to audit access
of .bi_io_vec and .bi_vcnt and check if this kind of use is good
for supporting multipage bvecs.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
include/linux/bio.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)

diff --git a/include/linux/bio.h b/include/linux/bio.h
index 6b7481f..2229006d 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -310,6 +310,27 @@ static inline void bio_clear_flag(struct bio *bio, unsigned int bit)
bio->bi_flags &= ~(1U << bit);
}

+static inline struct bio_vec *bio_get_base_vec(struct bio *bio)
+{
+ return __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);
+}
+
+/* This helper should be used for setting bvec table on a new bio */
+static inline void bio_set_vec_table(struct bio *bio, struct bio_vec *table,
+ unsigned max_vecs)
+{
+ bio->bi_io_vec = table;
+ bio->bi_max_vecs = max_vecs;
+}
+
+/* For singlepage bvecs, one segment includes one page */
+static inline unsigned bio_pages(struct bio *bio)
+{
+ if (!bio_flagged(bio, BIO_CLONED))
+ return bio->bi_vcnt;
+ return bio_segments(bio);
+}
+
static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv)
{
*bv = bio_iovec(bio);
--
1.9.1