From 19bafeba15353cfaebb45c52a1f3bc895722afce Mon Sep 17 00:00:00 2001
From: Quentin Smith <quentin@mit.edu>
Date: Sat, 21 May 2011 22:44:20 -0400
Subject: [PATCH] Add scripts for making snapshots of LVs with dm-snapshot
 even when those LVs reside on a clustered VG

---
 cheap-snapshot.sh   |   43 +++++++++++++++++++++++++++++++++++++++++++
 cheap-unsnapshot.sh |   17 +++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 cheap-snapshot.sh
 create mode 100644 cheap-unsnapshot.sh

diff --git a/cheap-snapshot.sh b/cheap-snapshot.sh
new file mode 100644
index 0000000..1caff4c
--- /dev/null
+++ b/cheap-snapshot.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+set -e
+set -x
+
+BASE="$1"
+BASEDUP="basedup"
+ORIGIN="origin"
+TOP="top"
+COWFILE="/tmp/cowfile"
+
+[ -e "/dev/mapper/$BASE" ] || exit 1
+
+[ -e "$COWFILE" ] || exit 1
+
+COWDEVICE="$(losetup -sf $COWFILE)"
+
+echo 3 > /proc/sys/vm/drop_caches
+
+# Copy the base's table onto basedup
+dmsetup table $BASE | dmsetup create $BASEDUP
+
+# Prepare COW image
+CHUNK=8
+dd if=/dev/zero of=$COWDEVICE bs=512 count=$CHUNK
+
+# Create a snapshot
+echo 0 $(blockdev --getsize /dev/mapper/$BASEDUP) \
+        snapshot /dev/mapper/$BASEDUP $COWDEVICE p 8 | \
+        dmsetup create $TOP
+
+# Suspend I/O to base
+dmsetup suspend $BASE
+echo "Snapshot as of"
+date
+
+echo 0 $(blockdev --getsize /dev/mapper/$BASEDUP) \
+        snapshot-origin /dev/mapper/$BASEDUP | \
+        dmsetup create $ORIGIN
+
+dmsetup table $ORIGIN | dmsetup load $BASE
+
+dmsetup resume $BASE
diff --git a/cheap-unsnapshot.sh b/cheap-unsnapshot.sh
new file mode 100644
index 0000000..73feccd
--- /dev/null
+++ b/cheap-unsnapshot.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+set -e
+set -x
+
+BASE="$1"
+BASEDUP="basedup"
+ORIGIN="origin"
+TOP="top"
+
+[ -e "/dev/mapper/$BASE" ] || exit 1
+
+dmsetup suspend $BASE
+dmsetup remove $TOP
+dmsetup remove $ORIGIN
+dmsetup table $BASEDUP | dmsetup load $BASE
+dmsetup resume $BASE
-- 
1.7.9.5