[PATCH v2 7/9] block: kill merge_bvec_fn() completely
From: Kent Overstreet As generic_make_request() is now able to handle arbitrarily sized bios, it's no longer necessary for each individual block driver to define its own ->merge_bvec_fn() callback. Remove every invocation completely. Cc: Jens Axboe Cc: Lars Ellenberg Cc: drbd-u...@lists.linbit.com Cc: Jiri Kosina Cc: Yehuda Sadeh Cc: Sage Weil Cc: Alex Elder Cc: ceph-de...@vger.kernel.org Cc: Alasdair Kergon Cc: Mike Snitzer Cc: dm-de...@redhat.com Cc: Neil Brown Cc: linux-r...@vger.kernel.org Cc: Christoph Hellwig Cc: "Martin K. Petersen" Signed-off-by: Kent Overstreet [dpark: also remove ->merge_bvec_fn() in dm-thin as well as dm-era-target, and resolve merge conflicts] Signed-off-by: Dongsu Park --- block/blk-merge.c | 17 +- block/blk-settings.c | 22 drivers/block/drbd/drbd_int.h | 1 - drivers/block/drbd/drbd_main.c | 1 - drivers/block/drbd/drbd_req.c | 35 drivers/block/pktcdvd.c| 21 --- drivers/block/rbd.c| 47 drivers/md/dm-cache-target.c | 21 --- drivers/md/dm-crypt.c | 16 -- drivers/md/dm-era-target.c | 15 - drivers/md/dm-flakey.c | 16 -- drivers/md/dm-linear.c | 16 -- drivers/md/dm-snap.c | 15 - drivers/md/dm-stripe.c | 21 --- drivers/md/dm-table.c | 8 --- drivers/md/dm-thin.c | 31 --- drivers/md/dm-verity.c | 16 -- drivers/md/dm.c| 120 +--- drivers/md/dm.h| 2 - drivers/md/linear.c| 46 drivers/md/md.c| 2 - drivers/md/md.h| 8 --- drivers/md/multipath.c | 21 --- drivers/md/raid0.c | 57 --- drivers/md/raid0.h | 2 - drivers/md/raid1.c | 59 +--- drivers/md/raid10.c| 122 + drivers/md/raid5.c | 28 -- include/linux/blkdev.h | 10 include/linux/device-mapper.h | 4 -- 30 files changed, 9 insertions(+), 791 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 3bc2068..8cd7a83 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -69,24 +69,13 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, struct bio *split; struct bio_vec bv = { 0 }, bvprv = { 0 }; struct bvec_iter iter; - unsigned seg_size = 0, nsegs = 0; + unsigned seg_size = 0, nsegs = 0, sectors = 0; int prev = 0; - struct bvec_merge_data bvm = { - .bi_bdev= bio->bi_bdev, - .bi_sector = bio->bi_iter.bi_sector, - .bi_size= 0, - .bi_rw = bio->bi_rw, - }; - bio_for_each_segment(bv, bio, iter) { - if (q->merge_bvec_fn && - q->merge_bvec_fn(q, , ) < (int) bv.bv_len) - goto split; - - bvm.bi_size += bv.bv_len; + sectors += bv.bv_len >> 9; - if (bvm.bi_size >> 9 > queue_max_sectors(q)) + if (sectors > queue_max_sectors(q)) goto split; if (prev && blk_queue_cluster(q)) { diff --git a/block/blk-settings.c b/block/blk-settings.c index 6ed2cbe..463a10a 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -53,28 +53,6 @@ void blk_queue_unprep_rq(struct request_queue *q, unprep_rq_fn *ufn) } EXPORT_SYMBOL(blk_queue_unprep_rq); -/** - * blk_queue_merge_bvec - set a merge_bvec function for queue - * @q: queue - * @mbfn: merge_bvec_fn - * - * Usually queues have static limitations on the max sectors or segments that - * we can put in a request. Stacking drivers may have some settings that - * are dynamic, and thus we have to query the queue whether it is ok to - * add a new bio_vec to a bio at a given offset or not. If the block device - * has such limitations, it needs to register a merge_bvec_fn to control - * the size of bio's sent to it. Note that a block device *must* allow a - * single page to be added to an empty bio. The block device driver may want - * to use the bio_split() function to deal with these bio's. By default - * no merge_bvec_fn is defined for a queue, and only the fixed limits are - * honored. - */ -void blk_queue_merge_bvec(struct request_queue *q, merge_bvec_fn *mbfn) -{ - q->merge_bvec_fn = mbfn; -} -EXPORT_SYMBOL(blk_queue_merge_bvec); - void blk_queue_softirq_done(struct request_queue *q, softirq_done_fn *fn) { q->softirq_done_fn = fn; diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index b905e98..63ce2b0 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1449,7 +1449,6 @@ extern void do_submit(struct work_struct *ws);
[PATCH v2 7/9] block: kill merge_bvec_fn() completely
From: Kent Overstreet k...@daterainc.com As generic_make_request() is now able to handle arbitrarily sized bios, it's no longer necessary for each individual block driver to define its own -merge_bvec_fn() callback. Remove every invocation completely. Cc: Jens Axboe ax...@kernel.dk Cc: Lars Ellenberg drbd-...@lists.linbit.com Cc: drbd-u...@lists.linbit.com Cc: Jiri Kosina jkos...@suse.cz Cc: Yehuda Sadeh yeh...@inktank.com Cc: Sage Weil s...@inktank.com Cc: Alex Elder el...@kernel.org Cc: ceph-de...@vger.kernel.org Cc: Alasdair Kergon a...@redhat.com Cc: Mike Snitzer snit...@redhat.com Cc: dm-de...@redhat.com Cc: Neil Brown ne...@suse.de Cc: linux-r...@vger.kernel.org Cc: Christoph Hellwig h...@infradead.org Cc: Martin K. Petersen martin.peter...@oracle.com Signed-off-by: Kent Overstreet k...@daterainc.com [dpark: also remove -merge_bvec_fn() in dm-thin as well as dm-era-target, and resolve merge conflicts] Signed-off-by: Dongsu Park dongsu.p...@profitbricks.com --- block/blk-merge.c | 17 +- block/blk-settings.c | 22 drivers/block/drbd/drbd_int.h | 1 - drivers/block/drbd/drbd_main.c | 1 - drivers/block/drbd/drbd_req.c | 35 drivers/block/pktcdvd.c| 21 --- drivers/block/rbd.c| 47 drivers/md/dm-cache-target.c | 21 --- drivers/md/dm-crypt.c | 16 -- drivers/md/dm-era-target.c | 15 - drivers/md/dm-flakey.c | 16 -- drivers/md/dm-linear.c | 16 -- drivers/md/dm-snap.c | 15 - drivers/md/dm-stripe.c | 21 --- drivers/md/dm-table.c | 8 --- drivers/md/dm-thin.c | 31 --- drivers/md/dm-verity.c | 16 -- drivers/md/dm.c| 120 +--- drivers/md/dm.h| 2 - drivers/md/linear.c| 46 drivers/md/md.c| 2 - drivers/md/md.h| 8 --- drivers/md/multipath.c | 21 --- drivers/md/raid0.c | 57 --- drivers/md/raid0.h | 2 - drivers/md/raid1.c | 59 +--- drivers/md/raid10.c| 122 + drivers/md/raid5.c | 28 -- include/linux/blkdev.h | 10 include/linux/device-mapper.h | 4 -- 30 files changed, 9 insertions(+), 791 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 3bc2068..8cd7a83 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -69,24 +69,13 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, struct bio *split; struct bio_vec bv = { 0 }, bvprv = { 0 }; struct bvec_iter iter; - unsigned seg_size = 0, nsegs = 0; + unsigned seg_size = 0, nsegs = 0, sectors = 0; int prev = 0; - struct bvec_merge_data bvm = { - .bi_bdev= bio-bi_bdev, - .bi_sector = bio-bi_iter.bi_sector, - .bi_size= 0, - .bi_rw = bio-bi_rw, - }; - bio_for_each_segment(bv, bio, iter) { - if (q-merge_bvec_fn - q-merge_bvec_fn(q, bvm, bv) (int) bv.bv_len) - goto split; - - bvm.bi_size += bv.bv_len; + sectors += bv.bv_len 9; - if (bvm.bi_size 9 queue_max_sectors(q)) + if (sectors queue_max_sectors(q)) goto split; if (prev blk_queue_cluster(q)) { diff --git a/block/blk-settings.c b/block/blk-settings.c index 6ed2cbe..463a10a 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -53,28 +53,6 @@ void blk_queue_unprep_rq(struct request_queue *q, unprep_rq_fn *ufn) } EXPORT_SYMBOL(blk_queue_unprep_rq); -/** - * blk_queue_merge_bvec - set a merge_bvec function for queue - * @q: queue - * @mbfn: merge_bvec_fn - * - * Usually queues have static limitations on the max sectors or segments that - * we can put in a request. Stacking drivers may have some settings that - * are dynamic, and thus we have to query the queue whether it is ok to - * add a new bio_vec to a bio at a given offset or not. If the block device - * has such limitations, it needs to register a merge_bvec_fn to control - * the size of bio's sent to it. Note that a block device *must* allow a - * single page to be added to an empty bio. The block device driver may want - * to use the bio_split() function to deal with these bio's. By default - * no merge_bvec_fn is defined for a queue, and only the fixed limits are - * honored. - */ -void blk_queue_merge_bvec(struct request_queue *q, merge_bvec_fn *mbfn) -{ - q-merge_bvec_fn = mbfn; -} -EXPORT_SYMBOL(blk_queue_merge_bvec); - void blk_queue_softirq_done(struct request_queue *q, softirq_done_fn *fn) { q-softirq_done_fn = fn; diff