File: //usr/local/share/urbackup/dm_remove_snapshot
#!/bin/sh
set -e
SNAP_ID=$1
SNAP_MOUNTPOINT="$2"
SNAP_ORIG_PATH="$5"
CDIR=`dirname $0`
remove_overlay() {
if test -e "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
then
chattr -i "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
rm "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
fi
if test -e "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap"
then
LODEV=`losetup -j "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap" | cut -d':' -f1`
if [ "x$LODEV" != x ]
then
losetup -d "$LODEV"
fi
rm "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap"
fi
}
remove_dm() {
if ! [ -e "${SNAP_MOUNTPOINT}-name" ]
then
echo "Could not find snapshot device name at ${SNAP_MOUNTPOINT}-name. Cannot remove dm nodes"
return 1
fi
DEVNAME=$(cat "${SNAP_MOUNTPOINT}-name")
echo "Removing dm snapshot..."
dmsetup remove "$DEVNAME-$SNAP_ID-wsnap" || true
dmsetup remove "$DEVNAME-$SNAP_ID" || true
echo "Removing snapshot cow storage..."
dmsetup remove "$DEVNAME-$SNAP_ID-cow-storage" || true
rm "${SNAP_MOUNTPOINT}-name"
rm "${SNAP_MOUNTPOINT}-dev"
rmdir "${SNAP_MOUNTPOINT}"
}
if ! test -e $SNAP_MOUNTPOINT
then
echo "Snapshot at $SNAP_MOUNTPOINT was already removed"
remove_dm
remove_overlay
exit 0
fi
TYPE=$(df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" | head -n 1 | tr -s " " | cut -d" " -f2)
if [ "x$TYPE" = "x" ]
then
if btrfs subvolume list -o "$SNAP_MOUNTPOINT" > /dev/null 2>&1
then
TYPE="btrfs"
fi
fi
if [ "x$TYPE" = "xbtrfs" ]
then
$CDIR/btrfs_remove_filesystem_snapshot "$@"
exit $?
fi
if ! df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" > /dev/null 2>&1
then
echo "Snapshot is not mounted. Already removed"
remove_dm
remove_overlay
exit 0
fi
if ! [ -e "${SNAP_MOUNTPOINT}-name" ]
then
echo "Could not find snapshot device name at ${SNAP_MOUNTPOINT}-name"
exit 1
fi
DEVNAME=$(cat "${SNAP_MOUNTPOINT}-name")
echo "Unmounting /dev/mapper/$DEVNAME-$SNAP_ID at /mnt/urbackup_snaps/$SNAP_ID..."
if ! umount /mnt/urbackup_snaps/$SNAP_ID
then
lsof | grep /mnt/urbackup_snaps/$SNAP_ID || true
echo "Unmounting /mnt/urbackup_snaps/$SNAP_ID failed. Retrying in 10s..."
sleep 10
umount /mnt/urbackup_snaps/$SNAP_ID
fi
remove_dm
remove_overlay
exit 0