#!/bin/sh
#  
# Copyright (C) 2005,2006  Heinz Mauelshagen, Red Hat GmbH. All rights reserved.
#
# Create/remove device-mapper sparse device
#

trap "rm -f table.$$" 0 1 2 3 15

cmd=$(basename $0)
modprobe dm-snapshot
modprobe dm-zero

function print_table()
{
	echo -e "$1" >table.$$
}

function dm_create()
{
	echo dmsetup create $1 table.$$
	dmsetup create $1 table.$$ > /dev/null
}

function dm_remove()
{
	echo dmsetup remove $1
	dmsetup remove $1 > /dev/null
}

function check_exit()
{
	if [ $1 -ne 0 ]; then
		echo "ERROR: $2" >&2
		exit 1
	fi
}
	
# Setup sparse dm device.
function setup()
{
	dm=$1 cow_dev=$2 size=$3

	dev_zero=${dm}_zero
	dev_zero_org=${dm}_zero_org

	# Create zero mapped device to be used below snapshot origin.
	print_table "0 $size zero"
	dm_create $dev_zero
	check_exit $? "dm_create $dev_zero"

	# Create zero_org mapped device
	print_table "0 $size snapshot-origin /dev/mapper/$dev_zero"
	dm_create $dev_zero_org
	check_exit $? "dmcreate $dev_zero_org"

	# Create snapshot mapped device
	print_table "0 $size snapshot /dev/mapper/$dev_zero_org $cow_dev p 64"
	dm_create $dm
	check_exit $? "dm_create $dm"

	# don't set "cyl", fdisk is able to count it
	#dmsetup setgeometry $dm 0 255 63 0
}

# Remove sparse device
function remove()
{
	dm=$1

	dm_remove $dm
	dm_remove ${dm}_zero_org
	dm_remove ${dm}_zero
}

#
# Main
#
case $cmd in
sparse_create)
	if [ $# -ne 3 ]; then
		echo "$cmd device cow_device sectors" >&2
		exit 1
	fi

	setup $*;;

sparse_remove)
	if [ $# -ne 1 ]; then
		echo "$cmd device" >&2
		exit 1
	fi

	remove $*;;

*)
	echo "$cmd: not supported!" >&2
	exit 1;;
esac

kill 1 $$
