@@ -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);
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(+)