diff mbox

Re: [PATCH v6] dm snapshot: allow live exception store handover between tables

Message ID 20091111193757.GA30110@redhat.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Mike Snitzer Nov. 11, 2009, 7:37 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 1d17c4f..db21c0a 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -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);
 		}
 	}