Discards pose a problem for the snapshot-origin target because they are treated as writes. Treating a discard as a write would trigger a copyout to the snapshot. Such copyout can prove too costly in the face of otherwise benign scenarios (e.g. create a snapshot and then mkfs.ext4 the origin -- mkfs.ext4 discards the entire volume by default, which would copyout the entire origin volume to the snapshot). Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> --- drivers/md/dm-snap.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index a2d3309..639af12 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -2076,6 +2076,7 @@ static int origin_ctr(struct dm_target *ti, unsigned int argc, char **argv) ti->private = dev; ti->num_flush_requests = 1; + ti->num_discard_requests = 1; return 0; } @@ -2095,6 +2096,12 @@ static int origin_map(struct dm_target *ti, struct bio *bio, if (bio->bi_rw & REQ_FLUSH) return DM_MAPIO_REMAPPED; + if (bio->bi_rw & REQ_DISCARD) { + /* ignore discard requests */ + bio_endio(bio, 0); + return DM_MAPIO_SUBMITTED; + } + /* Only tell snapshots if this is a write */ return (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : DM_MAPIO_REMAPPED; } @@ -2153,7 +2160,7 @@ static int origin_iterate_devices(struct dm_target *ti, static struct target_type origin_target = { .name = "snapshot-origin", - .version = {1, 7, 1}, + .version = {1, 8, 0}, .module = THIS_MODULE, .ctr = origin_ctr, .dtr = origin_dtr, -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel