diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-09-25 13:38:28 -0700 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-06-17 18:26:00 -0700 |
commit | 871f5765108dc96c983b0452f7eff66fd2580dea (patch) | |
tree | 5784dddff05b7cce06b454cb3e07a750908e9052 | |
parent | be646fb741b4ac289b9359296be3ddfe00567761 (diff) |
convert nvme to blk_max_segment()
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
-rw-r--r-- | drivers/block/nvme-core.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index b756403b327a..62ab42420a0d 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c @@ -543,6 +543,7 @@ static int nvme_split_and_submit(struct bio *bio, struct nvme_queue *nvmeq, static int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod, struct bio *bio, enum dma_data_direction dma_dir, int psegs) { + struct request_queue *q = bdev_get_queue(bio->bi_bdev); struct bio_vec bvec, bvprv; struct bvec_iter iter; struct scatterlist *sg = NULL; @@ -555,26 +556,26 @@ static int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod, (nvmeq->dev->stripe_size - 1)); sg_init_table(iod->sg, psegs); - bio_for_each_segment(bvec, bio, iter) { - if (!first && BIOVEC_PHYS_MERGEABLE(&bvprv, &bvec)) { - sg->length += bvec.bv_len; - } else { - if (!first && BIOVEC_NOT_VIRT_MERGEABLE(&bvprv, &bvec)) - return nvme_split_and_submit(bio, nvmeq, - length); - - sg = sg ? sg + 1 : iod->sg; - sg_set_page(sg, bvec.bv_page, - bvec.bv_len, bvec.bv_offset); - nsegs++; - } - if (split_len - length < bvec.bv_len) - return nvme_split_and_submit(bio, nvmeq, split_len); + iter = bio->bi_iter; + while (iter.bi_size) { + bvec = bio_iovec_iter(bio, iter); + bvec.bv_len = blk_max_segment(q, &bvec); + + if (!first && BIOVEC_NOT_VIRT_MERGEABLE(&bvprv, &bvec)) + return nvme_split_and_submit(bio, nvmeq, length); + + sg = sg ? sg + 1 : iod->sg; + sg_set_page(sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset); + nsegs++; + length += bvec.bv_len; bvprv = bvec; first = 0; + + bio_advance_iter(bio, &iter, bvec.bv_len); } + iod->nents = nsegs; sg_mark_end(sg); if (dma_map_sg(nvmeq->q_dmadev, iod->sg, iod->nents, dma_dir) == 0) |