aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2012-09-05 18:22:02 -0400
committerKent Overstreet <koverstreet@google.com>2013-03-23 17:26:30 -0400
commitcb34e057ad22a1c2c6f2cb6cd1cbd05cc2f28f28 (patch)
tree4077b8e6e88bc7c5eb4cd738b4203401daba28a9
parentd74c6d514fe314b8bdab58b487b25992291577ec (diff)
block: Convert some code to bio_for_each_segment_all()
More prep work for immutable bvecs: A few places in the code were either open coding or using the wrong version - fix. After we introduce the bvec iter, it'll no longer be possible to modify the biovec through bio_for_each_segment_all() - it doesn't increment a pointer to the current bvec, you pass in a struct bio_vec (not a pointer) which is updated with what the current biovec would be (taking into account bi_bvec_done and bi_size). So because of that it's more worthwhile to be consistent about bio_for_each_segment()/bio_for_each_segment_all() usage. Signed-off-by: Kent Overstreet <koverstreet@google.com> CC: Jens Axboe <axboe@kernel.dk> CC: NeilBrown <neilb@suse.de> CC: Alasdair Kergon <agk@redhat.com> CC: dm-devel@redhat.com CC: Alexander Viro <viro@zeniv.linux.org.uk>
-rw-r--r--drivers/md/dm-crypt.c3
-rw-r--r--drivers/md/raid1.c10
-rw-r--r--fs/bio.c20
-rw-r--r--fs/direct-io.c8
-rw-r--r--mm/bounce.c2
5 files changed, 19 insertions, 24 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 13c15480d940..6d2d41ae9e32 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -858,8 +858,7 @@ static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone)
858 unsigned int i; 858 unsigned int i;
859 struct bio_vec *bv; 859 struct bio_vec *bv;
860 860
861 for (i = 0; i < clone->bi_vcnt; i++) { 861 bio_for_each_segment_all(bv, clone, i) {
862 bv = bio_iovec_idx(clone, i);
863 BUG_ON(!bv->bv_page); 862 BUG_ON(!bv->bv_page);
864 mempool_free(bv->bv_page, cc->page_pool); 863 mempool_free(bv->bv_page, cc->page_pool);
865 bv->bv_page = NULL; 864 bv->bv_page = NULL;
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 853482015d3d..a7ea954abe1d 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -925,7 +925,7 @@ static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio)
925 if (unlikely(!bvecs)) 925 if (unlikely(!bvecs))
926 return; 926 return;
927 927
928 bio_for_each_segment(bvec, bio, i) { 928 bio_for_each_segment_all(bvec, bio, i) {
929 bvecs[i] = *bvec; 929 bvecs[i] = *bvec;
930 bvecs[i].bv_page = alloc_page(GFP_NOIO); 930 bvecs[i].bv_page = alloc_page(GFP_NOIO);
931 if (unlikely(!bvecs[i].bv_page)) 931 if (unlikely(!bvecs[i].bv_page))
@@ -1284,12 +1284,8 @@ read_again:
1284 struct bio_vec *bvec; 1284 struct bio_vec *bvec;
1285 int j; 1285 int j;
1286 1286
1287 /* Yes, I really want the '__' version so that 1287 /*
1288 * we clear any unused pointer in the io_vec, rather 1288 * We trimmed the bio, so _all is legit
1289 * than leave them unchanged. This is important
1290 * because when we come to free the pages, we won't
1291 * know the original bi_idx, so we just free
1292 * them all
1293 */ 1289 */
1294 bio_for_each_segment_all(bvec, mbio, j) 1290 bio_for_each_segment_all(bvec, mbio, j)
1295 bvec->bv_page = r1_bio->behind_bvecs[j].bv_page; 1291 bvec->bv_page = r1_bio->behind_bvecs[j].bv_page;
diff --git a/fs/bio.c b/fs/bio.c
index 618f9044c414..fe3aee90c988 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -1548,11 +1548,11 @@ EXPORT_SYMBOL(bio_copy_kern);
1548 */ 1548 */
1549void bio_set_pages_dirty(struct bio *bio) 1549void bio_set_pages_dirty(struct bio *bio)
1550{ 1550{
1551 struct bio_vec *bvec = bio->bi_io_vec; 1551 struct bio_vec *bvec;
1552 int i; 1552 int i;
1553 1553
1554 for (i = 0; i < bio->bi_vcnt; i++) { 1554 bio_for_each_segment_all(bvec, bio, i) {
1555 struct page *page = bvec[i].bv_page; 1555 struct page *page = bvec->bv_page;
1556 1556
1557 if (page && !PageCompound(page)) 1557 if (page && !PageCompound(page))
1558 set_page_dirty_lock(page); 1558 set_page_dirty_lock(page);
@@ -1561,11 +1561,11 @@ void bio_set_pages_dirty(struct bio *bio)
1561 1561
1562static void bio_release_pages(struct bio *bio) 1562static void bio_release_pages(struct bio *bio)
1563{ 1563{
1564 struct bio_vec *bvec = bio->bi_io_vec; 1564 struct bio_vec *bvec;
1565 int i; 1565 int i;
1566 1566
1567 for (i = 0; i < bio->bi_vcnt; i++) { 1567 bio_for_each_segment_all(bvec, bio, i) {
1568 struct page *page = bvec[i].bv_page; 1568 struct page *page = bvec->bv_page;
1569 1569
1570 if (page) 1570 if (page)
1571 put_page(page); 1571 put_page(page);
@@ -1614,16 +1614,16 @@ static void bio_dirty_fn(struct work_struct *work)
1614 1614
1615void bio_check_pages_dirty(struct bio *bio) 1615void bio_check_pages_dirty(struct bio *bio)
1616{ 1616{
1617 struct bio_vec *bvec = bio->bi_io_vec; 1617 struct bio_vec *bvec;
1618 int nr_clean_pages = 0; 1618 int nr_clean_pages = 0;
1619 int i; 1619 int i;
1620 1620
1621 for (i = 0; i < bio->bi_vcnt; i++) { 1621 bio_for_each_segment_all(bvec, bio, i) {
1622 struct page *page = bvec[i].bv_page; 1622 struct page *page = bvec->bv_page;
1623 1623
1624 if (PageDirty(page) || PageCompound(page)) { 1624 if (PageDirty(page) || PageCompound(page)) {
1625 page_cache_release(page); 1625 page_cache_release(page);
1626 bvec[i].bv_page = NULL; 1626 bvec->bv_page = NULL;
1627 } else { 1627 } else {
1628 nr_clean_pages++; 1628 nr_clean_pages++;
1629 } 1629 }
diff --git a/fs/direct-io.c b/fs/direct-io.c
index f853263cf74f..38484b08a39a 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -441,8 +441,8 @@ static struct bio *dio_await_one(struct dio *dio)
441static int dio_bio_complete(struct dio *dio, struct bio *bio) 441static int dio_bio_complete(struct dio *dio, struct bio *bio)
442{ 442{
443 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 443 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
444 struct bio_vec *bvec = bio->bi_io_vec; 444 struct bio_vec *bvec;
445 int page_no; 445 unsigned i;
446 446
447 if (!uptodate) 447 if (!uptodate)
448 dio->io_error = -EIO; 448 dio->io_error = -EIO;
@@ -450,8 +450,8 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio)
450 if (dio->is_async && dio->rw == READ) { 450 if (dio->is_async && dio->rw == READ) {
451 bio_check_pages_dirty(bio); /* transfers ownership */ 451 bio_check_pages_dirty(bio); /* transfers ownership */
452 } else { 452 } else {
453 for (page_no = 0; page_no < bio->bi_vcnt; page_no++) { 453 bio_for_each_segment_all(bvec, bio, i) {
454 struct page *page = bvec[page_no].bv_page; 454 struct page *page = bvec->bv_page;
455 455
456 if (dio->rw == READ && !PageCompound(page)) 456 if (dio->rw == READ && !PageCompound(page))
457 set_page_dirty_lock(page); 457 set_page_dirty_lock(page);
diff --git a/mm/bounce.c b/mm/bounce.c
index 2ee1b6fef44a..f5326b24d65d 100644
--- a/mm/bounce.c
+++ b/mm/bounce.c
@@ -231,7 +231,7 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
231bounce: 231bounce:
232 bio = bio_clone_bioset(*bio_orig, GFP_NOIO, fs_bio_set); 232 bio = bio_clone_bioset(*bio_orig, GFP_NOIO, fs_bio_set);
233 233
234 bio_for_each_segment(to, bio, i) { 234 bio_for_each_segment_all(to, bio, i) {
235 struct page *page = to->bv_page; 235 struct page *page = to->bv_page;
236 236
237 if (page_to_pfn(page) <= queue_bounce_pfn(q) && !force) 237 if (page_to_pfn(page) <= queue_bounce_pfn(q) && !force)