Commit 542e300e authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba

btrfs: support cloned bios in btree_csum_one_bio

To allow splitting bios in btrfs_submit_bio, btree_csum_one_bio needs to
be able to handle cloned bios.  As btree_csum_one_bio is always called
before handing the bio to the block layer that is trivially done by using
bio_for_each_segment instead of bio_for_each_segment_all.  Also switch
the function to take a btrfs_bio and use that to derive the fs_info.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 69ccf3f4
...@@ -437,7 +437,7 @@ static void __btrfs_submit_bio(struct bio *bio, struct btrfs_io_context *bioc, ...@@ -437,7 +437,7 @@ static void __btrfs_submit_bio(struct bio *bio, struct btrfs_io_context *bioc,
static blk_status_t btrfs_bio_csum(struct btrfs_bio *bbio) static blk_status_t btrfs_bio_csum(struct btrfs_bio *bbio)
{ {
if (bbio->bio.bi_opf & REQ_META) if (bbio->bio.bi_opf & REQ_META)
return btree_csum_one_bio(&bbio->bio); return btree_csum_one_bio(bbio);
return btrfs_csum_one_bio(bbio); return btrfs_csum_one_bio(bbio);
} }
......
...@@ -438,17 +438,15 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct bio_vec *bvec ...@@ -438,17 +438,15 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct bio_vec *bvec
return csum_one_extent_buffer(eb); return csum_one_extent_buffer(eb);
} }
blk_status_t btree_csum_one_bio(struct bio *bio) blk_status_t btree_csum_one_bio(struct btrfs_bio *bbio)
{ {
struct bio_vec *bvec; struct btrfs_fs_info *fs_info = bbio->inode->root->fs_info;
struct btrfs_root *root; struct bvec_iter iter;
struct bvec_iter_all iter_all; struct bio_vec bv;
int ret = 0; int ret = 0;
ASSERT(!bio_flagged(bio, BIO_CLONED)); bio_for_each_segment(bv, &bbio->bio, iter) {
bio_for_each_segment_all(bvec, bio, iter_all) { ret = csum_dirty_buffer(fs_info, &bv);
root = BTRFS_I(bvec->bv_page->mapping->host)->root;
ret = csum_dirty_buffer(root->fs_info, bvec);
if (ret) if (ret)
break; break;
} }
......
...@@ -114,7 +114,7 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, ...@@ -114,7 +114,7 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid,
int btrfs_read_extent_buffer(struct extent_buffer *buf, int btrfs_read_extent_buffer(struct extent_buffer *buf,
struct btrfs_tree_parent_check *check); struct btrfs_tree_parent_check *check);
blk_status_t btree_csum_one_bio(struct bio *bio); blk_status_t btree_csum_one_bio(struct btrfs_bio *bbio);
int btrfs_alloc_log_tree_node(struct btrfs_trans_handle *trans, int btrfs_alloc_log_tree_node(struct btrfs_trans_handle *trans,
struct btrfs_root *root); struct btrfs_root *root);
int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans, int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment