From: Ming Lei <tom.leiming@gmail.com>
To: Jens Axboe <axboe@fb.com>, linux-kernel@vger.kernel.org
Cc: linux-block@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>,
Boaz Harrosh <boaz@plexistor.com>,
Ming Lei <tom.leiming@gmail.com>, Jan Kara <jack@suse.cz>,
Kent Overstreet <kent.overstreet@gmail.com>,
Keith Busch <keith.busch@intel.com>, Tejun Heo <tj@kernel.org>,
Mike Snitzer <snitzer@redhat.com>
Subject: [PATCH 01/27] block: bio: introduce 4 helpers for cleanup
Date: Tue, 5 Apr 2016 19:56:46 +0800 [thread overview]
Message-ID: <1459857443-20611-2-git-send-email-tom.leiming@gmail.com> (raw)
In-Reply-To: <1459857443-20611-1-git-send-email-tom.leiming@gmail.com>
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 <tom.leiming@gmail.com>
---
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
next prev parent reply other threads:[~2016-04-05 11:58 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-05 11:56 [PATCH 00/27] block: cleanup direct access on .bi_vcnt & .bi_io_vec Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` [Drbd-dev] " Ming Lei
2016-04-05 11:56 ` [lustre-devel] " Ming Lei
2016-04-05 11:56 ` Ming Lei [this message]
2016-04-06 0:18 ` [PATCH 01/27] block: bio: introduce 4 helpers for cleanup Kent Overstreet
2016-04-06 1:34 ` Ming Lei
2016-04-06 1:46 ` Kent Overstreet
2016-04-06 2:11 ` Ming Lei
2016-04-06 2:21 ` Kent Overstreet
2016-04-06 4:11 ` Ming Lei
2016-04-05 11:56 ` [Drbd-dev] [PATCH 02/27] block: drbd: use bio_get_base_vec() to retrieve the 1st bvec Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` [Drbd-dev] [PATCH 03/27] block: drbd: remove impossible failure handling Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 12:42 ` [Drbd-dev] " Lars Ellenberg
2016-04-05 12:42 ` Lars Ellenberg
2016-04-05 11:56 ` [PATCH 04/27] block: loop: use bio_get_base_vec() to retrive bvec table Ming Lei
2016-04-05 11:56 ` [PATCH 05/27] block: pktcdvd: " Ming Lei
2016-04-05 11:56 ` [PATCH 06/27] block: floppy: use bio_set_vec_table() Ming Lei
2016-04-05 13:00 ` Christoph Hellwig
2016-04-05 11:56 ` [PATCH 07/27] block: floppy: use bio_add_page() Ming Lei
2016-04-05 11:56 ` [lustre-devel] [PATCH 08/27] staging: lustre: avoid to use bio->bi_vcnt directly Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 12:59 ` [lustre-devel] " Greg Kroah-Hartman
2016-04-05 12:59 ` Greg Kroah-Hartman
2016-04-05 13:01 ` [lustre-devel] " Christoph Hellwig
2016-04-05 13:01 ` Christoph Hellwig
2016-04-10 14:37 ` [lustre-devel] " James Simmons
2016-04-10 14:37 ` James Simmons
2016-04-10 14:41 ` [lustre-devel] " Christoph Hellwig
2016-04-10 14:41 ` Christoph Hellwig
2016-04-10 16:02 ` [lustre-devel] " James Simmons
2016-04-10 16:02 ` James Simmons
2016-04-11 3:30 ` [lustre-devel] " Ming Lei
2016-04-11 3:30 ` Ming Lei
2016-04-05 11:56 ` [PATCH 09/27] target: use bio_is_full() Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 13:02 ` Christoph Hellwig
2016-04-07 4:07 ` Ming Lei
2016-04-05 11:56 ` [PATCH 10/27] bcache: debug: avoid to access .bi_io_vec directly Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` [PATCH 11/27] bcache: io.c: use bio_set_vec_table Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 12:49 ` Christoph Hellwig
2016-04-05 15:24 ` Ming Lei
2016-04-05 17:31 ` Christoph Hellwig
2016-04-06 0:35 ` Kent Overstreet
2016-04-05 11:56 ` [PATCH 12/27] bcache: journal.c: use bio_set_vec_table() Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` [PATCH 13/27] bcache: movinggc: " Ming Lei
2016-04-05 11:56 ` Ming Lei
2016-04-05 11:56 ` [PATCH 14/27] bcache: writeback: " Ming Lei
2016-04-05 11:56 ` Ming Lei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1459857443-20611-2-git-send-email-tom.leiming@gmail.com \
--to=tom.leiming@gmail.com \
--cc=axboe@fb.com \
--cc=boaz@plexistor.com \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=keith.busch@intel.com \
--cc=kent.overstreet@gmail.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=snitzer@redhat.com \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.