[dm-devel] [PATCH] dm-snapshot.c: Don't read off the end of the origin device

Kevin Corry kevcorry at us.ibm.com
Fri Jun 27 14:13:01 UTC 2003


An origin device may not be an exact multiple of the snapshot chunk size. If
this is the case, kcopyd may eventually try to read off the end of the origin
device, causing I/O errors and invalidation of the snapshot. This patch adds a
check in start_copy to check for this last partial-chunk on the origin, and
tells kcopyd to copy the correct size.

--- linux-2.4.21a/drivers/md/dm-snapshot.c	27 Mar 2003 15:52:35 -0000
+++ linux-2.4.21b/drivers/md/dm-snapshot.c	27 Jun 2003 18:46:25 -0000
@@ -714,14 +714,20 @@
 {
 	struct dm_snapshot *s = pe->snap;
 	struct kcopyd_region src, dest;
+	kdev_t dev = s->origin->dev;
+	int *sizes = blk_size[major(dev)];
+	sector_t dev_size = (sector_t)-1;
 
-	src.dev = s->origin->dev;
+	if (sizes && sizes[minor(dev)])
+		dev_size = sizes[minor(dev)] << 1;
+
+	src.dev = dev;
 	src.sector = chunk_to_sector(s, pe->e.old_chunk);
-	src.count = s->chunk_size;
+	src.count = min(s->chunk_size, dev_size - src.sector);
 
 	dest.dev = s->cow->dev;
 	dest.sector = chunk_to_sector(s, pe->e.new_chunk);
-	dest.count = s->chunk_size;
+	dest.count = src.count;
 
 	if (!pe->started) {
 		/* Hand over to kcopyd */





More information about the dm-devel mailing list