diff options
| author | Kent Overstreet <kmo@daterainc.com> | 2013-11-23 20:19:00 -0500 |
|---|---|---|
| committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-24 01:33:49 -0500 |
| commit | 7988613b0e5b2638caf6cd493cc78e9595eba19c (patch) | |
| tree | cc9fc4e235278035313ee32940740f61269f8fb3 /drivers/block | |
| parent | a4ad39b1d10584dfcfcfb0d510faab2c7f034399 (diff) | |
block: Convert bio_for_each_segment() to bvec_iter
More prep work for immutable biovecs - with immutable bvecs drivers
won't be able to use the biovec directly, they'll need to use helpers
that take into account bio->bi_iter.bi_bvec_done.
This updates callers for the new usage without changing the
implementation yet.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: "Ed L. Cashin" <ecashin@coraid.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Lars Ellenberg <drbd-dev@lists.linbit.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Paul Clements <Paul.Clements@steeleye.com>
Cc: Jim Paris <jim@jtan.com>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Yehuda Sadeh <yehuda@inktank.com>
Cc: Sage Weil <sage@inktank.com>
Cc: Alex Elder <elder@inktank.com>
Cc: ceph-devel@vger.kernel.org
Cc: Joshua Morris <josh.h.morris@us.ibm.com>
Cc: Philip Kelleher <pjk1939@linux.vnet.ibm.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Neil Brown <neilb@suse.de>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: linux390@de.ibm.com
Cc: Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
Cc: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
Cc: support@lsi.com
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Guo Chao <yan@linux.vnet.ibm.com>
Cc: Asai Thambi S P <asamymuthupa@micron.com>
Cc: Selvan Mani <smani@micron.com>
Cc: Sam Bradshaw <sbradshaw@micron.com>
Cc: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Quoc-Son Anh <quoc-sonx.anh@intel.com>
Cc: Sebastian Ott <sebott@linux.vnet.ibm.com>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Jerome Marchand <jmarchan@redhat.com>
Cc: Seth Jennings <sjenning@linux.vnet.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Mike Snitzer <snitzer@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Jan Kara <jack@suse.cz>
Cc: linux-m68k@lists.linux-m68k.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: drbd-user@lists.linbit.com
Cc: nbd-general@lists.sourceforge.net
Cc: cbe-oss-dev@lists.ozlabs.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Cc: linux-raid@vger.kernel.org
Cc: linux-s390@vger.kernel.org
Cc: DL-MPTFusionLinux@lsi.com
Cc: linux-scsi@vger.kernel.org
Cc: devel@driverdev.osuosl.org
Cc: linux-fsdevel@vger.kernel.org
Cc: cluster-devel@redhat.com
Cc: linux-mm@kvack.org
Acked-by: Geoff Levand <geoff@infradead.org>
Diffstat (limited to 'drivers/block')
| -rw-r--r-- | drivers/block/aoe/aoecmd.c | 16 | ||||
| -rw-r--r-- | drivers/block/brd.c | 12 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_main.c | 27 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 13 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_worker.c | 8 | ||||
| -rw-r--r-- | drivers/block/floppy.c | 12 | ||||
| -rw-r--r-- | drivers/block/loop.c | 23 | ||||
| -rw-r--r-- | drivers/block/mtip32xx/mtip32xx.c | 13 | ||||
| -rw-r--r-- | drivers/block/nbd.c | 12 | ||||
| -rw-r--r-- | drivers/block/nvme-core.c | 33 | ||||
| -rw-r--r-- | drivers/block/ps3disk.c | 10 | ||||
| -rw-r--r-- | drivers/block/ps3vram.c | 10 | ||||
| -rw-r--r-- | drivers/block/rbd.c | 38 | ||||
| -rw-r--r-- | drivers/block/rsxx/dma.c | 11 |
14 files changed, 125 insertions, 113 deletions
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 77c24ab1898a..7a06aec1dedc 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -897,15 +897,15 @@ rqbiocnt(struct request *r) | |||
| 897 | static void | 897 | static void |
| 898 | bio_pageinc(struct bio *bio) | 898 | bio_pageinc(struct bio *bio) |
| 899 | { | 899 | { |
| 900 | struct bio_vec *bv; | 900 | struct bio_vec bv; |
| 901 | struct page *page; | 901 | struct page *page; |
| 902 | int i; | 902 | struct bvec_iter iter; |
| 903 | 903 | ||
| 904 | bio_for_each_segment(bv, bio, i) { | 904 | bio_for_each_segment(bv, bio, iter) { |
| 905 | /* Non-zero page count for non-head members of | 905 | /* Non-zero page count for non-head members of |
| 906 | * compound pages is no longer allowed by the kernel. | 906 | * compound pages is no longer allowed by the kernel. |
| 907 | */ | 907 | */ |
| 908 | page = compound_trans_head(bv->bv_page); | 908 | page = compound_trans_head(bv.bv_page); |
| 909 | atomic_inc(&page->_count); | 909 | atomic_inc(&page->_count); |
| 910 | } | 910 | } |
| 911 | } | 911 | } |
| @@ -913,12 +913,12 @@ bio_pageinc(struct bio *bio) | |||
| 913 | static void | 913 | static void |
| 914 | bio_pagedec(struct bio *bio) | 914 | bio_pagedec(struct bio *bio) |
| 915 | { | 915 | { |
| 916 | struct bio_vec *bv; | ||
| 917 | struct page *page; | 916 | struct page *page; |
| 918 | int i; | 917 | struct bio_vec bv; |
| 918 | struct bvec_iter iter; | ||
| 919 | 919 | ||
| 920 | bio_for_each_segment(bv, bio, i) { | 920 | bio_for_each_segment(bv, bio, iter) { |
| 921 | page = compound_trans_head(bv->bv_page); | 921 | page = compound_trans_head(bv.bv_page); |
| 922 | atomic_dec(&page->_count); | 922 | atomic_dec(&page->_count); |
| 923 | } | 923 | } |
| 924 | } | 924 | } |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 66f5aaae15a2..e73b85cf0756 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
| @@ -328,9 +328,9 @@ static void brd_make_request(struct request_queue *q, struct bio *bio) | |||
| 328 | struct block_device *bdev = bio->bi_bdev; | 328 | struct block_device *bdev = bio->bi_bdev; |
| 329 | struct brd_device *brd = bdev->bd_disk->private_data; | 329 | struct brd_device *brd = bdev->bd_disk->private_data; |
| 330 | int rw; | 330 | int rw; |
| 331 | struct bio_vec *bvec; | 331 | struct bio_vec bvec; |
| 332 | sector_t sector; | 332 | sector_t sector; |
| 333 | int i; | 333 | struct bvec_iter iter; |
| 334 | int err = -EIO; | 334 | int err = -EIO; |
| 335 | 335 | ||
| 336 | sector = bio->bi_iter.bi_sector; | 336 | sector = bio->bi_iter.bi_sector; |
| @@ -347,10 +347,10 @@ static void brd_make_request(struct request_queue *q, struct bio *bio) | |||
| 347 | if (rw == READA) | 347 | if (rw == READA) |
| 348 | rw = READ; | 348 | rw = READ; |
| 349 | 349 | ||
| 350 | bio_for_each_segment(bvec, bio, i) { | 350 | bio_for_each_segment(bvec, bio, iter) { |
| 351 | unsigned int len = bvec->bv_len; | 351 | unsigned int len = bvec.bv_len; |
| 352 | err = brd_do_bvec(brd, bvec->bv_page, len, | 352 | err = brd_do_bvec(brd, bvec.bv_page, len, |
| 353 | bvec->bv_offset, rw, sector); | 353 | bvec.bv_offset, rw, sector); |
| 354 | if (err) | 354 | if (err) |
| 355 | break; | 355 | break; |
| 356 | sector += len >> SECTOR_SHIFT; | 356 | sector += len >> SECTOR_SHIFT; |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 9e3818b1bc83..f4e5440aba05 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -1537,15 +1537,17 @@ static int _drbd_send_page(struct drbd_conf *mdev, struct page *page, | |||
| 1537 | 1537 | ||
| 1538 | static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio) | 1538 | static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio) |
| 1539 | { | 1539 | { |
| 1540 | struct bio_vec *bvec; | 1540 | struct bio_vec bvec; |
| 1541 | int i; | 1541 | struct bvec_iter iter; |
| 1542 | |||
| 1542 | /* hint all but last page with MSG_MORE */ | 1543 | /* hint all but last page with MSG_MORE */ |
| 1543 | bio_for_each_segment(bvec, bio, i) { | 1544 | bio_for_each_segment(bvec, bio, iter) { |
| 1544 | int err; | 1545 | int err; |
| 1545 | 1546 | ||
| 1546 | err = _drbd_no_send_page(mdev, bvec->bv_page, | 1547 | err = _drbd_no_send_page(mdev, bvec.bv_page, |
| 1547 | bvec->bv_offset, bvec->bv_len, | 1548 | bvec.bv_offset, bvec.bv_len, |
| 1548 | i == bio->bi_vcnt - 1 ? 0 : MSG_MORE); | 1549 | bio_iter_last(bio, iter) |
| 1550 | ? 0 : MSG_MORE); | ||
| 1549 | if (err) | 1551 | if (err) |
| 1550 | return err; | 1552 | return err; |
| 1551 | } | 1553 | } |
| @@ -1554,15 +1556,16 @@ static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio) | |||
| 1554 | 1556 | ||
| 1555 | static int _drbd_send_zc_bio(struct drbd_conf *mdev, struct bio *bio) | 1557 | static int _drbd_send_zc_bio(struct drbd_conf *mdev, struct bio *bio) |
| 1556 | { | 1558 | { |
| 1557 | struct bio_vec *bvec; | 1559 | struct bio_vec bvec; |
| 1558 | int i; | 1560 | struct bvec_iter iter; |
| 1561 | |||
| 1559 | /* hint all but last page with MSG_MORE */ | 1562 | /* hint all but last page with MSG_MORE */ |
| 1560 | bio_for_each_segment(bvec, bio, i) { | 1563 | bio_for_each_segment(bvec, bio, iter) { |
| 1561 | int err; | 1564 | int err; |
| 1562 | 1565 | ||
| 1563 | err = _drbd_send_page(mdev, bvec->bv_page, | 1566 | err = _drbd_send_page(mdev, bvec.bv_page, |
| 1564 | bvec->bv_offset, bvec->bv_len, | 1567 | bvec.bv_offset, bvec.bv_len, |
| 1565 | i == bio->bi_vcnt - 1 ? 0 : MSG_MORE); | 1568 | bio_iter_last(bio, iter) ? 0 : MSG_MORE); |
| 1566 | if (err) | 1569 | if (err) |
| 1567 | return err; | 1570 | return err; |
| 1568 | } | 1571 | } |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 5326c22cdb9d..d073305ffd5e 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
| @@ -1595,9 +1595,10 @@ static int drbd_drain_block(struct drbd_conf *mdev, int data_size) | |||
| 1595 | static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req, | 1595 | static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req, |
| 1596 | sector_t sector, int data_size) | 1596 | sector_t sector, int data_size) |
| 1597 | { | 1597 | { |
| 1598 | struct bio_vec *bvec; | 1598 | struct bio_vec bvec; |
| 1599 | struct bvec_iter iter; | ||
| 1599 | struct bio *bio; | 1600 | struct bio *bio; |
| 1600 | int dgs, err, i, expect; | 1601 | int dgs, err, expect; |
| 1601 | void *dig_in = mdev->tconn->int_dig_in; | 1602 | void *dig_in = mdev->tconn->int_dig_in; |
| 1602 | void *dig_vv = mdev->tconn->int_dig_vv; | 1603 | void *dig_vv = mdev->tconn->int_dig_vv; |
| 1603 | 1604 | ||
| @@ -1617,11 +1618,11 @@ static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req, | |||
| 1617 | bio = req->master_bio; | 1618 | bio = req->master_bio; |
| 1618 | D_ASSERT(sector == bio->bi_iter.bi_sector); | 1619 | D_ASSERT(sector == bio->bi_iter.bi_sector); |
| 1619 | 1620 | ||
| 1620 | bio_for_each_segment(bvec, bio, i) { | 1621 | bio_for_each_segment(bvec, bio, iter) { |
| 1621 | void *mapped = kmap(bvec->bv_page) + bvec->bv_offset; | 1622 | void *mapped = kmap(bvec.bv_page) + bvec.bv_offset; |
| 1622 | expect = min_t(int, data_size, bvec->bv_len); | 1623 | expect = min_t(int, data_size, bvec.bv_len); |
| 1623 | err = drbd_recv_all_warn(mdev->tconn, mapped, expect); | 1624 | err = drbd_recv_all_warn(mdev->tconn, mapped, expect); |
| 1624 | kunmap(bvec->bv_page); | 1625 | kunmap(bvec.bv_page); |
| 1625 | if (err) | 1626 | if (err) |
| 1626 | return err; | 1627 | return err; |
| 1627 | data_size -= expect; | 1628 | data_size -= expect; |
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 891c0ecaa292..84d3175d493a 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c | |||
| @@ -313,8 +313,8 @@ void drbd_csum_bio(struct drbd_conf *mdev, struct crypto_hash *tfm, struct bio * | |||
| 313 | { | 313 | { |
| 314 | struct hash_desc desc; | 314 | struct hash_desc desc; |
| 315 | struct scatterlist sg; | 315 | struct scatterlist sg; |
| 316 | struct bio_vec *bvec; | 316 | struct bio_vec bvec; |
| 317 | int i; | 317 | struct bvec_iter iter; |
| 318 | 318 | ||
| 319 | desc.tfm = tfm; | 319 | desc.tfm = tfm; |
| 320 | desc.flags = 0; | 320 | desc.flags = 0; |
| @@ -322,8 +322,8 @@ void drbd_csum_bio(struct drbd_conf *mdev, struct crypto_hash *tfm, struct bio * | |||
| 322 | sg_init_table(&sg, 1); | 322 | sg_init_table(&sg, 1); |
| 323 | crypto_hash_init(&desc); | 323 | crypto_hash_init(&desc); |
| 324 | 324 | ||
| 325 | bio_for_each_segment(bvec, bio, i) { | 325 | bio_for_each_segment(bvec, bio, iter) { |
| 326 | sg_set_page(&sg, bvec->bv_page, bvec->bv_len, bvec->bv_offset); | 326 | sg_set_page(&sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset); |
| 327 | crypto_hash_update(&desc, &sg, sg.length); | 327 | crypto_hash_update(&desc, &sg, sg.length); |
| 328 | } | 328 | } |
| 329 | crypto_hash_final(&desc, digest); | 329 | crypto_hash_final(&desc, digest); |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 6a86fe7b730f..6b29c4422828 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
| @@ -2351,7 +2351,7 @@ static void rw_interrupt(void) | |||
| 2351 | /* Compute maximal contiguous buffer size. */ | 2351 | /* Compute maximal contiguous buffer size. */ |
| 2352 | static int buffer_chain_size(void) | 2352 | static int buffer_chain_size(void) |
| 2353 | { | 2353 | { |
| 2354 | struct bio_vec *bv; | 2354 | struct bio_vec bv; |
| 2355 | int size; | 2355 | int size; |
| 2356 | struct req_iterator iter; | 2356 | struct req_iterator iter; |
| 2357 | char *base; | 2357 | char *base; |
| @@ -2360,10 +2360,10 @@ static int buffer_chain_size(void) | |||
| 2360 | size = 0; | 2360 | size = 0; |
| 2361 | 2361 | ||
| 2362 | rq_for_each_segment(bv, current_req, iter) { | 2362 | rq_for_each_segment(bv, current_req, iter) { |
| 2363 | if (page_address(bv->bv_page) + bv->bv_offset != base + size) | 2363 | if (page_address(bv.bv_page) + bv.bv_offset != base + size) |
| 2364 | break; | 2364 | break; |
| 2365 | 2365 | ||
| 2366 | size += bv->bv_len; | 2366 | size += bv.bv_len; |
| 2367 | } | 2367 | } |
| 2368 | 2368 | ||
| 2369 | return size >> 9; | 2369 | return size >> 9; |
| @@ -2389,7 +2389,7 @@ static int transfer_size(int ssize, int max_sector, int max_size) | |||
| 2389 | static void copy_buffer(int ssize, int max_sector, int max_sector_2) | 2389 | static void copy_buffer(int ssize, int max_sector, int max_sector_2) |
| 2390 | { | 2390 | { |
| 2391 | int remaining; /* number of transferred 512-byte sectors */ | 2391 | int remaining; /* number of transferred 512-byte sectors */ |
| 2392 | struct bio_vec *bv; | 2392 | struct bio_vec bv; |
| 2393 | char *buffer; | 2393 | char *buffer; |
| 2394 | char *dma_buffer; | 2394 | char *dma_buffer; |
| 2395 | int size; | 2395 | int size; |
| @@ -2427,10 +2427,10 @@ static void copy_buffer(int ssize, int max_sector, int max_sector_2) | |||
| 2427 | if (!remaining) | 2427 | if (!remaining) |
| 2428 | break; | 2428 | break; |
| 2429 | 2429 | ||
| 2430 | size = bv->bv_len; | 2430 | size = bv.bv_len; |
| 2431 | SUPBOUND(size, remaining); | 2431 | SUPBOUND(size, remaining); |
| 2432 | 2432 | ||
| 2433 | buffer = page_address(bv->bv_page) + bv->bv_offset; | 2433 | buffer = page_address(bv.bv_page) + bv.bv_offset; |
| 2434 | if (dma_buffer + size > | 2434 | if (dma_buffer + size > |
| 2435 | floppy_track_buffer + (max_buffer_sectors << 10) || | 2435 | floppy_track_buffer + (max_buffer_sectors << 10) || |
| 2436 | dma_buffer < floppy_track_buffer) { | 2436 | dma_buffer < floppy_track_buffer) { |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f5e39989adde..33fde3a39759 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -288,9 +288,10 @@ static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos) | |||
| 288 | { | 288 | { |
| 289 | int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t, | 289 | int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t, |
| 290 | struct page *page); | 290 | struct page *page); |
| 291 | struct bio_vec *bvec; | 291 | struct bio_vec bvec; |
| 292 | struct bvec_iter iter; | ||
| 292 | struct page *page = NULL; | 293 | struct page *page = NULL; |
| 293 | int i, ret = 0; | 294 | int ret = 0; |
| 294 | 295 | ||
| 295 | if (lo->transfer != transfer_none) { | 296 | if (lo->transfer != transfer_none) { |
| 296 | page = alloc_page(GFP_NOIO | __GFP_HIGHMEM); | 297 | page = alloc_page(GFP_NOIO | __GFP_HIGHMEM); |
| @@ -302,11 +303,11 @@ static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos) | |||
| 302 | do_lo_send = do_lo_send_direct_write; | 303 | do_lo_send = do_lo_send_direct_write; |
| 303 | } | 304 | } |
| 304 | 305 | ||
| 305 | bio_for_each_segment(bvec, bio, i) { | 306 | bio_for_each_segment(bvec, bio, iter) { |
| 306 | ret = do_lo_send(lo, bvec, pos, page); | 307 | ret = do_lo_send(lo, &bvec, pos, page); |
| 307 | if (ret < 0) | 308 | if (ret < 0) |
| 308 | break; | 309 | break; |
| 309 | pos += bvec->bv_len; | 310 | pos += bvec.bv_len; |
| 310 | } | 311 | } |
| 311 | if (page) { | 312 | if (page) { |
| 312 | kunmap(page); | 313 | kunmap(page); |
| @@ -392,20 +393,20 @@ do_lo_receive(struct loop_device *lo, | |||
| 392 | static int | 393 | static int |
| 393 | lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos) | 394 | lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos) |
| 394 | { | 395 | { |
| 395 | struct bio_vec *bvec; | 396 | struct bio_vec bvec; |
| 397 | struct bvec_iter iter; | ||
| 396 | ssize_t s; | 398 | ssize_t s; |
| 397 | int i; | ||
| 398 | 399 | ||
| 399 | bio_for_each_segment(bvec, bio, i) { | 400 | bio_for_each_segment(bvec, bio, iter) { |
| 400 | s = do_lo_receive(lo, bvec, bsize, pos); | 401 | s = do_lo_receive(lo, &bvec, bsize, pos); |
| 401 | if (s < 0) | 402 | if (s < 0) |
| 402 | return s; | 403 | return s; |
| 403 | 404 | ||
| 404 | if (s != bvec->bv_len) { | 405 | if (s != bvec.bv_len) { |
| 405 | zero_fill_bio(bio); | 406 | zero_fill_bio(bio); |
| 406 | break; | 407 | break; |
| 407 | } | 408 | } |
| 408 | pos += bvec->bv_len; | 409 | pos += bvec.bv_len; |
| 409 | } | 410 | } |
| 410 | return 0; | 411 | return 0; |
| 411 | } | 412 | } |
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 69e9eb5a6b34..52b2f2a71470 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -3962,8 +3962,9 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
| 3962 | { | 3962 | { |
| 3963 | struct driver_data *dd = queue->queuedata; | 3963 | struct driver_data *dd = queue->queuedata; |
| 3964 | struct scatterlist *sg; | 3964 | struct scatterlist *sg; |
| 3965 | struct bio_vec *bvec; | 3965 | struct bio_vec bvec; |
| 3966 | int i, nents = 0; | 3966 | struct bvec_iter iter; |
| 3967 | int nents = 0; | ||
| 3967 | int tag = 0, unaligned = 0; | 3968 | int tag = 0, unaligned = 0; |
| 3968 | 3969 | ||
| 3969 | if (unlikely(dd->dd_flag & MTIP_DDF_STOP_IO)) { | 3970 | if (unlikely(dd->dd_flag & MTIP_DDF_STOP_IO)) { |
| @@ -4026,11 +4027,11 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
| 4026 | } | 4027 | } |
| 4027 | 4028 | ||
| 4028 | /* Create the scatter list for this bio. */ | 4029 | /* Create the scatter list for this bio. */ |
| 4029 | bio_for_each_segment(bvec, bio, i) { | 4030 | bio_for_each_segment(bvec, bio, iter) { |
| 4030 | sg_set_page(&sg[nents], | 4031 | sg_set_page(&sg[nents], |
| 4031 | bvec->bv_page, | 4032 | bvec.bv_page, |
| 4032 | bvec->bv_len, | 4033 | bvec.bv_len, |
| 4033 | bvec->bv_offset); | 4034 | bvec.bv_offset); |
| 4034 | nents++; | 4035 | nents++; |
| 4035 | } | 4036 | } |
| 4036 | 4037 | ||
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 2dc3b5153f0d..aa362f493216 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
| @@ -271,7 +271,7 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) | |||
| 271 | 271 | ||
| 272 | if (nbd_cmd(req) == NBD_CMD_WRITE) { | 272 | if (nbd_cmd(req) == NBD_CMD_WRITE) { |
| 273 | struct req_iterator iter; | 273 | struct req_iterator iter; |
| 274 | struct bio_vec *bvec; | 274 | struct bio_vec bvec; |
| 275 | /* | 275 | /* |
| 276 | * we are really probing at internals to determine | 276 | * we are really probing at internals to determine |
| 277 | * whether to set MSG_MORE or not... | 277 | * whether to set MSG_MORE or not... |
| @@ -281,8 +281,8 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req) | |||
| 281 | if (!rq_iter_last(req, iter)) | 281 | if (!rq_iter_last(req, iter)) |
| 282 | flags = MSG_MORE; | 282 | flags = MSG_MORE; |
| 283 | dprintk(DBG_TX, "%s: request %p: sending %d bytes data\n", | 283 | dprintk(DBG_TX, "%s: request %p: sending %d bytes data\n", |
| 284 | nbd->disk->disk_name, req, bvec->bv_len); | 284 | nbd->disk->disk_name, req, bvec.bv_len); |
| 285 | result = sock_send_bvec(nbd, bvec, flags); | 285 | result = sock_send_bvec(nbd, &bvec, flags); |
| 286 | if (result <= 0) { | 286 | if (result <= 0) { |
| 287 | dev_err(disk_to_dev(nbd->disk), | 287 | dev_err(disk_to_dev(nbd->disk), |
| 288 | "Send data failed (result %d)\n", | 288 | "Send data failed (result %d)\n", |
| @@ -378,10 +378,10 @@ static struct request *nbd_read_stat(struct nbd_device *nbd) | |||
| 378 | nbd->disk->disk_name, req); | 378 | nbd->disk->disk_name, req); |
| 379 | if (nbd_cmd(req) == NBD_CMD_READ) { | 379 | if (nbd_cmd(req) == NBD_CMD_READ) { |
| 380 | struct req_iterator iter; | 380 | struct req_iterator iter; |
| 381 | struct bio_vec *bvec; | 381 | struct bio_vec bvec; |
| 382 | 382 | ||
| 383 | rq_for_each_segment(bvec, req, iter) { | 383 | rq_for_each_segment(bvec, req, iter) { |
| 384 | result = sock_recv_bvec(nbd, bvec); | 384 | result = sock_recv_bvec(nbd, &bvec); |
| 385 | if (result <= 0) { | 385 | if (result <= 0) { |
| 386 | dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", | 386 | dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", |
| 387 | result); | 387 | result); |
| @@ -389,7 +389,7 @@ static struct request *nbd_read_stat(struct nbd_device *nbd) | |||
| 389 | return req; | 389 | return req; |
| 390 | } | 390 | } |
| 391 | dprintk(DBG_RX, "%s: request %p: got %d bytes data\n", | 391 | dprintk(DBG_RX, "%s: request %p: got %d bytes data\n", |
| 392 | nbd->disk->disk_name, req, bvec->bv_len); | 392 | nbd->disk->disk_name, req, bvec.bv_len); |
| 393 | } | 393 | } |
| 394 | } | 394 | } |
| 395 | return req; | 395 | return req; |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 53d217381873..5539d2920872 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
| @@ -550,9 +550,11 @@ static int nvme_split_and_submit(struct bio *bio, struct nvme_queue *nvmeq, | |||
| 550 | static int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod, | 550 | static int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod, |
| 551 | struct bio *bio, enum dma_data_direction dma_dir, int psegs) | 551 | struct bio *bio, enum dma_data_direction dma_dir, int psegs) |
| 552 | { | 552 | { |
| 553 | struct bio_vec *bvec, *bvprv = NULL; | 553 | struct bio_vec bvec, bvprv; |
| 554 | struct bvec_iter iter; | ||
| 554 | struct scatterlist *sg = NULL; | 555 | struct scatterlist *sg = NULL; |
| 555 | int i, length = 0, nsegs = 0, split_len = bio->bi_iter.bi_size; | 556 | int length = 0, nsegs = 0, split_len = bio->bi_iter.bi_size; |
| 557 | int first = 1; | ||
| 556 | 558 | ||
| 557 | if (nvmeq->dev->stripe_size) | 559 | if (nvmeq->dev->stripe_size) |
| 558 | split_len = nvmeq->dev->stripe_size - | 560 | split_len = nvmeq->dev->stripe_size - |
| @@ -560,25 +562,28 @@ static int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod, | |||
| 560 | (nvmeq->dev->stripe_size - 1)); | 562 | (nvmeq->dev->stripe_size - 1)); |
| 561 | 563 | ||
| 562 | sg_init_table(iod->sg, psegs); | 564 | sg_init_table(iod->sg, psegs); |
| 563 | bio_for_each_segment(bvec, bio, i) { | 565 | bio_for_each_segment(bvec, bio, iter) { |
| 564 | if (bvprv && BIOVEC_PHYS_MERGEABLE(bvprv, bvec)) { | 566 | if (!first && BIOVEC_PHYS_MERGEABLE(&bvprv, &bvec)) { |
| 565 | sg->length += bvec->bv_len; | 567 | sg->length += bvec.bv_len; |
| 566 | } else { | 568 | } else { |
| 567 | if (bvprv && BIOVEC_NOT_VIRT_MERGEABLE(bvprv, bvec)) | 569 | if (!first && BIOVEC_NOT_VIRT_MERGEABLE(&bvprv, &bvec)) |
| 568 | return nvme_split_and_submit(bio, nvmeq, i, | 570 | return nvme_split_and_submit(bio, nvmeq, |
| 569 | length, 0); | 571 | iter.bi_idx, |
| 572 | length, 0); | ||
| 570 | 573 | ||
| 571 | sg = sg ? sg + 1 : iod->sg; | 574 | sg = sg ? sg + 1 : iod->sg; |
| 572 | sg_set_page(sg, bvec->bv_page, bvec->bv_len, | 575 | sg_set_page(sg, bvec.bv_page, |
| 573 | bvec->bv_offset); | 576 | bvec.bv_len, bvec.bv_offset); |
| 574 | nsegs++; | 577 | nsegs++; |
| 575 | } | 578 | } |
| 576 | 579 | ||
| 577 | if (split_len - length < bvec->bv_len) | 580 | if (split_len - length < bvec.bv_len) |
| 578 | return nvme_split_and_submit(bio, nvmeq, i, split_len, | 581 | return nvme_split_and_submit(bio, nvmeq, iter.bi_idx, |
| 579 | split_len - length); | 582 | split_len, |
| 580 | length += bvec->bv_len; | 583 | split_len - length); |
| 584 | length += bvec.bv_len; | ||
| 581 | bvprv = bvec; | 585 | bvprv = bvec; |
| 586 | first = 0; | ||
| 582 | } | 587 | } |
| 583 | iod->nents = nsegs; | 588 | iod->nents = nsegs; |
| 584 | sg_mark_end(sg); | 589 | sg_mark_end(sg); |
diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c index 464be78a0836..1c6edb9a9960 100644 --- a/drivers/block/ps3disk.c +++ b/drivers/block/ps3disk.c | |||
| @@ -94,7 +94,7 @@ static void ps3disk_scatter_gather(struct ps3_storage_device *dev, | |||
| 94 | { | 94 | { |
| 95 | unsigned int offset = 0; | 95 | unsigned int offset = 0; |
| 96 | struct req_iterator iter; | 96 | struct req_iterator iter; |
| 97 | struct bio_vec *bvec; | 97 | struct bio_vec bvec; |
| 98 | unsigned int i = 0; | 98 | unsigned int i = 0; |
| 99 | size_t size; | 99 | size_t size; |
| 100 | void *buf; | 100 | void *buf; |
| @@ -106,14 +106,14 @@ static void ps3disk_scatter_gather(struct ps3_storage_device *dev, | |||
| 106 | __func__, __LINE__, i, bio_segments(iter.bio), | 106 | __func__, __LINE__, i, bio_segments(iter.bio), |
| 107 | bio_sectors(iter.bio), iter.bio->bi_iter.bi_sector); | 107 | bio_sectors(iter.bio), iter.bio->bi_iter.bi_sector); |
| 108 | 108 | ||
| 109 | size = bvec->bv_len; | 109 | size = bvec.bv_len; |
| 110 | buf = bvec_kmap_irq(bvec, &flags); | 110 | buf = bvec_kmap_irq(&bvec, &flags); |
| 111 | if (gather) | 111 | if (gather) |
| 112 | memcpy(dev->bounce_buf+offset, buf, size); | 112 | memcpy(dev->bounce_buf+offset, buf, size); |
| 113 | else | 113 | else |
| 114 | memcpy(buf, dev->bounce_buf+offset, size); | 114 | memcpy(buf, dev->bounce_buf+offset, size); |
| 115 | offset += size; | 115 | offset += size; |
| 116 | flush_kernel_dcache_page(bvec->bv_page); | 116 | flush_kernel_dcache_page(bvec.bv_page); |
| 117 | bvec_kunmap_irq(buf, &flags); | 117 | bvec_kunmap_irq(buf, &flags); |
| 118 | i++; | 118 | i++; |
| 119 | } | 119 | } |
| @@ -130,7 +130,7 @@ static int ps3disk_submit_request_sg(struct ps3_storage_device *dev, | |||
| 130 | 130 | ||
| 131 | #ifdef DEBUG | 131 | #ifdef DEBUG |
| 132 | unsigned int n = 0; | 132 | unsigned int n = 0; |
| 133 | struct bio_vec *bv; | 133 | struct bio_vec bv; |
| 134 | struct req_iterator iter; | 134 | struct req_iterator iter; |
| 135 | 135 | ||
| 136 | rq_for_each_segment(bv, req, iter) | 136 | rq_for_each_segment(bv, req, iter) |
diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c index 320bbfc9b902..ef45cfb98fd2 100644 --- a/drivers/block/ps3vram.c +++ b/drivers/block/ps3vram.c | |||
| @@ -555,14 +555,14 @@ static struct bio *ps3vram_do_bio(struct ps3_system_bus_device *dev, | |||
| 555 | const char *op = write ? "write" : "read"; | 555 | const char *op = write ? "write" : "read"; |
| 556 | loff_t offset = bio->bi_iter.bi_sector << 9; | 556 | loff_t offset = bio->bi_iter.bi_sector << 9; |
| 557 | int error = 0; | 557 | int error = 0; |
| 558 | struct bio_vec *bvec; | 558 | struct bio_vec bvec; |
| 559 | unsigned int i; | 559 | struct bvec_iter iter; |
| 560 | struct bio *next; | 560 | struct bio *next; |
| 561 | 561 | ||
| 562 | bio_for_each_segment(bvec, bio, i) { | 562 | bio_for_each_segment(bvec, bio, iter) { |
| 563 | /* PS3 is ppc64, so we don't handle highmem */ | 563 | /* PS3 is ppc64, so we don't handle highmem */ |
| 564 | char *ptr = page_address(bvec->bv_page) + bvec->bv_offset; | 564 | char *ptr = page_address(bvec.bv_page) + bvec.bv_offset; |
| 565 | size_t len = bvec->bv_len, retlen; | 565 | size_t len = bvec.bv_len, retlen; |
| 566 | 566 | ||
| 567 | dev_dbg(&dev->core, " %s %zu bytes at offset %llu\n", op, | 567 | dev_dbg(&dev->core, " %s %zu bytes at offset %llu\n", op, |
| 568 | len, offset); | 568 | len, offset); |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index a8f4fe2d4d1b..20e8ab35736b 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -1109,23 +1109,23 @@ static void bio_chain_put(struct bio *chain) | |||
| 1109 | */ | 1109 | */ |
| 1110 | static void zero_bio_chain(struct bio *chain, int start_ofs) | 1110 | static void zero_bio_chain(struct bio *chain, int start_ofs) |
| 1111 | { | 1111 | { |
| 1112 | struct bio_vec *bv; | 1112 | struct bio_vec bv; |
| 1113 | struct bvec_iter iter; | ||
| 1113 | unsigned long flags; | 1114 | unsigned long flags; |
| 1114 | void *buf; | 1115 | void *buf; |
| 1115 | int i; | ||
| 1116 | int pos = 0; | 1116 | int pos = 0; |
| 1117 | 1117 | ||
| 1118 | while (chain) { | 1118 | while (chain) { |
| 1119 | bio_for_each_segment(bv, chain, i) { | 1119 | bio_for_each_segment(bv, chain, iter) { |
| 1120 | if (pos + bv->bv_len > start_ofs) { | 1120 | if (pos + bv.bv_len > start_ofs) { |
| 1121 | int remainder = max(start_ofs - pos, 0); | 1121 | int remainder = max(start_ofs - pos, 0); |
| 1122 | buf = bvec_kmap_irq(bv, &flags); | 1122 | buf = bvec_kmap_irq(&bv, &flags); |
| 1123 | memset(buf + remainder, 0, | 1123 | memset(buf + remainder, 0, |
| 1124 | bv->bv_len - remainder); | 1124 | bv.bv_len - remainder); |
| 1125 | flush_dcache_page(bv->bv_page); | 1125 | flush_dcache_page(bv.bv_page); |
| 1126 | bvec_kunmap_irq(buf, &flags); | 1126 | bvec_kunmap_irq(buf, &flags); |
| 1127 | } | 1127 | } |
| 1128 | pos += bv->bv_len; | 1128 | pos += bv.bv_len; |
| 1129 | } | 1129 | } |
| 1130 | 1130 | ||
| 1131 | chain = chain->bi_next; | 1131 | chain = chain->bi_next; |
| @@ -1173,11 +1173,11 @@ static struct bio *bio_clone_range(struct bio *bio_src, | |||
| 1173 | unsigned int len, | 1173 | unsigned int len, |
| 1174 | gfp_t gfpmask) | 1174 | gfp_t gfpmask) |
| 1175 | { | 1175 | { |
| 1176 | struct bio_vec *bv; | 1176 | struct bio_vec bv; |
| 1177 | struct bvec_iter iter; | ||
| 1178 | struct bvec_iter end_iter; | ||
| 1177 | unsigned int resid; | 1179 | unsigned int resid; |
| 1178 | unsigned short idx; | ||
| 1179 | unsigned int voff; | 1180 | unsigned int voff; |
| 1180 | unsigned short end_idx; | ||
| 1181 | unsigned short vcnt; | 1181 | unsigned short vcnt; |
| 1182 | struct bio *bio; | 1182 | struct bio *bio; |
| 1183 | 1183 | ||
| @@ -1196,22 +1196,22 @@ static struct bio *bio_clone_range(struct bio *bio_src, | |||
| 1196 | /* Find first affected segment... */ | 1196 | /* Find first affected segment... */ |
| 1197 | 1197 | ||
| 1198 | resid = offset; | 1198 | resid = offset; |
| 1199 | bio_for_each_segment(bv, bio_src, idx) { | 1199 | bio_for_each_segment(bv, bio_src, iter) { |
| 1200 | if (resid < bv->bv_len) | 1200 | if (resid < bv.bv_len) |
| 1201 | break; | 1201 | break; |
| 1202 | resid -= bv->bv_len; | 1202 | resid -= bv.bv_len; |
| 1203 | } | 1203 | } |
| 1204 | voff = resid; | 1204 | voff = resid; |
| 1205 | 1205 | ||
| 1206 | /* ...and the last affected segment */ | 1206 | /* ...and the last affected segment */ |
| 1207 | 1207 | ||
| 1208 | resid += len; | 1208 | resid += len; |
| 1209 | __bio_for_each_segment(bv, bio_src, end_idx, idx) { | 1209 | __bio_for_each_segment(bv, bio_src, end_iter, iter) { |
| 1210 | if (resid <= bv->bv_len) | 1210 | if (resid <= bv.bv_len) |
| 1211 | break; | 1211 | break; |
| 1212 | resid -= bv->bv_len; | 1212 | resid -= bv.bv_len; |
| 1213 | } | 1213 | } |
| 1214 | vcnt = end_idx - idx + 1; | 1214 | vcnt = end_iter.bi_idx = iter.bi_idx + 1; |
| 1215 | 1215 | ||
| 1216 | /* Build the clone */ | 1216 | /* Build the clone */ |
| 1217 | 1217 | ||
| @@ -1229,7 +1229,7 @@ static struct bio *bio_clone_range(struct bio *bio_src, | |||
| 1229 | * Copy over our part of the bio_vec, then update the first | 1229 | * Copy over our part of the bio_vec, then update the first |
| 1230 | * and last (or only) entries. | 1230 | * and last (or only) entries. |
| 1231 | */ | 1231 | */ |
| 1232 | memcpy(&bio->bi_io_vec[0], &bio_src->bi_io_vec[idx], | 1232 | memcpy(&bio->bi_io_vec[0], &bio_src->bi_io_vec[iter.bi_idx], |
| 1233 | vcnt * sizeof (struct bio_vec)); | 1233 | vcnt * sizeof (struct bio_vec)); |
| 1234 | bio->bi_io_vec[0].bv_offset += voff; | 1234 | bio->bi_io_vec[0].bv_offset += voff; |
| 1235 | if (vcnt > 1) { | 1235 | if (vcnt > 1) { |
diff --git a/drivers/block/rsxx/dma.c b/drivers/block/rsxx/dma.c index 3716633be3c2..cf8cd293abb5 100644 --- a/drivers/block/rsxx/dma.c +++ b/drivers/block/rsxx/dma.c | |||
| @@ -684,7 +684,8 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, | |||
| 684 | void *cb_data) | 684 | void *cb_data) |
| 685 | { | 685 | { |
| 686 | struct list_head dma_list[RSXX_MAX_TARGETS]; | 686 | struct list_head dma_list[RSXX_MAX_TARGETS]; |
| 687 | struct bio_vec *bvec; | 687 | struct bio_vec bvec; |
| 688 | struct bvec_iter iter; | ||
| 688 | unsigned long long addr8; | 689 | unsigned long long addr8; |
| 689 | unsigned int laddr; | 690 | unsigned int laddr; |
| 690 | unsigned int bv_len; | 691 | unsigned int bv_len; |
| @@ -722,9 +723,9 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, | |||
| 722 | bv_len -= RSXX_HW_BLK_SIZE; | 723 | bv_len -= RSXX_HW_BLK_SIZE; |
| 723 | } | 724 | } |
| 724 | } else { | 725 | } else { |
| 725 | bio_for_each_segment(bvec, bio, i) { | 726 | bio_for_each_segment(bvec, bio, iter) { |
| 726 | bv_len = bvec->bv_len; | 727 | bv_len = bvec.bv_len; |
| 727 | bv_off = bvec->bv_offset; | 728 | bv_off = bvec.bv_offset; |
| 728 | 729 | ||
| 729 | while (bv_len > 0) { | 730 | while (bv_len > 0) { |
| 730 | tgt = rsxx_get_dma_tgt(card, addr8); | 731 | tgt = rsxx_get_dma_tgt(card, addr8); |
| @@ -736,7 +737,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, | |||
| 736 | st = rsxx_queue_dma(card, &dma_list[tgt], | 737 | st = rsxx_queue_dma(card, &dma_list[tgt], |
| 737 | bio_data_dir(bio), | 738 | bio_data_dir(bio), |
| 738 | dma_off, dma_len, | 739 | dma_off, dma_len, |
| 739 | laddr, bvec->bv_page, | 740 | laddr, bvec.bv_page, |
| 740 | bv_off, cb, cb_data); | 741 | bv_off, cb, cb_data); |
| 741 | if (st) | 742 | if (st) |
| 742 | goto bvec_err; | 743 | goto bvec_err; |
