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: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
69ccf3f424
commit
542e300e83
|
@ -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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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_root *root;
|
||||
struct bvec_iter_all iter_all;
|
||||
struct btrfs_fs_info *fs_info = bbio->inode->root->fs_info;
|
||||
struct bvec_iter iter;
|
||||
struct bio_vec bv;
|
||||
int ret = 0;
|
||||
|
||||
ASSERT(!bio_flagged(bio, BIO_CLONED));
|
||||
bio_for_each_segment_all(bvec, bio, iter_all) {
|
||||
root = BTRFS_I(bvec->bv_page->mapping->host)->root;
|
||||
ret = csum_dirty_buffer(root->fs_info, bvec);
|
||||
bio_for_each_segment(bv, &bbio->bio, iter) {
|
||||
ret = csum_dirty_buffer(fs_info, &bv);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid,
|
|||
int btrfs_read_extent_buffer(struct extent_buffer *buf,
|
||||
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,
|
||||
struct btrfs_root *root);
|
||||
int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
|
||||
|
|
Loading…
Reference in New Issue