diff options
Diffstat (limited to 'drivers/md/dm-io.c')
-rw-r--r-- | drivers/md/dm-io.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 2a20986a2fec..3842ac738f98 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
@@ -201,26 +201,28 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse | |||
201 | /* | 201 | /* |
202 | * Functions for getting the pages from a bvec. | 202 | * Functions for getting the pages from a bvec. |
203 | */ | 203 | */ |
204 | static void bvec_get_page(struct dpages *dp, | 204 | static void bio_get_page(struct dpages *dp, struct page **p, |
205 | struct page **p, unsigned long *len, unsigned *offset) | 205 | unsigned long *len, unsigned *offset) |
206 | { | 206 | { |
207 | struct bio_vec *bvec = (struct bio_vec *) dp->context_ptr; | 207 | struct bio_vec *bvec = dp->context_ptr; |
208 | *p = bvec->bv_page; | 208 | *p = bvec->bv_page; |
209 | *len = bvec->bv_len; | 209 | *len = bvec->bv_len - dp->context_u; |
210 | *offset = bvec->bv_offset; | 210 | *offset = bvec->bv_offset + dp->context_u; |
211 | } | 211 | } |
212 | 212 | ||
213 | static void bvec_next_page(struct dpages *dp) | 213 | static void bio_next_page(struct dpages *dp) |
214 | { | 214 | { |
215 | struct bio_vec *bvec = (struct bio_vec *) dp->context_ptr; | 215 | struct bio_vec *bvec = dp->context_ptr; |
216 | dp->context_ptr = bvec + 1; | 216 | dp->context_ptr = bvec + 1; |
217 | dp->context_u = 0; | ||
217 | } | 218 | } |
218 | 219 | ||
219 | static void bvec_dp_init(struct dpages *dp, struct bio_vec *bvec) | 220 | static void bio_dp_init(struct dpages *dp, struct bio *bio) |
220 | { | 221 | { |
221 | dp->get_page = bvec_get_page; | 222 | dp->get_page = bio_get_page; |
222 | dp->next_page = bvec_next_page; | 223 | dp->next_page = bio_next_page; |
223 | dp->context_ptr = bvec; | 224 | dp->context_ptr = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); |
225 | dp->context_u = bio->bi_iter.bi_bvec_done; | ||
224 | } | 226 | } |
225 | 227 | ||
226 | /* | 228 | /* |
@@ -304,14 +306,14 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
304 | dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT))); | 306 | dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT))); |
305 | 307 | ||
306 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); | 308 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); |
307 | bio->bi_sector = where->sector + (where->count - remaining); | 309 | bio->bi_iter.bi_sector = where->sector + (where->count - remaining); |
308 | bio->bi_bdev = where->bdev; | 310 | bio->bi_bdev = where->bdev; |
309 | bio->bi_end_io = endio; | 311 | bio->bi_end_io = endio; |
310 | store_io_and_region_in_bio(bio, io, region); | 312 | store_io_and_region_in_bio(bio, io, region); |
311 | 313 | ||
312 | if (rw & REQ_DISCARD) { | 314 | if (rw & REQ_DISCARD) { |
313 | num_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); | 315 | num_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); |
314 | bio->bi_size = num_sectors << SECTOR_SHIFT; | 316 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; |
315 | remaining -= num_sectors; | 317 | remaining -= num_sectors; |
316 | } else if (rw & REQ_WRITE_SAME) { | 318 | } else if (rw & REQ_WRITE_SAME) { |
317 | /* | 319 | /* |
@@ -320,7 +322,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
320 | dp->get_page(dp, &page, &len, &offset); | 322 | dp->get_page(dp, &page, &len, &offset); |
321 | bio_add_page(bio, page, logical_block_size, offset); | 323 | bio_add_page(bio, page, logical_block_size, offset); |
322 | num_sectors = min_t(sector_t, q->limits.max_write_same_sectors, remaining); | 324 | num_sectors = min_t(sector_t, q->limits.max_write_same_sectors, remaining); |
323 | bio->bi_size = num_sectors << SECTOR_SHIFT; | 325 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; |
324 | 326 | ||
325 | offset = 0; | 327 | offset = 0; |
326 | remaining -= num_sectors; | 328 | remaining -= num_sectors; |
@@ -457,8 +459,8 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp, | |||
457 | list_dp_init(dp, io_req->mem.ptr.pl, io_req->mem.offset); | 459 | list_dp_init(dp, io_req->mem.ptr.pl, io_req->mem.offset); |
458 | break; | 460 | break; |
459 | 461 | ||
460 | case DM_IO_BVEC: | 462 | case DM_IO_BIO: |
461 | bvec_dp_init(dp, io_req->mem.ptr.bvec); | 463 | bio_dp_init(dp, io_req->mem.ptr.bio); |
462 | break; | 464 | break; |
463 | 465 | ||
464 | case DM_IO_VMA: | 466 | case DM_IO_VMA: |