@ -625,21 +625,20 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t gfp_mask, struct bio_set *bs)
}
EXPORT_SYMBOL ( bio_clone_fast ) ;
/**
* bio_clone_bioset - clone a bio
* @ bio_src : bio to clone
* @ gfp_mask : allocation priority
* @ bs : bio_set to allocate from
*
* Clone bio . Caller will own the returned bio , but not the actual data it
* points to . Reference count of returned bio will be one .
*/
struct bio * bio_clone_bioset ( struct bio * bio_src , gfp_t gfp_mask ,
struct bio_set * bs )
static struct bio * __bio_clone_bioset ( struct bio * bio_src , gfp_t gfp_mask ,
struct bio_set * bs , int offset ,
int size )
{
struct bvec_iter iter ;
struct bio_vec bv ;
struct bio * bio ;
struct bvec_iter iter_src = bio_src - > bi_iter ;
/* for supporting partial clone */
if ( offset | | size ! = bio_src - > bi_iter . bi_size ) {
bio_advance_iter ( bio_src , & iter_src , offset ) ;
iter_src . bi_size = size ;
}
/*
* 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,
* __bio_clone_fast ( ) anyways .
*/
bio = bio_alloc_bioset ( gfp_mask , bio_segments ( bio_src ) , bs ) ;
bio = bio_alloc_bioset ( gfp_mask , __bio_segments ( bio_src ,
& iter_src ) , bs ) ;
if ( ! bio )
return NULL ;
bio - > bi_bdev = bio_src - > bi_bdev ;
@ -680,7 +680,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
bio - > bi_io_vec [ bio - > bi_vcnt + + ] = bio_src - > bi_io_vec [ 0 ] ;
break ;
default :
bio_for_each_segment ( bv , bio_src , iter )
__ bio_for_each_segment( bv , bio_src , iter , iter_src )
bio - > bi_io_vec [ bio - > bi_vcnt + + ] = bv ;
break ;
}
@ -699,8 +699,43 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
return bio ;
}
/**
* bio_clone_bioset - clone a bio
* @ bio_src : bio to clone
* @ gfp_mask : allocation priority
* @ bs : bio_set to allocate from
*
* Clone bio . Caller will own the returned bio , but not the actual data it
* points to . Reference count of returned bio will be one .
*/
struct bio * bio_clone_bioset ( struct bio * bio_src , gfp_t gfp_mask ,
struct bio_set * bs )
{
return __bio_clone_bioset ( bio_src , gfp_mask , bs , 0 ,
bio_src - > bi_iter . bi_size ) ;
}
EXPORT_SYMBOL ( bio_clone_bioset ) ;
/**
* bio_clone_bioset_partial - clone a partial bio
* @ bio_src : bio to clone
* @ gfp_mask : allocation priority
* @ bs : bio_set to allocate from
* @ offset : cloned starting from the offset
* @ size : size for the cloned bio
*
* Clone bio . Caller will own the returned bio , but not the actual data it
* points to . Reference count of returned bio will be one .
*/
struct bio * bio_clone_bioset_partial ( struct bio * bio_src , gfp_t gfp_mask ,
struct bio_set * bs , int offset ,
int size )
{
return __bio_clone_bioset ( bio_src , gfp_mask , bs , offset , size ) ;
}
EXPORT_SYMBOL ( bio_clone_bioset_partial ) ;
/**
* bio_add_pc_page - attempt to add page to bio
* @ q : the target queue