mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
block: kill merge_bvec_fn() completely
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 <[email protected]> Cc: Lars Ellenberg <[email protected]> Cc: [email protected] Cc: Jiri Kosina <[email protected]> Cc: Yehuda Sadeh <[email protected]> Cc: Sage Weil <[email protected]> Cc: Alex Elder <[email protected]> Cc: [email protected] Cc: Alasdair Kergon <[email protected]> Cc: Mike Snitzer <[email protected]> Cc: [email protected] Cc: Neil Brown <[email protected]> Cc: [email protected] Cc: Christoph Hellwig <[email protected]> Cc: "Martin K. Petersen" <[email protected]> Acked-by: NeilBrown <[email protected]> (for the 'md' bits) Acked-by: Mike Snitzer <[email protected]> Signed-off-by: Kent Overstreet <[email protected]> [dpark: also remove ->merge_bvec_fn() in dm-thin as well as dm-era-target, and resolve merge conflicts] Signed-off-by: Dongsu Park <[email protected]> Signed-off-by: Ming Lin <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
7140aafce2
commit
8ae126660f
32 changed files with 9 additions and 859 deletions
|
|
@ -1450,7 +1450,6 @@ extern void do_submit(struct work_struct *ws);
|
|||
extern void __drbd_make_request(struct drbd_device *, struct bio *, unsigned long);
|
||||
extern void drbd_make_request(struct request_queue *q, struct bio *bio);
|
||||
extern int drbd_read_remote(struct drbd_device *device, struct drbd_request *req);
|
||||
extern int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec);
|
||||
extern int is_valid_ar_handle(struct drbd_request *, sector_t);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2774,7 +2774,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
|||
This triggers a max_bio_size message upon first attach or connect */
|
||||
blk_queue_max_hw_sectors(q, DRBD_MAX_BIO_SIZE_SAFE >> 8);
|
||||
blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
|
||||
blk_queue_merge_bvec(q, drbd_merge_bvec);
|
||||
q->queue_lock = &resource->req_lock;
|
||||
|
||||
device->md_io.page = alloc_page(GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -1512,41 +1512,6 @@ void drbd_make_request(struct request_queue *q, struct bio *bio)
|
|||
__drbd_make_request(device, bio, start_jif);
|
||||
}
|
||||
|
||||
/* This is called by bio_add_page().
|
||||
*
|
||||
* q->max_hw_sectors and other global limits are already enforced there.
|
||||
*
|
||||
* We need to call down to our lower level device,
|
||||
* in case it has special restrictions.
|
||||
*
|
||||
* We also may need to enforce configured max-bio-bvecs limits.
|
||||
*
|
||||
* As long as the BIO is empty we have to allow at least one bvec,
|
||||
* regardless of size and offset, so no need to ask lower levels.
|
||||
*/
|
||||
int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec)
|
||||
{
|
||||
struct drbd_device *device = (struct drbd_device *) q->queuedata;
|
||||
unsigned int bio_size = bvm->bi_size;
|
||||
int limit = DRBD_MAX_BIO_SIZE;
|
||||
int backing_limit;
|
||||
|
||||
if (bio_size && get_ldev(device)) {
|
||||
unsigned int max_hw_sectors = queue_max_hw_sectors(q);
|
||||
struct request_queue * const b =
|
||||
device->ldev->backing_bdev->bd_disk->queue;
|
||||
if (b->merge_bvec_fn) {
|
||||
bvm->bi_bdev = device->ldev->backing_bdev;
|
||||
backing_limit = b->merge_bvec_fn(b, bvm, bvec);
|
||||
limit = min(limit, backing_limit);
|
||||
}
|
||||
put_ldev(device);
|
||||
if ((limit >> 9) > max_hw_sectors)
|
||||
limit = max_hw_sectors << 9;
|
||||
}
|
||||
return limit;
|
||||
}
|
||||
|
||||
void request_timer_fn(unsigned long data)
|
||||
{
|
||||
struct drbd_device *device = (struct drbd_device *) data;
|
||||
|
|
|
|||
|
|
@ -2506,26 +2506,6 @@ end_io:
|
|||
|
||||
|
||||
|
||||
static int pkt_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
|
||||
struct bio_vec *bvec)
|
||||
{
|
||||
struct pktcdvd_device *pd = q->queuedata;
|
||||
sector_t zone = get_zone(bmd->bi_sector, pd);
|
||||
int used = ((bmd->bi_sector - zone) << 9) + bmd->bi_size;
|
||||
int remaining = (pd->settings.size << 9) - used;
|
||||
int remaining2;
|
||||
|
||||
/*
|
||||
* A bio <= PAGE_SIZE must be allowed. If it crosses a packet
|
||||
* boundary, pkt_make_request() will split the bio.
|
||||
*/
|
||||
remaining2 = PAGE_SIZE - bmd->bi_size;
|
||||
remaining = max(remaining, remaining2);
|
||||
|
||||
BUG_ON(remaining < 0);
|
||||
return remaining;
|
||||
}
|
||||
|
||||
static void pkt_init_queue(struct pktcdvd_device *pd)
|
||||
{
|
||||
struct request_queue *q = pd->disk->queue;
|
||||
|
|
@ -2533,7 +2513,6 @@ static void pkt_init_queue(struct pktcdvd_device *pd)
|
|||
blk_queue_make_request(q, pkt_make_request);
|
||||
blk_queue_logical_block_size(q, CD_FRAMESIZE);
|
||||
blk_queue_max_hw_sectors(q, PACKET_MAX_SECTORS);
|
||||
blk_queue_merge_bvec(q, pkt_merge_bvec);
|
||||
q->queuedata = pd;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3462,52 +3462,6 @@ static int rbd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||
return BLK_MQ_RQ_QUEUE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* a queue callback. Makes sure that we don't create a bio that spans across
|
||||
* multiple osd objects. One exception would be with a single page bios,
|
||||
* which we handle later at bio_chain_clone_range()
|
||||
*/
|
||||
static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
|
||||
struct bio_vec *bvec)
|
||||
{
|
||||
struct rbd_device *rbd_dev = q->queuedata;
|
||||
sector_t sector_offset;
|
||||
sector_t sectors_per_obj;
|
||||
sector_t obj_sector_offset;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Find how far into its rbd object the partition-relative
|
||||
* bio start sector is to offset relative to the enclosing
|
||||
* device.
|
||||
*/
|
||||
sector_offset = get_start_sect(bmd->bi_bdev) + bmd->bi_sector;
|
||||
sectors_per_obj = 1 << (rbd_dev->header.obj_order - SECTOR_SHIFT);
|
||||
obj_sector_offset = sector_offset & (sectors_per_obj - 1);
|
||||
|
||||
/*
|
||||
* Compute the number of bytes from that offset to the end
|
||||
* of the object. Account for what's already used by the bio.
|
||||
*/
|
||||
ret = (int) (sectors_per_obj - obj_sector_offset) << SECTOR_SHIFT;
|
||||
if (ret > bmd->bi_size)
|
||||
ret -= bmd->bi_size;
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
/*
|
||||
* Don't send back more than was asked for. And if the bio
|
||||
* was empty, let the whole thing through because: "Note
|
||||
* that a block device *must* allow a single page to be
|
||||
* added to an empty bio."
|
||||
*/
|
||||
rbd_assert(bvec->bv_len <= PAGE_SIZE);
|
||||
if (ret > (int) bvec->bv_len || !bmd->bi_size)
|
||||
ret = (int) bvec->bv_len;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rbd_free_disk(struct rbd_device *rbd_dev)
|
||||
{
|
||||
struct gendisk *disk = rbd_dev->disk;
|
||||
|
|
@ -3806,7 +3760,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
|
|||
blk_queue_max_discard_sectors(q, segment_size / SECTOR_SIZE);
|
||||
q->limits.discard_zeroes_data = 1;
|
||||
|
||||
blk_queue_merge_bvec(q, rbd_merge_bvec);
|
||||
disk->queue = q;
|
||||
|
||||
q->queuedata = rbd_dev;
|
||||
|
|
|
|||
Loading…
Reference in a new issue