diff options
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-merge.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index 576b68e7924..e76279e4116 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
| @@ -209,6 +209,43 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, | |||
| 209 | } | 209 | } |
| 210 | EXPORT_SYMBOL(blk_rq_map_sg); | 210 | EXPORT_SYMBOL(blk_rq_map_sg); |
| 211 | 211 | ||
| 212 | /** | ||
| 213 | * blk_bio_map_sg - map a bio to a scatterlist | ||
| 214 | * @q: request_queue in question | ||
| 215 | * @bio: bio being mapped | ||
| 216 | * @sglist: scatterlist being mapped | ||
| 217 | * | ||
| 218 | * Note: | ||
| 219 | * Caller must make sure sg can hold bio->bi_phys_segments entries | ||
| 220 | * | ||
| 221 | * Will return the number of sg entries setup | ||
| 222 | */ | ||
| 223 | int blk_bio_map_sg(struct request_queue *q, struct bio *bio, | ||
| 224 | struct scatterlist *sglist) | ||
| 225 | { | ||
| 226 | struct bio_vec *bvec, *bvprv; | ||
| 227 | struct scatterlist *sg; | ||
| 228 | int nsegs, cluster; | ||
| 229 | unsigned long i; | ||
| 230 | |||
| 231 | nsegs = 0; | ||
| 232 | cluster = blk_queue_cluster(q); | ||
| 233 | |||
| 234 | bvprv = NULL; | ||
| 235 | sg = NULL; | ||
| 236 | bio_for_each_segment(bvec, bio, i) { | ||
| 237 | __blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg, | ||
| 238 | &nsegs, &cluster); | ||
| 239 | } /* segments in bio */ | ||
| 240 | |||
| 241 | if (sg) | ||
| 242 | sg_mark_end(sg); | ||
| 243 | |||
| 244 | BUG_ON(bio->bi_phys_segments && nsegs > bio->bi_phys_segments); | ||
| 245 | return nsegs; | ||
| 246 | } | ||
| 247 | EXPORT_SYMBOL(blk_bio_map_sg); | ||
| 248 | |||
| 212 | static inline int ll_new_hw_segment(struct request_queue *q, | 249 | static inline int ll_new_hw_segment(struct request_queue *q, |
| 213 | struct request *req, | 250 | struct request *req, |
| 214 | struct bio *bio) | 251 | struct bio *bio) |
