diff options
| -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 dddfa14f2982..3d80cf0c152d 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) |
