#!/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.$$ } # 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 n 64" dm_create $dm check_exit $? "dm_create $dm" } 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 } # 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 size[sec]" >&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 $$