Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754680AbcDNMDR (ORCPT ); Thu, 14 Apr 2016 08:03:17 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:34049 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754475AbcDNMDN (ORCPT ); Thu, 14 Apr 2016 08:03:13 -0400 From: Ming Lei To: Jens Axboe , linux-kernel@vger.kernel.org Cc: linux-block@vger.kernel.org, Christoph Hellwig , Ming Lei , Jan Kara , Keith Busch , Kent Overstreet , "Kirill A. Shutemov" , Mike Snitzer Subject: [PATCH v1 01/27] block: bio: introduce 3 helpers for cleanup Date: Thu, 14 Apr 2016 20:02:19 +0800 Message-Id: <1460635375-28282-2-git-send-email-tom.leiming@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460635375-28282-1-git-send-email-tom.leiming@gmail.com> References: <1460635375-28282-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: 1807 Lines: 56 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 --- 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