aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2017-12-18 07:22:06 -0500
committerJens Axboe <axboe@kernel.dk>2018-01-06 11:18:00 -0500
commit7891f05cbf4944a5436491d66de2be7533089aea (patch)
treed5451cbcc52554eeb545a148e0cd632ddec94438
parentc45a8f2def865e0d75b45618aef2963e15725cc4 (diff)
block: bounce: avoid direct access to bvec table
We will support multipage bvecs in the future, so change to iterator way for getting bv_page of bvec from original bio. Cc: Matthew Wilcox <willy@infradead.org> Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/bounce.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/block/bounce.c b/block/bounce.c
index fceb1a96480b..0274c31d6c05 100644
--- a/block/bounce.c
+++ b/block/bounce.c
@@ -137,21 +137,20 @@ static void copy_to_high_bio_irq(struct bio *to, struct bio *from)
137static void bounce_end_io(struct bio *bio, mempool_t *pool) 137static void bounce_end_io(struct bio *bio, mempool_t *pool)
138{ 138{
139 struct bio *bio_orig = bio->bi_private; 139 struct bio *bio_orig = bio->bi_private;
140 struct bio_vec *bvec, *org_vec; 140 struct bio_vec *bvec, orig_vec;
141 int i; 141 int i;
142 int start = bio_orig->bi_iter.bi_idx; 142 struct bvec_iter orig_iter = bio_orig->bi_iter;
143 143
144 /* 144 /*
145 * free up bounce indirect pages used 145 * free up bounce indirect pages used
146 */ 146 */
147 bio_for_each_segment_all(bvec, bio, i) { 147 bio_for_each_segment_all(bvec, bio, i) {
148 org_vec = bio_orig->bi_io_vec + i + start; 148 orig_vec = bio_iter_iovec(bio_orig, orig_iter);
149 149 if (bvec->bv_page != orig_vec.bv_page) {
150 if (bvec->bv_page == org_vec->bv_page) 150 dec_zone_page_state(bvec->bv_page, NR_BOUNCE);
151 continue; 151 mempool_free(bvec->bv_page, pool);
152 152 }
153 dec_zone_page_state(bvec->bv_page, NR_BOUNCE); 153 bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len);
154 mempool_free(bvec->bv_page, pool);
155 } 154 }
156 155
157 bio_orig->bi_status = bio->bi_status; 156 bio_orig->bi_status = bio->bi_status;