@@ -625,21 +625,20 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t gfp_mask, struct bio_set *bs)
625
625
}
626
626
EXPORT_SYMBOL (bio_clone_fast );
627
627
628
- /**
629
- * bio_clone_bioset - clone a bio
630
- * @bio_src: bio to clone
631
- * @gfp_mask: allocation priority
632
- * @bs: bio_set to allocate from
633
- *
634
- * Clone bio. Caller will own the returned bio, but not the actual data it
635
- * points to. Reference count of returned bio will be one.
636
- */
637
- struct bio * bio_clone_bioset (struct bio * bio_src , gfp_t gfp_mask ,
638
- struct bio_set * bs )
628
+ static struct bio * __bio_clone_bioset (struct bio * bio_src , gfp_t gfp_mask ,
629
+ struct bio_set * bs , int offset ,
630
+ int size )
639
631
{
640
632
struct bvec_iter iter ;
641
633
struct bio_vec bv ;
642
634
struct bio * bio ;
635
+ struct bvec_iter iter_src = bio_src -> bi_iter ;
636
+
637
+ /* for supporting partial clone */
638
+ if (offset || size != bio_src -> bi_iter .bi_size ) {
639
+ bio_advance_iter (bio_src , & iter_src , offset );
640
+ iter_src .bi_size = size ;
641
+ }
643
642
644
643
/*
645
644
* Pre immutable biovecs, __bio_clone() used to just do a memcpy from
@@ -663,7 +662,8 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
663
662
* __bio_clone_fast() anyways.
664
663
*/
665
664
666
- bio = bio_alloc_bioset (gfp_mask , bio_segments (bio_src ), bs );
665
+ bio = bio_alloc_bioset (gfp_mask , __bio_segments (bio_src ,
666
+ & iter_src ), bs );
667
667
if (!bio )
668
668
return NULL ;
669
669
bio -> bi_bdev = bio_src -> bi_bdev ;
@@ -680,7 +680,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
680
680
bio -> bi_io_vec [bio -> bi_vcnt ++ ] = bio_src -> bi_io_vec [0 ];
681
681
break ;
682
682
default :
683
- bio_for_each_segment (bv , bio_src , iter )
683
+ __bio_for_each_segment (bv , bio_src , iter , iter_src )
684
684
bio -> bi_io_vec [bio -> bi_vcnt ++ ] = bv ;
685
685
break ;
686
686
}
@@ -699,8 +699,43 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
699
699
700
700
return bio ;
701
701
}
702
+
703
+ /**
704
+ * bio_clone_bioset - clone a bio
705
+ * @bio_src: bio to clone
706
+ * @gfp_mask: allocation priority
707
+ * @bs: bio_set to allocate from
708
+ *
709
+ * Clone bio. Caller will own the returned bio, but not the actual data it
710
+ * points to. Reference count of returned bio will be one.
711
+ */
712
+ struct bio * bio_clone_bioset (struct bio * bio_src , gfp_t gfp_mask ,
713
+ struct bio_set * bs )
714
+ {
715
+ return __bio_clone_bioset (bio_src , gfp_mask , bs , 0 ,
716
+ bio_src -> bi_iter .bi_size );
717
+ }
702
718
EXPORT_SYMBOL (bio_clone_bioset );
703
719
720
+ /**
721
+ * bio_clone_bioset_partial - clone a partial bio
722
+ * @bio_src: bio to clone
723
+ * @gfp_mask: allocation priority
724
+ * @bs: bio_set to allocate from
725
+ * @offset: cloned starting from the offset
726
+ * @size: size for the cloned bio
727
+ *
728
+ * Clone bio. Caller will own the returned bio, but not the actual data it
729
+ * points to. Reference count of returned bio will be one.
730
+ */
731
+ struct bio * bio_clone_bioset_partial (struct bio * bio_src , gfp_t gfp_mask ,
732
+ struct bio_set * bs , int offset ,
733
+ int size )
734
+ {
735
+ return __bio_clone_bioset (bio_src , gfp_mask , bs , offset , size );
736
+ }
737
+ EXPORT_SYMBOL (bio_clone_bioset_partial );
738
+
704
739
/**
705
740
* bio_add_pc_page - attempt to add page to bio
706
741
* @q: the target queue
0 commit comments