Btrfs: new helper btrfs_bio_clone_partial
authorLiu Bo <bo.li.liu@oracle.com>
Tue, 16 May 2017 00:43:31 +0000 (17:43 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2017 16:25:58 +0000 (18:25 +0200)
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>
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h

index 292e458b2a9d74547883258dfb34ce13fbe26c0b..db2bbf92b4bcf1f2e864ca33a598f3d52e670420 100644 (file)
@@ -2720,6 +2720,24 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
        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,
                                       unsigned long bio_flags)
index 1383afdf1eebc944ec7667252e44cd848f2af6a9..3df018549ce44ee5a1e73ccba6d37576ef50f3f2 100644 (file)
@@ -467,6 +467,8 @@ btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
                gfp_t gfp_flags);
 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_partial(struct bio *orig, gfp_t gfp_mask,
+                                   int offset, int size);
 
 struct btrfs_fs_info;
 struct btrfs_inode;