diff options
Diffstat (limited to 'drivers/md/dm-stripe.c')
-rw-r--r-- | drivers/md/dm-stripe.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index dddfa14f298..3d80cf0c152 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
@@ -396,9 +396,29 @@ static void stripe_io_hints(struct dm_target *ti, | |||
396 | blk_limits_io_opt(limits, chunk_size * sc->stripes); | 396 | blk_limits_io_opt(limits, chunk_size * sc->stripes); |
397 | } | 397 | } |
398 | 398 | ||
399 | static int stripe_merge(struct dm_target *ti, struct bvec_merge_data *bvm, | ||
400 | struct bio_vec *biovec, int max_size) | ||
401 | { | ||
402 | struct stripe_c *sc = ti->private; | ||
403 | sector_t bvm_sector = bvm->bi_sector; | ||
404 | uint32_t stripe; | ||
405 | struct request_queue *q; | ||
406 | |||
407 | stripe_map_sector(sc, bvm_sector, &stripe, &bvm_sector); | ||
408 | |||
409 | q = bdev_get_queue(sc->stripe[stripe].dev->bdev); | ||
410 | if (!q->merge_bvec_fn) | ||
411 | return max_size; | ||
412 | |||
413 | bvm->bi_bdev = sc->stripe[stripe].dev->bdev; | ||
414 | bvm->bi_sector = sc->stripe[stripe].physical_start + bvm_sector; | ||
415 | |||
416 | return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); | ||
417 | } | ||
418 | |||
399 | static struct target_type stripe_target = { | 419 | static struct target_type stripe_target = { |
400 | .name = "striped", | 420 | .name = "striped", |
401 | .version = {1, 3, 1}, | 421 | .version = {1, 4, 0}, |
402 | .module = THIS_MODULE, | 422 | .module = THIS_MODULE, |
403 | .ctr = stripe_ctr, | 423 | .ctr = stripe_ctr, |
404 | .dtr = stripe_dtr, | 424 | .dtr = stripe_dtr, |
@@ -407,6 +427,7 @@ static struct target_type stripe_target = { | |||
407 | .status = stripe_status, | 427 | .status = stripe_status, |
408 | .iterate_devices = stripe_iterate_devices, | 428 | .iterate_devices = stripe_iterate_devices, |
409 | .io_hints = stripe_io_hints, | 429 | .io_hints = stripe_io_hints, |
430 | .merge = stripe_merge, | ||
410 | }; | 431 | }; |
411 | 432 | ||
412 | int __init dm_stripe_init(void) | 433 | int __init dm_stripe_init(void) |