Re: [PATCH 1/9] block: Convert various code to bio_for_each_segment()
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()
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()
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()
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()
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()
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()
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()
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