Debugging calls. --- drivers/md/dm-snap.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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:21:08.000000000 +0200 +++ linux-2.6.26-rc5-devel/drivers/md/dm-snap.c 2008-06-17 01:21:13.000000000 +0200 @@ -787,6 +787,8 @@ goto bad1; } + printk("%p: %s ctr %s %s\n", ti, is_merge(ti) ? "merge" : "snapshot", argv[0], argv[1]); + origin_path = argv[0]; cow_path = argv[1]; persistent = toupper(*argv[2]); @@ -986,14 +988,18 @@ down_write(&_origins_lock); down_write(&s->lock); dup = find_duplicate(s); + printk("find duplicate: %p\n", dup); if (dup && dup->handover) { down_write_nested(&dup->lock, SINGLE_DEPTH_NESTING); + printk("handover 2\n"); handover_exceptions(s, dup); up_write(&dup->lock); } up_write(&s->lock); up_write(&_origins_lock); + printk("%p: %s dtr %s %s\n", ti, is_merge(ti) ? "merge" : "snapshot", s->origin->name, s->cow->name); + if (is_merge(ti)) stop_merge(s->origin->bdev, 1); @@ -1415,6 +1421,7 @@ static void snapshot_resume(struct dm_target *ti) { struct dm_snapshot *s = ti->private; + printk("%p: %s resume: %s %s\n", ti, is_merge(ti) ? "merge" : "snapshot", s->origin->name, s->cow->name); down_write(&_origins_lock); down_write(&s->lock); @@ -1427,6 +1434,7 @@ goto ret; } down_write_nested(&dup->lock, SINGLE_DEPTH_NESTING); + printk("handover 1\n"); handover_exceptions(dup, s); up_write(&dup->lock); } @@ -1436,6 +1444,12 @@ up_write(&_origins_lock); } +static void snapshot_suspend(struct dm_target *ti) +{ + struct dm_snapshot *s = ti->private; + printk("%p: %s suspend: %s %s\n", ti, is_merge(ti) ? "merge" : "snapshot", s->origin->name, s->cow->name); +} + static int snapshot_status(struct dm_target *ti, status_type_t type, char *result, unsigned int maxlen) { @@ -1603,6 +1617,8 @@ return -EINVAL; } + printk("%p: origin ctr: %s\n", ti, argv[0]); + r = dm_get_device(ti, argv[0], 0, ti->len, dm_table_get_mode(ti->table), &dev); if (r) { @@ -1618,6 +1634,8 @@ { struct dm_dev *dev = ti->private; + printk("%p: origin dtr: %s\n", ti, dev->name); + stop_merge(dev->bdev, 0); dm_put_device(ti, dev); } @@ -1654,6 +1672,8 @@ struct dm_dev *dev = ti->private; struct origin *o; + printk("%p: origin resume: %s\n", ti, dev->name); + down_read(&_origins_lock); o = __lookup_origin(dev->bdev); ti->split_io = minimum_chunk_size(o); @@ -1665,6 +1685,7 @@ static void origin_postsuspend(struct dm_target *ti) { struct dm_dev *dev = ti->private; + printk("%p: origin suspend: %s\n", ti, dev->name); stop_merge(dev->bdev, 0); } @@ -1707,6 +1728,7 @@ .dtr = snapshot_dtr, .map = snapshot_map, .end_io = snapshot_end_io, + .presuspend = snapshot_suspend, .resume = snapshot_resume, .status = snapshot_status, }; @@ -1719,6 +1741,7 @@ .dtr = snapshot_dtr, .map = snapshot_merge_map, .end_io = snapshot_end_io, + .presuspend = snapshot_suspend, .resume = snapshot_resume, .status = snapshot_status, };