|
@@ -209,6 +209,43 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
|
|
|
}
|
|
|
EXPORT_SYMBOL(blk_rq_map_sg);
|
|
|
|
|
|
+/**
|
|
|
+ * blk_bio_map_sg - map a bio to a scatterlist
|
|
|
+ * @q: request_queue in question
|
|
|
+ * @bio: bio being mapped
|
|
|
+ * @sglist: scatterlist being mapped
|
|
|
+ *
|
|
|
+ * Note:
|
|
|
+ * Caller must make sure sg can hold bio->bi_phys_segments entries
|
|
|
+ *
|
|
|
+ * Will return the number of sg entries setup
|
|
|
+ */
|
|
|
+int blk_bio_map_sg(struct request_queue *q, struct bio *bio,
|
|
|
+ struct scatterlist *sglist)
|
|
|
+{
|
|
|
+ struct bio_vec *bvec, *bvprv;
|
|
|
+ struct scatterlist *sg;
|
|
|
+ int nsegs, cluster;
|
|
|
+ unsigned long i;
|
|
|
+
|
|
|
+ nsegs = 0;
|
|
|
+ cluster = blk_queue_cluster(q);
|
|
|
+
|
|
|
+ bvprv = NULL;
|
|
|
+ sg = NULL;
|
|
|
+ bio_for_each_segment(bvec, bio, i) {
|
|
|
+ __blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg,
|
|
|
+ &nsegs, &cluster);
|
|
|
+ } /* segments in bio */
|
|
|
+
|
|
|
+ if (sg)
|
|
|
+ sg_mark_end(sg);
|
|
|
+
|
|
|
+ BUG_ON(bio->bi_phys_segments && nsegs > bio->bi_phys_segments);
|
|
|
+ return nsegs;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(blk_bio_map_sg);
|
|
|
+
|
|
|
static inline int ll_new_hw_segment(struct request_queue *q,
|
|
|
struct request *req,
|
|
|
struct bio *bio)
|