aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2016-02-26 23:40:52 +0800
committerJens Axboe <axboe@fb.com>2016-03-03 14:42:49 -0700
commit25e71a99f10e444cd00bb2ebccb11e1c9fb672b1 (patch)
tree70219779b021ec7cd2d32bc1091208a126fe0bec
parente0af29171aa8912e1ca95023b75ef336cd70d661 (diff)
downloadkvm-25e71a99f10e444cd00bb2ebccb11e1c9fb672b1.tar.gz
block: get the 1st and last bvec via helpers
This patch applies the two introduced helpers to figure out the 1st and last bvec, and fixes the original way after bio splitting. Cc: stable@vger.kernel.org Reported-by: Sagi Grimberg <sagig@dev.mellanox.co.il> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ming Lei <ming.lei@canonical.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--include/linux/blkdev.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index cd06a41581b321..d7f6bca707ef39 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1394,11 +1394,16 @@ static inline bool bvec_gap_to_prev(struct request_queue *q,
static inline bool bio_will_gap(struct request_queue *q, struct bio *prev,
struct bio *next)
{
- if (!bio_has_data(prev) || !queue_virt_boundary(q))
- return false;
+ if (bio_has_data(prev) && queue_virt_boundary(q)) {
+ struct bio_vec pb, nb;
+
+ bio_get_last_bvec(prev, &pb);
+ bio_get_first_bvec(next, &nb);
- return __bvec_gap_to_prev(q, &prev->bi_io_vec[prev->bi_vcnt - 1],
- next->bi_io_vec[0].bv_offset);
+ return __bvec_gap_to_prev(q, &pb, nb.bv_offset);
+ }
+
+ return false;
}
static inline bool req_gap_back_merge(struct request *req, struct bio *bio)