dm stripe: support copy Support the copy operation for the stripe target. In stripe_merge, we verify that the underlying device supports copy. If it doesn't, we can fail fast without any bio being contructed. Signed-off-by: Mikulas Patocka --- drivers/md/dm-stripe.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) Index: linux-3.18-rc6/drivers/md/dm-stripe.c =================================================================== --- linux-3.18-rc6.orig/drivers/md/dm-stripe.c 2014-11-30 20:41:59.000000000 +0100 +++ linux-3.18-rc6/drivers/md/dm-stripe.c 2014-11-30 20:42:42.000000000 +0100 @@ -167,6 +167,7 @@ static int stripe_ctr(struct dm_target * ti->num_flush_bios = stripes; ti->num_discard_bios = stripes; ti->num_write_same_bios = stripes; + ti->copy_supported = 1; sc->chunk_size = chunk_size; if (chunk_size & (chunk_size - 1)) @@ -418,11 +419,19 @@ static int stripe_merge(struct dm_target struct stripe_c *sc = ti->private; sector_t bvm_sector = bvm->bi_sector; uint32_t stripe; + struct block_device *bdev; struct request_queue *q; stripe_map_sector(sc, bvm_sector, &stripe, &bvm_sector); - q = bdev_get_queue(sc->stripe[stripe].dev->bdev); + bdev = sc->stripe[stripe].dev->bdev; + + if (unlikely((bvm->bi_rw & REQ_COPY) != 0)) { + if (!bdev_copy_offload(bdev)) + return 0; + } + + q = bdev_get_queue(bdev); if (!q->merge_bvec_fn) return max_size;