#! /bin/sh

# regression test for creating a table with a set of adjacent
# mappings.

. ${TEST_ROOT}/etc/dm_tools.sh

usage() {
    echo "Usage: `basename $0` <segment size> <num mirrors> <log dev> <log offset> <log size> [<block device> <offset>]+" 1>&2
    exit 1
}

if [ $# -lt 6 ]; then
    usage
fi

# globals
devname="mirror_test"
segment_size=$1; shift
mirror_count=$1; shift
log_dev=$1; shift
log_offset=$1; shift
log_size=$1; shift

if [ $# -ne `expr $mirror_count \* 2` ]; then
    echo "Incorrect number of mirror arguments" 1>&2
    usage
fi

# Generate the tables
log_table="0 $log_size linear $log_dev $log_offset"
mirror_table="0 $segment_size mirror disk 2 /dev/mapper/log 1024 $mirror_count $@"
linear1_table="0 $segment_size linear $1 $2"; shift; shift;
linear2_table="0 $segment_size linear $1 $2"; shift; shift;

# create the device
remove_quietly $devname
remove_quietly log

info "create log device"
push_level
create log $log_table
pop_level

info "zero log device"
push_level
dd if=/dev/zero of=/dev/mapper/log
pop_level

info "create mirror device"
push_level
create $devname $linear1_table
pop_level

info "stamp pattern across mirror 1"
push_level
pattern=`date +%s`
stamp_pattern $devname $pattern
pop_level

info "load map for mirror 2"
push_level
reload $devname $linear2_table
pop_level

info "stamp patten across mirror 2"
push_level
stamp_pattern $devname $(( $pattern + 1 ))
pop_level

info "load map for mirrorset"
push_level
reload $devname $mirror_table
pop_level

info "wait for sync to complete"
push_level
wait_for_event $devname 0
pop_level

info "suspend and resume to prompt a re-read of the log"
suspend $devname
resume $devname
# FIXME: check it's all in sync

#info "suspend, zero log then resume"
#suspend $devname
#dd if=/dev/zero of=/dev/mapper/log
#resume $devname

# remove
remove $devname
remove log

succeed ok

# FIXME: add an at exit to destroy the device on fatal