diff options
author | Ming Lei <ming.lei@redhat.com> | 2017-12-18 07:22:06 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-01-06 11:18:00 -0500 |
commit | 7891f05cbf4944a5436491d66de2be7533089aea (patch) | |
tree | d5451cbcc52554eeb545a148e0cd632ddec94438 | |
parent | c45a8f2def865e0d75b45618aef2963e15725cc4 (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.c | 17 |
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) | |||
137 | static void bounce_end_io(struct bio *bio, mempool_t *pool) | 137 | static 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; |