Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-07 Thread Kent Overstreet
On Thu, Nov 07, 2013 at 12:26:30PM +0100, Jan Kara wrote:
> On Mon 04-11-13 15:36:19, Kent Overstreet wrote:
> > With immutable biovecs we don't want code accessing bi_io_vec directly -
> > the uses this patch changes weren't incorrect since they all own the
> > bio, but it makes the code harder to audit for no good reason - also,
> > this will help with multipage bvecs later.
>   I think you've missed the code in fs/ext4/page-io.c in the conversion
> (likely because it was added relatively recently).

Thanks!
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-07 Thread Jan Kara
On Mon 04-11-13 15:36:19, Kent Overstreet wrote:
> With immutable biovecs we don't want code accessing bi_io_vec directly -
> the uses this patch changes weren't incorrect since they all own the
> bio, but it makes the code harder to audit for no good reason - also,
> this will help with multipage bvecs later.
  I think you've missed the code in fs/ext4/page-io.c in the conversion
(likely because it was added relatively recently).

Honza
> 
> Signed-off-by: Kent Overstreet 
> Cc: Jens Axboe 
> Cc: Alexander Viro 
> Cc: Chris Mason 
> Cc: Jaegeuk Kim 
> Cc: Joern Engel 
> Cc: Prasad Joshi 
> Cc: Trond Myklebust 
> ---
>  fs/btrfs/compression.c   | 10 --
>  fs/btrfs/disk-io.c   | 11 ---
>  fs/btrfs/extent_io.c | 37 ++---
>  fs/btrfs/inode.c | 15 ++-
>  fs/f2fs/data.c   | 13 +
>  fs/f2fs/segment.c| 12 +---
>  fs/logfs/dev_bdev.c  | 18 +++---
>  fs/mpage.c   | 17 -
>  fs/nfs/blocklayout/blocklayout.c | 34 +-
>  9 files changed, 66 insertions(+), 101 deletions(-)
> 
> diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
> index 06ab821..52e7848 100644
> --- a/fs/btrfs/compression.c
> +++ b/fs/btrfs/compression.c
> @@ -203,18 +203,16 @@ csum_failed:
>   if (cb->errors) {
>   bio_io_error(cb->orig_bio);
>   } else {
> - int bio_index = 0;
> - struct bio_vec *bvec = cb->orig_bio->bi_io_vec;
> + int i;
> + struct bio_vec *bvec;
>  
>   /*
>* we have verified the checksum already, set page
>* checked so the end_io handlers know about it
>*/
> - while (bio_index < cb->orig_bio->bi_vcnt) {
> + bio_for_each_segment_all(bvec, cb->orig_bio, i)
>   SetPageChecked(bvec->bv_page);
> - bvec++;
> - bio_index++;
> - }
> +
>   bio_endio(cb->orig_bio, 0);
>   }
>  
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 62176ad..733182e 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -850,20 +850,17 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, 
> struct inode *inode,
>  
>  static int btree_csum_one_bio(struct bio *bio)
>  {
> - struct bio_vec *bvec = bio->bi_io_vec;
> - int bio_index = 0;
> + struct bio_vec *bvec;
>   struct btrfs_root *root;
> - int ret = 0;
> + int i, ret = 0;
>  
> - WARN_ON(bio->bi_vcnt <= 0);
> - while (bio_index < bio->bi_vcnt) {
> + bio_for_each_segment_all(bvec, bio, i) {
>   root = BTRFS_I(bvec->bv_page->mapping->host)->root;
>   ret = csum_dirty_buffer(root, bvec->bv_page);
>   if (ret)
>   break;
> - bio_index++;
> - bvec++;
>   }
> +
>   return ret;
>  }
>  
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 0df176a..ea5a08b 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2014,7 +2014,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, 
> u64 start,
>   }
>   bio->bi_bdev = dev->bdev;
>   bio_add_page(bio, page, length, start - page_offset(page));
> - btrfsic_submit_bio(WRITE_SYNC, bio);
> + btrfsic_submit_bio(WRITE_SYNC, bio); /* XXX: submit_bio_wait() */
>   wait_for_completion();
>  
>   if (!test_bit(BIO_UPTODATE, >bi_flags)) {
> @@ -2340,12 +2340,13 @@ int end_extent_writepage(struct page *page, int err, 
> u64 start, u64 end)
>   */
>  static void end_bio_extent_writepage(struct bio *bio, int err)
>  {
> - struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
> + struct bio_vec *bvec;
>   struct extent_io_tree *tree;
>   u64 start;
>   u64 end;
> + int i;
>  
> - do {
> + bio_for_each_segment_all(bvec, bio, i) {
>   struct page *page = bvec->bv_page;
>   tree = _I(page->mapping->host)->io_tree;
>  
> @@ -2363,14 +2364,11 @@ static void end_bio_extent_writepage(struct bio *bio, 
> int err)
>   start = page_offset(page);
>   end = start + bvec->bv_offset + bvec->bv_len - 1;
>  
> - if (--bvec >= bio->bi_io_vec)
> - prefetchw(>bv_page->flags);
> -
>   if (end_extent_writepage(page, err, start, end))
>   continue;
>  
>   end_page_writeback(page);
> - } while (bvec >= bio->bi_io_vec);
> + }
>  
>   bio_put(bio);
>  }
> @@ -2400,9 +2398,8 @@ endio_readpage_release_extent(struct extent_io_tree 
> *tree, u64 start, u64 len,
>   */
>  static void end_bio_extent_readpage(struct bio *bio, int err)
>  {
> + struct bio_vec *bvec;
>   int 

Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-07 Thread Jan Kara
On Mon 04-11-13 15:36:19, Kent Overstreet wrote:
 With immutable biovecs we don't want code accessing bi_io_vec directly -
 the uses this patch changes weren't incorrect since they all own the
 bio, but it makes the code harder to audit for no good reason - also,
 this will help with multipage bvecs later.
  I think you've missed the code in fs/ext4/page-io.c in the conversion
(likely because it was added relatively recently).

Honza
 
 Signed-off-by: Kent Overstreet k...@daterainc.com
 Cc: Jens Axboe ax...@kernel.dk
 Cc: Alexander Viro v...@zeniv.linux.org.uk
 Cc: Chris Mason chris.ma...@fusionio.com
 Cc: Jaegeuk Kim jaegeuk@samsung.com
 Cc: Joern Engel jo...@logfs.org
 Cc: Prasad Joshi prasadjoshi.li...@gmail.com
 Cc: Trond Myklebust trond.mykleb...@netapp.com
 ---
  fs/btrfs/compression.c   | 10 --
  fs/btrfs/disk-io.c   | 11 ---
  fs/btrfs/extent_io.c | 37 ++---
  fs/btrfs/inode.c | 15 ++-
  fs/f2fs/data.c   | 13 +
  fs/f2fs/segment.c| 12 +---
  fs/logfs/dev_bdev.c  | 18 +++---
  fs/mpage.c   | 17 -
  fs/nfs/blocklayout/blocklayout.c | 34 +-
  9 files changed, 66 insertions(+), 101 deletions(-)
 
 diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
 index 06ab821..52e7848 100644
 --- a/fs/btrfs/compression.c
 +++ b/fs/btrfs/compression.c
 @@ -203,18 +203,16 @@ csum_failed:
   if (cb-errors) {
   bio_io_error(cb-orig_bio);
   } else {
 - int bio_index = 0;
 - struct bio_vec *bvec = cb-orig_bio-bi_io_vec;
 + int i;
 + struct bio_vec *bvec;
  
   /*
* we have verified the checksum already, set page
* checked so the end_io handlers know about it
*/
 - while (bio_index  cb-orig_bio-bi_vcnt) {
 + bio_for_each_segment_all(bvec, cb-orig_bio, i)
   SetPageChecked(bvec-bv_page);
 - bvec++;
 - bio_index++;
 - }
 +
   bio_endio(cb-orig_bio, 0);
   }
  
 diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
 index 62176ad..733182e 100644
 --- a/fs/btrfs/disk-io.c
 +++ b/fs/btrfs/disk-io.c
 @@ -850,20 +850,17 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, 
 struct inode *inode,
  
  static int btree_csum_one_bio(struct bio *bio)
  {
 - struct bio_vec *bvec = bio-bi_io_vec;
 - int bio_index = 0;
 + struct bio_vec *bvec;
   struct btrfs_root *root;
 - int ret = 0;
 + int i, ret = 0;
  
 - WARN_ON(bio-bi_vcnt = 0);
 - while (bio_index  bio-bi_vcnt) {
 + bio_for_each_segment_all(bvec, bio, i) {
   root = BTRFS_I(bvec-bv_page-mapping-host)-root;
   ret = csum_dirty_buffer(root, bvec-bv_page);
   if (ret)
   break;
 - bio_index++;
 - bvec++;
   }
 +
   return ret;
  }
  
 diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
 index 0df176a..ea5a08b 100644
 --- a/fs/btrfs/extent_io.c
 +++ b/fs/btrfs/extent_io.c
 @@ -2014,7 +2014,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, 
 u64 start,
   }
   bio-bi_bdev = dev-bdev;
   bio_add_page(bio, page, length, start - page_offset(page));
 - btrfsic_submit_bio(WRITE_SYNC, bio);
 + btrfsic_submit_bio(WRITE_SYNC, bio); /* XXX: submit_bio_wait() */
   wait_for_completion(compl);
  
   if (!test_bit(BIO_UPTODATE, bio-bi_flags)) {
 @@ -2340,12 +2340,13 @@ int end_extent_writepage(struct page *page, int err, 
 u64 start, u64 end)
   */
  static void end_bio_extent_writepage(struct bio *bio, int err)
  {
 - struct bio_vec *bvec = bio-bi_io_vec + bio-bi_vcnt - 1;
 + struct bio_vec *bvec;
   struct extent_io_tree *tree;
   u64 start;
   u64 end;
 + int i;
  
 - do {
 + bio_for_each_segment_all(bvec, bio, i) {
   struct page *page = bvec-bv_page;
   tree = BTRFS_I(page-mapping-host)-io_tree;
  
 @@ -2363,14 +2364,11 @@ static void end_bio_extent_writepage(struct bio *bio, 
 int err)
   start = page_offset(page);
   end = start + bvec-bv_offset + bvec-bv_len - 1;
  
 - if (--bvec = bio-bi_io_vec)
 - prefetchw(bvec-bv_page-flags);
 -
   if (end_extent_writepage(page, err, start, end))
   continue;
  
   end_page_writeback(page);
 - } while (bvec = bio-bi_io_vec);
 + }
  
   bio_put(bio);
  }
 @@ -2400,9 +2398,8 @@ endio_readpage_release_extent(struct extent_io_tree 
 *tree, u64 start, u64 len,
   */
  static void end_bio_extent_readpage(struct bio *bio, int err)
  {
 + struct bio_vec *bvec;
  

Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-07 Thread Kent Overstreet
On Thu, Nov 07, 2013 at 12:26:30PM +0100, Jan Kara wrote:
 On Mon 04-11-13 15:36:19, Kent Overstreet wrote:
  With immutable biovecs we don't want code accessing bi_io_vec directly -
  the uses this patch changes weren't incorrect since they all own the
  bio, but it makes the code harder to audit for no good reason - also,
  this will help with multipage bvecs later.
   I think you've missed the code in fs/ext4/page-io.c in the conversion
 (likely because it was added relatively recently).

Thanks!
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-05 Thread Josef Bacik
On Mon, Nov 04, 2013 at 03:36:19PM -0800, Kent Overstreet wrote:
> With immutable biovecs we don't want code accessing bi_io_vec directly -
> the uses this patch changes weren't incorrect since they all own the
> bio, but it makes the code harder to audit for no good reason - also,
> this will help with multipage bvecs later.
> 

The btrfs parts of this look good to me, you can add

Reviewed-by: Josef Bacik 

Thanks for this,

Josef
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-05 Thread Josef Bacik
On Mon, Nov 04, 2013 at 03:36:19PM -0800, Kent Overstreet wrote:
 With immutable biovecs we don't want code accessing bi_io_vec directly -
 the uses this patch changes weren't incorrect since they all own the
 bio, but it makes the code harder to audit for no good reason - also,
 this will help with multipage bvecs later.
 

The btrfs parts of this look good to me, you can add

Reviewed-by: Josef Bacik jba...@fusionio.com

Thanks for this,

Josef
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-04 Thread Kent Overstreet
With immutable biovecs we don't want code accessing bi_io_vec directly -
the uses this patch changes weren't incorrect since they all own the
bio, but it makes the code harder to audit for no good reason - also,
this will help with multipage bvecs later.

Signed-off-by: Kent Overstreet 
Cc: Jens Axboe 
Cc: Alexander Viro 
Cc: Chris Mason 
Cc: Jaegeuk Kim 
Cc: Joern Engel 
Cc: Prasad Joshi 
Cc: Trond Myklebust 
---
 fs/btrfs/compression.c   | 10 --
 fs/btrfs/disk-io.c   | 11 ---
 fs/btrfs/extent_io.c | 37 ++---
 fs/btrfs/inode.c | 15 ++-
 fs/f2fs/data.c   | 13 +
 fs/f2fs/segment.c| 12 +---
 fs/logfs/dev_bdev.c  | 18 +++---
 fs/mpage.c   | 17 -
 fs/nfs/blocklayout/blocklayout.c | 34 +-
 9 files changed, 66 insertions(+), 101 deletions(-)

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 06ab821..52e7848 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -203,18 +203,16 @@ csum_failed:
if (cb->errors) {
bio_io_error(cb->orig_bio);
} else {
-   int bio_index = 0;
-   struct bio_vec *bvec = cb->orig_bio->bi_io_vec;
+   int i;
+   struct bio_vec *bvec;
 
/*
 * we have verified the checksum already, set page
 * checked so the end_io handlers know about it
 */
-   while (bio_index < cb->orig_bio->bi_vcnt) {
+   bio_for_each_segment_all(bvec, cb->orig_bio, i)
SetPageChecked(bvec->bv_page);
-   bvec++;
-   bio_index++;
-   }
+
bio_endio(cb->orig_bio, 0);
}
 
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 62176ad..733182e 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -850,20 +850,17 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, 
struct inode *inode,
 
 static int btree_csum_one_bio(struct bio *bio)
 {
-   struct bio_vec *bvec = bio->bi_io_vec;
-   int bio_index = 0;
+   struct bio_vec *bvec;
struct btrfs_root *root;
-   int ret = 0;
+   int i, ret = 0;
 
-   WARN_ON(bio->bi_vcnt <= 0);
-   while (bio_index < bio->bi_vcnt) {
+   bio_for_each_segment_all(bvec, bio, i) {
root = BTRFS_I(bvec->bv_page->mapping->host)->root;
ret = csum_dirty_buffer(root, bvec->bv_page);
if (ret)
break;
-   bio_index++;
-   bvec++;
}
+
return ret;
 }
 
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 0df176a..ea5a08b 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2014,7 +2014,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 
start,
}
bio->bi_bdev = dev->bdev;
bio_add_page(bio, page, length, start - page_offset(page));
-   btrfsic_submit_bio(WRITE_SYNC, bio);
+   btrfsic_submit_bio(WRITE_SYNC, bio); /* XXX: submit_bio_wait() */
wait_for_completion();
 
if (!test_bit(BIO_UPTODATE, >bi_flags)) {
@@ -2340,12 +2340,13 @@ int end_extent_writepage(struct page *page, int err, 
u64 start, u64 end)
  */
 static void end_bio_extent_writepage(struct bio *bio, int err)
 {
-   struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
+   struct bio_vec *bvec;
struct extent_io_tree *tree;
u64 start;
u64 end;
+   int i;
 
-   do {
+   bio_for_each_segment_all(bvec, bio, i) {
struct page *page = bvec->bv_page;
tree = _I(page->mapping->host)->io_tree;
 
@@ -2363,14 +2364,11 @@ static void end_bio_extent_writepage(struct bio *bio, 
int err)
start = page_offset(page);
end = start + bvec->bv_offset + bvec->bv_len - 1;
 
-   if (--bvec >= bio->bi_io_vec)
-   prefetchw(>bv_page->flags);
-
if (end_extent_writepage(page, err, start, end))
continue;
 
end_page_writeback(page);
-   } while (bvec >= bio->bi_io_vec);
+   }
 
bio_put(bio);
 }
@@ -2400,9 +2398,8 @@ endio_readpage_release_extent(struct extent_io_tree 
*tree, u64 start, u64 len,
  */
 static void end_bio_extent_readpage(struct bio *bio, int err)
 {
+   struct bio_vec *bvec;
int uptodate = test_bit(BIO_UPTODATE, >bi_flags);
-   struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
-   struct bio_vec *bvec = bio->bi_io_vec;
struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
struct extent_io_tree *tree;
u64 offset = 0;
@@ -2413,11 +2410,12 @@ static void end_bio_extent_readpage(struct bio *bio, 
int err)
u64 extent_len = 

[PATCH 1/9] block: Convert various code to bio_for_each_segment()

2013-11-04 Thread Kent Overstreet
With immutable biovecs we don't want code accessing bi_io_vec directly -
the uses this patch changes weren't incorrect since they all own the
bio, but it makes the code harder to audit for no good reason - also,
this will help with multipage bvecs later.

Signed-off-by: Kent Overstreet k...@daterainc.com
Cc: Jens Axboe ax...@kernel.dk
Cc: Alexander Viro v...@zeniv.linux.org.uk
Cc: Chris Mason chris.ma...@fusionio.com
Cc: Jaegeuk Kim jaegeuk@samsung.com
Cc: Joern Engel jo...@logfs.org
Cc: Prasad Joshi prasadjoshi.li...@gmail.com
Cc: Trond Myklebust trond.mykleb...@netapp.com
---
 fs/btrfs/compression.c   | 10 --
 fs/btrfs/disk-io.c   | 11 ---
 fs/btrfs/extent_io.c | 37 ++---
 fs/btrfs/inode.c | 15 ++-
 fs/f2fs/data.c   | 13 +
 fs/f2fs/segment.c| 12 +---
 fs/logfs/dev_bdev.c  | 18 +++---
 fs/mpage.c   | 17 -
 fs/nfs/blocklayout/blocklayout.c | 34 +-
 9 files changed, 66 insertions(+), 101 deletions(-)

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 06ab821..52e7848 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -203,18 +203,16 @@ csum_failed:
if (cb-errors) {
bio_io_error(cb-orig_bio);
} else {
-   int bio_index = 0;
-   struct bio_vec *bvec = cb-orig_bio-bi_io_vec;
+   int i;
+   struct bio_vec *bvec;
 
/*
 * we have verified the checksum already, set page
 * checked so the end_io handlers know about it
 */
-   while (bio_index  cb-orig_bio-bi_vcnt) {
+   bio_for_each_segment_all(bvec, cb-orig_bio, i)
SetPageChecked(bvec-bv_page);
-   bvec++;
-   bio_index++;
-   }
+
bio_endio(cb-orig_bio, 0);
}
 
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 62176ad..733182e 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -850,20 +850,17 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, 
struct inode *inode,
 
 static int btree_csum_one_bio(struct bio *bio)
 {
-   struct bio_vec *bvec = bio-bi_io_vec;
-   int bio_index = 0;
+   struct bio_vec *bvec;
struct btrfs_root *root;
-   int ret = 0;
+   int i, ret = 0;
 
-   WARN_ON(bio-bi_vcnt = 0);
-   while (bio_index  bio-bi_vcnt) {
+   bio_for_each_segment_all(bvec, bio, i) {
root = BTRFS_I(bvec-bv_page-mapping-host)-root;
ret = csum_dirty_buffer(root, bvec-bv_page);
if (ret)
break;
-   bio_index++;
-   bvec++;
}
+
return ret;
 }
 
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 0df176a..ea5a08b 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2014,7 +2014,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 
start,
}
bio-bi_bdev = dev-bdev;
bio_add_page(bio, page, length, start - page_offset(page));
-   btrfsic_submit_bio(WRITE_SYNC, bio);
+   btrfsic_submit_bio(WRITE_SYNC, bio); /* XXX: submit_bio_wait() */
wait_for_completion(compl);
 
if (!test_bit(BIO_UPTODATE, bio-bi_flags)) {
@@ -2340,12 +2340,13 @@ int end_extent_writepage(struct page *page, int err, 
u64 start, u64 end)
  */
 static void end_bio_extent_writepage(struct bio *bio, int err)
 {
-   struct bio_vec *bvec = bio-bi_io_vec + bio-bi_vcnt - 1;
+   struct bio_vec *bvec;
struct extent_io_tree *tree;
u64 start;
u64 end;
+   int i;
 
-   do {
+   bio_for_each_segment_all(bvec, bio, i) {
struct page *page = bvec-bv_page;
tree = BTRFS_I(page-mapping-host)-io_tree;
 
@@ -2363,14 +2364,11 @@ static void end_bio_extent_writepage(struct bio *bio, 
int err)
start = page_offset(page);
end = start + bvec-bv_offset + bvec-bv_len - 1;
 
-   if (--bvec = bio-bi_io_vec)
-   prefetchw(bvec-bv_page-flags);
-
if (end_extent_writepage(page, err, start, end))
continue;
 
end_page_writeback(page);
-   } while (bvec = bio-bi_io_vec);
+   }
 
bio_put(bio);
 }
@@ -2400,9 +2398,8 @@ endio_readpage_release_extent(struct extent_io_tree 
*tree, u64 start, u64 len,
  */
 static void end_bio_extent_readpage(struct bio *bio, int err)
 {
+   struct bio_vec *bvec;
int uptodate = test_bit(BIO_UPTODATE, bio-bi_flags);
-   struct bio_vec *bvec_end = bio-bi_io_vec + bio-bi_vcnt - 1;
-   struct bio_vec *bvec = bio-bi_io_vec;
struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
struct