Track in-progress writes on the merging snapshot device and delay merging the chunk until all writes to that chunk finish. Signed-off-by: Mikulas Patocka --- drivers/md/dm-snap.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) Index: linux-2.6.26-rc5-devel/drivers/md/dm-snap.c =================================================================== --- linux-2.6.26-rc5-devel.orig/drivers/md/dm-snap.c 2008-06-17 01:17:47.000000000 +0200 +++ linux-2.6.26-rc5-devel/drivers/md/dm-snap.c 2008-06-17 01:19:43.000000000 +0200 @@ -609,7 +609,8 @@ s->merge_write_interlock_n = 1; up_write(&s->lock); - /* !!! FIXME: wait until writes to this chunk drain */ + while (__chunk_is_tracked(s, old_chunk)) + yield(); dm_kcopyd_copy(s->kcopyd_client, &src, 1, &dest, 0, merge_callback, s); return; @@ -1320,7 +1321,11 @@ r = DM_MAPIO_SUBMITTED; goto out_unlock; } + remap_exception(s, e, bio, chunk); + + if (bio_rw(bio) == WRITE) + map_context->ptr = track_chunk(s, chunk); goto out_unlock; }