[dm-devel] [PATCH] dm snapshot: ignore discards issued to the snapshot-origin target
Mike Snitzer
snitzer at redhat.com
Thu Apr 28 00:19:13 UTC 2011
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 at redhat.com>
---
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,
More information about the dm-devel
mailing list