Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f565913e authored by Jens Axboe's avatar Jens Axboe
Browse files

block: convert to using sg helpers



Convert the main rq mapper (blk_rq_map_sg()) to the sg helper setup.

Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 96b418c9
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/cpu.h>
#include <linux/blktrace_api.h>
#include <linux/fault-inject.h>
#include <linux/scatterlist.h>

/*
 * for max sense size
@@ -1318,9 +1319,10 @@ static int blk_hw_contig_segment(struct request_queue *q, struct bio *bio,
 * must make sure sg can hold rq->nr_phys_segments entries
 */
int blk_rq_map_sg(struct request_queue *q, struct request *rq,
		  struct scatterlist *sg)
		  struct scatterlist *sglist)
{
	struct bio_vec *bvec, *bvprv;
	struct scatterlist *next_sg, *sg;
	struct req_iterator iter;
	int nsegs, cluster;

@@ -1331,11 +1333,12 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
	 * for each bio in rq
	 */
	bvprv = NULL;
	sg = next_sg = &sglist[0];
	rq_for_each_segment(bvec, rq, iter) {
		int nbytes = bvec->bv_len;

		if (bvprv && cluster) {
			if (sg[nsegs - 1].length + nbytes > q->max_segment_size)
			if (sg->length + nbytes > q->max_segment_size)
				goto new_segment;

			if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec))
@@ -1343,14 +1346,15 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
			if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec))
				goto new_segment;

			sg[nsegs - 1].length += nbytes;
			sg->length += nbytes;
		} else {
new_segment:
			memset(&sg[nsegs],0,sizeof(struct scatterlist));
			sg[nsegs].page = bvec->bv_page;
			sg[nsegs].length = nbytes;
			sg[nsegs].offset = bvec->bv_offset;
			sg = next_sg;
			next_sg = sg_next(sg);

			sg->page = bvec->bv_page;
			sg->length = nbytes;
			sg->offset = bvec->bv_offset;
			nsegs++;
		}
		bvprv = bvec;