@@ -558,11 +558,10 @@ static struct dm_snapshot *find_snapshot_using_cow(struct dm_snapshot *snap)
goto out;
list_for_each_entry(s, &o->snapshots, list) {
- if (s == snap || !bdev_equal(s->cow->bdev, snap->cow->bdev))
- continue;
-
- handover_snap = s;
- break;
+ if (bdev_equal(s->cow->bdev, snap->cow->bdev)) {
+ handover_snap = s;
+ break;
+ }
}
out:
@@ -1636,12 +1635,17 @@ static void snapshot_resume(struct dm_target *ti)
}
up_write(&snap_src->lock);
- if (snap_dest && register_snapshot(snap_dest)) {
- DMERR("Unable to register snapshot "
- "after exception handover.");
- down_write(&snap_dest->lock);
- snap_dest->valid = 0;
- up_write(&snap_dest->lock);
+ if (snap_dest) {
+ if (register_snapshot(snap_dest)) {
+ DMERR("Unable to register snapshot "
+ "after exception handover.");
+ down_write(&snap_dest->lock);
+ snap_dest->valid = 0;
+ up_write(&snap_dest->lock);
+ return;
+ }
+ /* unregister handover-source */
+ unregister_snapshot(snap_src);
}
}