Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758163AbcDEL6a (ORCPT ); Tue, 5 Apr 2016 07:58:30 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:34381 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755803AbcDEL61 (ORCPT ); Tue, 5 Apr 2016 07:58:27 -0400 From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Boaz Harrosh , Ming Lei , Jan Kara , Kent Overstreet , Keith Busch , Tejun Heo , Mike Snitzer Subject: [PATCH 01/27] block: bio: introduce 4 helpers for cleanup Date: Tue, 5 Apr 2016 19:56:46 +0800 Message-Id: <1459857443-20611-2-git-send-email-tom.leiming@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459857443-20611-1-git-send-email-tom.leiming@gmail.com> References: <1459857443-20611-1-git-send-email-tom.leiming@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1797 Lines: 61 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. So this patches introduces 4 helpers for cleaning up this kind of usage. Both bio_pages() and bio_is_full() 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. Signed-off-by: Ming Lei --- include/linux/bio.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/linux/bio.h b/include/linux/bio.h index 88bc64f..2179bc4 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -310,6 +310,34 @@ static inline void bio_clear_flag(struct bio *bio, unsigned int bit) bio->bi_flags &= ~(1U << bit); } +static inline bool bio_is_full(struct bio *bio) +{ + WARN_ONCE(bio_flagged(bio, BIO_CLONED), "cloned bio"); + + return bio->bi_vcnt >= bio->bi_max_vecs; +} + +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