#! /bin/bash

rescan_hosts() {
    local i

    echo "=== scanning $@ ===" >&2
    for i in "$@"; do
	echo - - - >"/sys/class/scsi_host/$i/scan"
    done
    sleep 1
    multipathd show topology >&2
    # show partition devices
    dmsetup ls
}

set_offline() {
    local i

    echo "=== setting $@ offline ===" >&2
    for i in "$@"; do
	echo offline >"/sys/class/block/$i/device/state"
    done
    sleep 5
    multipathd show topology >&2
}

do_io() {
    echo "=== doing I/O ===" >&2
    dd if=/dev/zero of="/dev/$1" bs=4k count=${2:-1} conv=notrunc
}

delete_devs() {
    local i

    echo "=== deleting $@ ===" >&2
    for i in "$@"; do
echo 1 >"/sys/class/block/$i/device/delete"
    done
    sleep 1
    multipathd show topology >&2
}

HOSTS=(host7 host8)
SDS=(sdc sdd)
MP=dm-0
N=10
COUNT=8
while [[ $((N--)) -gt 0 ]]; do
    echo "=== N=$N ===" >&2
    rescan_hosts "${HOSTS[@]}"
    set_offline "${SDS[@]}"
    do_io "$MP" "$COUNT"
    delete_devs "${SDS[@]}"
    sleep 5
done
