lkml.org 
[lkml]   [2012]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V5 2/4] block: Add blk_bio_map_sg() helper
    Date
    Add a helper to map a bio to a scatterlist, modelled after
    blk_rq_map_sg.

    This helper is useful for any driver that wants to create
    a scatterlist from its ->make_request_fn method.

    Changes in v2:
    - Use __blk_segment_map_sg to avoid duplicated code
    - Add cocbook style function comment

    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Shaohua Li <shli@kernel.org>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: kvm@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Cc: virtualization@lists.linux-foundation.org
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Minchan Kim <minchan.kim@gmail.com>
    Signed-off-by: Asias He <asias@redhat.com>
    ---
    block/blk-merge.c | 37 +++++++++++++++++++++++++++++++++++++
    include/linux/blkdev.h | 2 ++
    2 files changed, 39 insertions(+)

    diff --git a/block/blk-merge.c b/block/blk-merge.c
    index 576b68e..e76279e 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,
    }
    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)
    diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
    index 4e72a9d..d261cbb 100644
    --- a/include/linux/blkdev.h
    +++ b/include/linux/blkdev.h
    @@ -894,6 +894,8 @@ extern void blk_queue_flush_queueable(struct request_queue *q, bool queueable);
    extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);

    extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
    +extern int blk_bio_map_sg(struct request_queue *q, struct bio *bio,
    + struct scatterlist *sglist);
    extern void blk_dump_rq_flags(struct request *, char *);
    extern long nr_blockdev_pages(void);

    --
    1.7.11.2


    \
     
     \ /
      Last update: 2012-08-02 09:01    [W:0.033 / U:0.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site