aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-io.c')
-rw-r--r--drivers/md/dm-io.c34
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 */
204static void bvec_get_page(struct dpages *dp, 204static 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
213static void bvec_next_page(struct dpages *dp) 213static 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
219static void bvec_dp_init(struct dpages *dp, struct bio_vec *bvec) 220static 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: