Btrfs: new helper btrfs_bio_clone_partial

This adds a new helper btrfs_bio_clone_partial, it'll allocate a cloned
bio that only owns a part of the original bio's data.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Liu Bo 2017-05-15 17:43:31 -07:00 committed by David Sterba
parent 015c1bd9f1
commit 2f8e914042
2 changed files with 20 additions and 0 deletions

View File

@ -2720,6 +2720,24 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
return bio; return bio;
} }
struct bio *btrfs_bio_clone_partial(struct bio *orig, gfp_t gfp_mask,
int offset, int size)
{
struct bio *bio;
struct btrfs_io_bio *btrfs_bio;
/* this will never fail when it's backed by a bioset */
bio = bio_clone_fast(orig, gfp_mask, btrfs_bioset);
ASSERT(bio);
btrfs_bio = btrfs_io_bio(bio);
btrfs_bio->csum = NULL;
btrfs_bio->csum_allocated = NULL;
btrfs_bio->end_io = NULL;
bio_trim(bio, offset >> 9, size >> 9);
return bio;
}
static int __must_check submit_one_bio(struct bio *bio, int mirror_num, static int __must_check submit_one_bio(struct bio *bio, int mirror_num,
unsigned long bio_flags) unsigned long bio_flags)

View File

@ -467,6 +467,8 @@ btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
gfp_t gfp_flags); gfp_t gfp_flags);
struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs); struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs);
struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask); struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask);
struct bio *btrfs_bio_clone_partial(struct bio *orig, gfp_t gfp_mask,
int offset, int size);
struct btrfs_fs_info; struct btrfs_fs_info;
struct btrfs_inode; struct btrfs_inode;