xref: /freebsd/tools/regression/zfs/misc.sh (revision 59dee1b08bc89aee3e180167925d2669740666b7)
11ba4a712SPawel Jakub Dawidek# $FreeBSD$
21ba4a712SPawel Jakub Dawidek
31ba4a712SPawel Jakub Dawidekntest=1
41ba4a712SPawel Jakub Dawidekos=`uname -s`
51ba4a712SPawel Jakub Dawidek
61ba4a712SPawel Jakub Dawidekecho ${dir} | egrep '^/' >/dev/null 2>&1
71ba4a712SPawel Jakub Dawidekif [ $? -eq 0 ]; then
81ba4a712SPawel Jakub Dawidek	maindir="${dir}/../.."
91ba4a712SPawel Jakub Dawidekelse
101ba4a712SPawel Jakub Dawidek	maindir="`pwd`/${dir}/../.."
111ba4a712SPawel Jakub Dawidekfi
121ba4a712SPawel Jakub Dawidek
131ba4a712SPawel Jakub Dawidek# Set up correct command names and switches
141ba4a712SPawel Jakub Dawidekif [ -z "${LUSTRE}" ]; then
151ba4a712SPawel Jakub Dawidek	ZPOOL="zpool"
161ba4a712SPawel Jakub Dawidek	ZFS="zfs"
171ba4a712SPawel Jakub Dawidek	ZDB="zdb"
181ba4a712SPawel Jakub Dawidek	zpool_f_flag="-f"
191ba4a712SPawel Jakub Dawidekelse
201ba4a712SPawel Jakub Dawidek	ZPOOL="lzpool"
211ba4a712SPawel Jakub Dawidek	ZFS="lzfs"
221ba4a712SPawel Jakub Dawidek	ZDB="lzdb"
231ba4a712SPawel Jakub Dawidek	zpool_f_flag="-F"
241ba4a712SPawel Jakub Dawidek	no_mountpoint=1
251ba4a712SPawel Jakub Dawidekfi
261ba4a712SPawel Jakub Dawidek
271ba4a712SPawel Jakub Dawidek# Use correct arguments to cmd line programs
281ba4a712SPawel Jakub Dawidekstat --version 2>/dev/null | grep GNU >/dev/null
291ba4a712SPawel Jakub Dawidekif [ $? -eq 0 ]; then
301ba4a712SPawel Jakub Dawidek	GNU_STAT="yes"
311ba4a712SPawel Jakub Dawidekfi
321ba4a712SPawel Jakub Dawidekif [ "${os}" = "SunOS" ]; then
331ba4a712SPawel Jakub Dawidek	import_flags="-d /dev/lofi"
341ba4a712SPawel Jakub Dawidek	mount_t_flag="-F"
351ba4a712SPawel Jakub Dawidekelse
361ba4a712SPawel Jakub Dawidek	mount_t_flag="-t"
371ba4a712SPawel Jakub Dawidekfi
381ba4a712SPawel Jakub Dawidek
391ba4a712SPawel Jakub Dawidekdie()
401ba4a712SPawel Jakub Dawidek{
411ba4a712SPawel Jakub Dawidek	echo "${1}" > /dev/stderr
42*59dee1b0SEnji Cooper	echo "Bail out!"
431ba4a712SPawel Jakub Dawidek	exit 1
441ba4a712SPawel Jakub Dawidek}
451ba4a712SPawel Jakub Dawidek
461ba4a712SPawel Jakub Dawidekcalcsum()
471ba4a712SPawel Jakub Dawidek{
481ba4a712SPawel Jakub Dawidek	dd if="${1}" bs=1M 2>/dev/null | openssl md5
491ba4a712SPawel Jakub Dawidek}
501ba4a712SPawel Jakub Dawidek
511ba4a712SPawel Jakub Dawidekcreate_file()
521ba4a712SPawel Jakub Dawidek{
531ba4a712SPawel Jakub Dawidek	name="${1}"
541ba4a712SPawel Jakub Dawidek	size="${2}"
551ba4a712SPawel Jakub Dawidek
561ba4a712SPawel Jakub Dawidek	dd if=/dev/urandom of=${name} bs=${size} count=1 >/dev/null 2>&1
571ba4a712SPawel Jakub Dawidek	sync
581ba4a712SPawel Jakub Dawidek}
591ba4a712SPawel Jakub Dawidek
601ba4a712SPawel Jakub Dawidekexpect()
611ba4a712SPawel Jakub Dawidek{
621ba4a712SPawel Jakub Dawidek	eorig="${1}"
631ba4a712SPawel Jakub Dawidek	eexp=`echo "${eorig}" | egrep -v '^[ 	]*$' | sed 's/^[ 	][ 	]*//g;s/[ 	][ 	]*$//g;s/[ 	][ 	]*/ /g;s/$/%EoL%/' | xargs`
641ba4a712SPawel Jakub Dawidek	shift
651ba4a712SPawel Jakub Dawidek	gorig=`sh -c "$*" 2>&1`
661ba4a712SPawel Jakub Dawidek	got=`echo "${gorig}" | egrep -v '^[ 	]*$' | sed 's/^[ 	][ 	]*//g;s/[ 	][ 	]*$//g;s/[ 	][ 	]*/ /g;s/$/%EoL%/' | xargs`
671ba4a712SPawel Jakub Dawidek	echo "${got}" | egrep "${eexp}" >/dev/null
681ba4a712SPawel Jakub Dawidek	if [ $? -eq 0 ]; then
691ba4a712SPawel Jakub Dawidek		echo "ok ${ntest} ${add_msg}"
701ba4a712SPawel Jakub Dawidek	else
711ba4a712SPawel Jakub Dawidek		echo "not ok ${ntest} ${add_msg}"
721ba4a712SPawel Jakub Dawidek		echo "# ----- expected from: $*"
731ba4a712SPawel Jakub Dawidek		echo "${eorig}" | sed 's/^/# /'
741ba4a712SPawel Jakub Dawidek		echo "# ----- got:"
751ba4a712SPawel Jakub Dawidek		echo "${gorig}" | sed 's/^/# /'
761ba4a712SPawel Jakub Dawidek		echo "# ----- end"
771ba4a712SPawel Jakub Dawidek	fi
781ba4a712SPawel Jakub Dawidek	ntest=`expr $ntest + 1`
791ba4a712SPawel Jakub Dawidek}
801ba4a712SPawel Jakub Dawidek
811ba4a712SPawel Jakub Dawidekexpect_ok()
821ba4a712SPawel Jakub Dawidek{
831ba4a712SPawel Jakub Dawidek	out=`$* 2>&1`
841ba4a712SPawel Jakub Dawidek	ec=$?
851ba4a712SPawel Jakub Dawidek	if [ $ec -eq 0 ]; then
861ba4a712SPawel Jakub Dawidek		echo "ok ${ntest} ${add_msg}"
871ba4a712SPawel Jakub Dawidek		echo "# ----- expected success from: $*"
881ba4a712SPawel Jakub Dawidek		if [ ! -z "${out}" ]; then
891ba4a712SPawel Jakub Dawidek			echo "# ----- output (exit code=${ec}):"
901ba4a712SPawel Jakub Dawidek			echo "${out}" | sed 's/^/# /'
911ba4a712SPawel Jakub Dawidek			echo "# ----- end"
921ba4a712SPawel Jakub Dawidek		fi
931ba4a712SPawel Jakub Dawidek	else
941ba4a712SPawel Jakub Dawidek		echo "not ok ${ntest} ${add_msg}"
951ba4a712SPawel Jakub Dawidek		echo "# ----- expected success from: $*"
961ba4a712SPawel Jakub Dawidek		echo "# ----- output (exit code=${ec}):"
971ba4a712SPawel Jakub Dawidek		echo "${out}" | sed 's/^/# /'
981ba4a712SPawel Jakub Dawidek		echo "# ----- end"
991ba4a712SPawel Jakub Dawidek	fi
1001ba4a712SPawel Jakub Dawidek	ntest=`expr $ntest + 1`
1011ba4a712SPawel Jakub Dawidek}
1021ba4a712SPawel Jakub Dawidek
1031ba4a712SPawel Jakub Dawidekexpect_fl()
1041ba4a712SPawel Jakub Dawidek{
1051ba4a712SPawel Jakub Dawidek	out=`$* 2>&1`
1061ba4a712SPawel Jakub Dawidek	ec=$?
1071ba4a712SPawel Jakub Dawidek	if [ $ec -ne 0 ]; then
1081ba4a712SPawel Jakub Dawidek		echo "ok ${ntest} ${add_msg}"
1091ba4a712SPawel Jakub Dawidek		echo "# ----- expected failure from: $*"
1101ba4a712SPawel Jakub Dawidek		if [ ! -z "${out}" ]; then
1111ba4a712SPawel Jakub Dawidek			echo "# ----- output (exit code=${ec}):"
1121ba4a712SPawel Jakub Dawidek			echo "${out}" | sed 's/^/# /'
1131ba4a712SPawel Jakub Dawidek			echo "# ----- end"
1141ba4a712SPawel Jakub Dawidek		fi
1151ba4a712SPawel Jakub Dawidek	else
1161ba4a712SPawel Jakub Dawidek		echo "not ok ${ntest} ${add_msg}"
1171ba4a712SPawel Jakub Dawidek		echo "# ----- expected failure from: $*"
1181ba4a712SPawel Jakub Dawidek		echo "# ----- output (exit code=${ec}):"
1191ba4a712SPawel Jakub Dawidek		echo "${out}" | sed 's/^/# /'
1201ba4a712SPawel Jakub Dawidek		echo "# ----- end"
1211ba4a712SPawel Jakub Dawidek	fi
1221ba4a712SPawel Jakub Dawidek	ntest=`expr $ntest + 1`
1231ba4a712SPawel Jakub Dawidek}
1241ba4a712SPawel Jakub Dawidek
1251ba4a712SPawel Jakub Dawidekquick_exit()
1261ba4a712SPawel Jakub Dawidek{
1271ba4a712SPawel Jakub Dawidek	echo "1..1"
1281ba4a712SPawel Jakub Dawidek	echo "ok 1"
1291ba4a712SPawel Jakub Dawidek	exit 0
1301ba4a712SPawel Jakub Dawidek}
1311ba4a712SPawel Jakub Dawidek
1321ba4a712SPawel Jakub Dawidek# Set up a scratch tmpfs directory (Linux only)
1331ba4a712SPawel Jakub Dawideksetup_tmpfs()
1341ba4a712SPawel Jakub Dawidek{
1351ba4a712SPawel Jakub Dawidek	cmd="mktemp -d /tmp/zfs-regression.XXXXXXXXXX"
1361ba4a712SPawel Jakub Dawidek	TMPDIR=`${cmd}` || die "failed: ${cmd}"
1371ba4a712SPawel Jakub Dawidek	cmd="mount -t tmpfs none ${TMPDIR}"
1381ba4a712SPawel Jakub Dawidek	${cmd} || die "failed: ${cmd}"
1391ba4a712SPawel Jakub Dawidek}
1401ba4a712SPawel Jakub Dawidek
1411ba4a712SPawel Jakub Dawidek# Clean up the tmpfs directory (Linux only)
1421ba4a712SPawel Jakub Dawidekcleanup_tmpfs()
1431ba4a712SPawel Jakub Dawidek{
1441ba4a712SPawel Jakub Dawidek	if [ -n "${TMPDIR}" ]; then
1451ba4a712SPawel Jakub Dawidek		cmd="umount ${TMPDIR} && rmdir ${TMPDIR}"
1461ba4a712SPawel Jakub Dawidek		eval "${cmd}" || die "failed: ${cmd}"
1471ba4a712SPawel Jakub Dawidek	fi
1481ba4a712SPawel Jakub Dawidek}
1491ba4a712SPawel Jakub Dawidek
1501ba4a712SPawel Jakub Dawidek# Truncate a file
1511ba4a712SPawel Jakub Dawidektruncate_cmd()
1521ba4a712SPawel Jakub Dawidek{
1531ba4a712SPawel Jakub Dawidek	size="${1}"
1541ba4a712SPawel Jakub Dawidek	file="${2}"
1551ba4a712SPawel Jakub Dawidek
1561ba4a712SPawel Jakub Dawidek	cmd="dd if=/dev/null of=${file} bs=1 count=0 seek=${size}"
1571ba4a712SPawel Jakub Dawidek	${cmd} > /dev/null 2>&1 || die "failed: ${cmd}"
1581ba4a712SPawel Jakub Dawidek}
1591ba4a712SPawel Jakub Dawidek
1601ba4a712SPawel Jakub Dawidek# Create a memory-backed block device
1611ba4a712SPawel Jakub Dawidekcreate_memdisk()
1621ba4a712SPawel Jakub Dawidek{
1631ba4a712SPawel Jakub Dawidek	size="${1}"
1641ba4a712SPawel Jakub Dawidek	devname="${2}"
1651ba4a712SPawel Jakub Dawidek
1661ba4a712SPawel Jakub Dawidek	if [ "${os}" = "FreeBSD" ]; then
1671ba4a712SPawel Jakub Dawidek		if [ -n "${devname}" ]; then
1681ba4a712SPawel Jakub Dawidek			devparam="-u ${devname}"
1691ba4a712SPawel Jakub Dawidek		fi
1701ba4a712SPawel Jakub Dawidek		cmd="mdconfig -a -t swap -s ${size} ${devparam} 2>/dev/null"
1711ba4a712SPawel Jakub Dawidek		DISKNAME=`${cmd}` || die "failed: ${cmd}"
1721ba4a712SPawel Jakub Dawidek		if [ -n "${devname}" ]; then
1731ba4a712SPawel Jakub Dawidek			DISKNAME="${devname}"
1741ba4a712SPawel Jakub Dawidek		fi
1751ba4a712SPawel Jakub Dawidek		FDISKNAME="/dev/${DISKNAME}"
1761ba4a712SPawel Jakub Dawidek	elif [ "${os}" = "SunOS" ]; then
1771ba4a712SPawel Jakub Dawidek		cmd="mktemp /tmp/zfstest.XXXXXXXXXX"
1781ba4a712SPawel Jakub Dawidek		fname=`${cmd}` || die "failed: ${cmd}"
1791ba4a712SPawel Jakub Dawidek
1801ba4a712SPawel Jakub Dawidek		truncate_cmd "${size}" "${fname}"
1811ba4a712SPawel Jakub Dawidek
1821ba4a712SPawel Jakub Dawidek		if [ -n "${devname}" ]; then
1831ba4a712SPawel Jakub Dawidek			cmd="lofiadm -a ${fname} ${devname}"
1841ba4a712SPawel Jakub Dawidek			${cmd} || die "failed: ${cmd}"
1851ba4a712SPawel Jakub Dawidek			DISKNAME="${devname}"
1861ba4a712SPawel Jakub Dawidek		else
1871ba4a712SPawel Jakub Dawidek			cmd="lofiadm -a ${fname}"
1881ba4a712SPawel Jakub Dawidek			DISKNAME=`${cmd}` || die "failed: ${cmd}"
1891ba4a712SPawel Jakub Dawidek		fi
1901ba4a712SPawel Jakub Dawidek		FDISKNAME="${DISKNAME}"
1911ba4a712SPawel Jakub Dawidek	elif [ "${os}" = "Linux" ]; then
1921ba4a712SPawel Jakub Dawidek		if [ -z "${TMPDIR_DISKS}" ]; then
1931ba4a712SPawel Jakub Dawidek			setup_tmpfs
1941ba4a712SPawel Jakub Dawidek			TMPDIR_DISKS="${TMPDIR}"
1951ba4a712SPawel Jakub Dawidek		fi
1961ba4a712SPawel Jakub Dawidek
1971ba4a712SPawel Jakub Dawidek		cmd="mktemp ${TMPDIR_DISKS}/disk.XXXXXXXXXX"
1981ba4a712SPawel Jakub Dawidek		fname=`${cmd}` || die "failed: ${cmd}"
1991ba4a712SPawel Jakub Dawidek
2001ba4a712SPawel Jakub Dawidek		truncate_cmd "${size}" "${fname}"
2011ba4a712SPawel Jakub Dawidek
2021ba4a712SPawel Jakub Dawidek		if [ -n "${devname}" ]; then
2031ba4a712SPawel Jakub Dawidek			devname=`echo ${devname} | cut -c 9-`
2041ba4a712SPawel Jakub Dawidek			cmd="losetup /dev/${devname} ${fname} 2>&1"
2051ba4a712SPawel Jakub Dawidek			eval ${cmd} || die "failed: ${cmd}"
2061ba4a712SPawel Jakub Dawidek			DISKNAME="${devname}"
2071ba4a712SPawel Jakub Dawidek		else
2081ba4a712SPawel Jakub Dawidek			cmd="losetup -s -f ${fname} 2>&1"
2091ba4a712SPawel Jakub Dawidek			diskname=`eval ${cmd}`
2101ba4a712SPawel Jakub Dawidek
2111ba4a712SPawel Jakub Dawidek			if [ "${diskname}" = "losetup: could not find any free loop device" ]; then
2121ba4a712SPawel Jakub Dawidek				# If there are no free loopback devices, create one more
2131ba4a712SPawel Jakub Dawidek				max=`echo /dev/loop* | awk 'BEGIN { RS=" "; FS="loop" } {if ($2 > max) max = $2} END {print max}'`
2141ba4a712SPawel Jakub Dawidek				max=$((max + 1))
2151ba4a712SPawel Jakub Dawidek				cmd="mknod /dev/loop${max} b 7 ${max}"
2161ba4a712SPawel Jakub Dawidek				${cmd} || die "failed: ${cmd}"
2171ba4a712SPawel Jakub Dawidek
2181ba4a712SPawel Jakub Dawidek				cmd="losetup -s -f ${fname}"
2191ba4a712SPawel Jakub Dawidek				diskname=`${cmd}` || die "failed: ${cmd}"
2201ba4a712SPawel Jakub Dawidek			fi
2211ba4a712SPawel Jakub Dawidek			DISKNAME=`eval echo ${diskname} | sed 's/^\/dev\///'`
2221ba4a712SPawel Jakub Dawidek		fi
2231ba4a712SPawel Jakub Dawidek		ln /dev/${DISKNAME} /dev/zfstest_${DISKNAME}
2241ba4a712SPawel Jakub Dawidek		DISKNAME="zfstest_${DISKNAME}"
2251ba4a712SPawel Jakub Dawidek		FDISKNAME="/dev/${DISKNAME}"
2261ba4a712SPawel Jakub Dawidek	else
2271ba4a712SPawel Jakub Dawidek		die "Sorry, your OS is not supported"
2281ba4a712SPawel Jakub Dawidek	fi
2291ba4a712SPawel Jakub Dawidek}
2301ba4a712SPawel Jakub Dawidek
2311ba4a712SPawel Jakub Dawidek# Destroy a memory-backed block device
2321ba4a712SPawel Jakub Dawidekdestroy_memdisk()
2331ba4a712SPawel Jakub Dawidek{
2341ba4a712SPawel Jakub Dawidek	disk="${1}"
2351ba4a712SPawel Jakub Dawidek
2361ba4a712SPawel Jakub Dawidek	if [ "${os}" = "FreeBSD" ]; then
2371ba4a712SPawel Jakub Dawidek		cmd="mdconfig -d -u ${disk}"
2381ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2391ba4a712SPawel Jakub Dawidek	elif [ "${os}" = "SunOS" ]; then
2401ba4a712SPawel Jakub Dawidek		cmd="lofiadm ${disk}"
2411ba4a712SPawel Jakub Dawidek		fname=`${cmd}` || die "failed: ${cmd}"
2421ba4a712SPawel Jakub Dawidek
2431ba4a712SPawel Jakub Dawidek		cmd="lofiadm -d ${disk}"
2441ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2451ba4a712SPawel Jakub Dawidek
2461ba4a712SPawel Jakub Dawidek		cmd="rm ${fname}"
2471ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2481ba4a712SPawel Jakub Dawidek	elif [ "${os}" = "Linux" ]; then
2491ba4a712SPawel Jakub Dawidek		cmd="rm /dev/${disk}"
2501ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2511ba4a712SPawel Jakub Dawidek		disk=`echo ${disk} | cut -c 9-`
2521ba4a712SPawel Jakub Dawidek
2531ba4a712SPawel Jakub Dawidek		cmd="losetup /dev/${disk} | awk '{print substr(\$3, 2, length(\$3)-2)}'"
2541ba4a712SPawel Jakub Dawidek		fname=`eval ${cmd}` || die "failed: ${cmd}"
2551ba4a712SPawel Jakub Dawidek
2561ba4a712SPawel Jakub Dawidek		cmd="losetup -d /dev/${disk}"
2571ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2581ba4a712SPawel Jakub Dawidek
2591ba4a712SPawel Jakub Dawidek		cmd="rm ${fname}"
2601ba4a712SPawel Jakub Dawidek		${cmd} || die "failed: ${cmd}"
2611ba4a712SPawel Jakub Dawidek	else
2621ba4a712SPawel Jakub Dawidek		die "Sorry, your OS is not supported"
2631ba4a712SPawel Jakub Dawidek	fi
2641ba4a712SPawel Jakub Dawidek}
2651ba4a712SPawel Jakub Dawidek
2661ba4a712SPawel Jakub Dawidekdisks_create()
2671ba4a712SPawel Jakub Dawidek{
2681ba4a712SPawel Jakub Dawidek	if [ -z "${ndisks}" ]; then
2691ba4a712SPawel Jakub Dawidek		start=0
2701ba4a712SPawel Jakub Dawidek	else
2711ba4a712SPawel Jakub Dawidek		start=${ndisks}
2721ba4a712SPawel Jakub Dawidek	fi
2731ba4a712SPawel Jakub Dawidek	ndisks=$((start+$1))
2741ba4a712SPawel Jakub Dawidek	n=$((ndisks-$start))
2751ba4a712SPawel Jakub Dawidek	if [ -z "${2}" ]; then
2761ba4a712SPawel Jakub Dawidek		size="96M"
2771ba4a712SPawel Jakub Dawidek	else
2781ba4a712SPawel Jakub Dawidek		size="${2}"
2791ba4a712SPawel Jakub Dawidek	fi
2801ba4a712SPawel Jakub Dawidek	for i in `nums $n $start`; do
2811ba4a712SPawel Jakub Dawidek		create_memdisk ${size}
2821ba4a712SPawel Jakub Dawidek		eval disk${i}="${DISKNAME}"
2831ba4a712SPawel Jakub Dawidek		eval fdisk${i}="${FDISKNAME}"
2841ba4a712SPawel Jakub Dawidek	done
2851ba4a712SPawel Jakub Dawidek}
2861ba4a712SPawel Jakub Dawidek
2871ba4a712SPawel Jakub Dawidekdisks_destroy()
2881ba4a712SPawel Jakub Dawidek{
2891ba4a712SPawel Jakub Dawidek	for i in `nums $ndisks 0`; do
2901ba4a712SPawel Jakub Dawidek		eval disk=\$disk${i}
2911ba4a712SPawel Jakub Dawidek		if [ ! -z "${disk}" ]; then
2921ba4a712SPawel Jakub Dawidek			destroy_memdisk ${disk}
2931ba4a712SPawel Jakub Dawidek		fi
2941ba4a712SPawel Jakub Dawidek	done
2951ba4a712SPawel Jakub Dawidek	[ -n "${TMPDIR_DISKS}" ] && TMPDIR="${TMPDIR_DISKS}" cleanup_tmpfs
2961ba4a712SPawel Jakub Dawidek	return 0
2971ba4a712SPawel Jakub Dawidek}
2981ba4a712SPawel Jakub Dawidek
2991ba4a712SPawel Jakub Dawidekdisk_create()
3001ba4a712SPawel Jakub Dawidek{
3011ba4a712SPawel Jakub Dawidek	diskno=${1}
3021ba4a712SPawel Jakub Dawidek	eval disk=\$disk${diskno}
3031ba4a712SPawel Jakub Dawidek	if [ ! -z ${disk} ]; then
3041ba4a712SPawel Jakub Dawidek		die "disk${diskno} is already set"
3051ba4a712SPawel Jakub Dawidek	fi
3061ba4a712SPawel Jakub Dawidek	dname=${2}
3071ba4a712SPawel Jakub Dawidek	if [ -z "${3}" ]; then
3081ba4a712SPawel Jakub Dawidek		size="96M"
3091ba4a712SPawel Jakub Dawidek	else
3101ba4a712SPawel Jakub Dawidek		size="${3}"
3111ba4a712SPawel Jakub Dawidek	fi
3121ba4a712SPawel Jakub Dawidek	create_memdisk ${size} ${dname}
3131ba4a712SPawel Jakub Dawidek	[ "${DISKNAME}" = "${dname}" ] || die "${DISKNAME} != ${dname}"
3141ba4a712SPawel Jakub Dawidek	eval disk${diskno}="${DISKNAME}"
3151ba4a712SPawel Jakub Dawidek	eval fdisk${diskno}="${FDISKNAME}"
3161ba4a712SPawel Jakub Dawidek}
3171ba4a712SPawel Jakub Dawidek
3181ba4a712SPawel Jakub Dawidekdisk_destroy()
3191ba4a712SPawel Jakub Dawidek{
3201ba4a712SPawel Jakub Dawidek	eval disk=\$disk${1}
3211ba4a712SPawel Jakub Dawidek	destroy_memdisk ${disk}
3221ba4a712SPawel Jakub Dawidek	eval disk${1}=""
3231ba4a712SPawel Jakub Dawidek}
3241ba4a712SPawel Jakub Dawidek
3251ba4a712SPawel Jakub Dawidekfiles_create()
3261ba4a712SPawel Jakub Dawidek{
3271ba4a712SPawel Jakub Dawidek	if [ -z "${nfiles}" ]; then
3281ba4a712SPawel Jakub Dawidek		start=0
3291ba4a712SPawel Jakub Dawidek	else
3301ba4a712SPawel Jakub Dawidek		start=${nfiles}
3311ba4a712SPawel Jakub Dawidek	fi
3321ba4a712SPawel Jakub Dawidek	nfiles=$((start+$1))
3331ba4a712SPawel Jakub Dawidek	n=$((nfiles-$start))
3341ba4a712SPawel Jakub Dawidek	if [ -z "${2}" ]; then
3351ba4a712SPawel Jakub Dawidek		size="96M"
3361ba4a712SPawel Jakub Dawidek	else
3371ba4a712SPawel Jakub Dawidek		size="${2}"
3381ba4a712SPawel Jakub Dawidek	fi
3391ba4a712SPawel Jakub Dawidek	for i in `nums $n $start`; do
3401ba4a712SPawel Jakub Dawidek		if [ "${os}" = "Linux" ]; then
3411ba4a712SPawel Jakub Dawidek			if [ -z "${TMPDIR_FILES}" ]; then
3421ba4a712SPawel Jakub Dawidek				setup_tmpfs
3431ba4a712SPawel Jakub Dawidek				TMPDIR_FILES="${TMPDIR}"
3441ba4a712SPawel Jakub Dawidek			fi
3451ba4a712SPawel Jakub Dawidek			file=`mktemp ${TMPDIR_FILES}/zfstest.XXXXXXXX`
3461ba4a712SPawel Jakub Dawidek		else
3471ba4a712SPawel Jakub Dawidek			file=`mktemp /tmp/zfstest.XXXXXXXX`
3481ba4a712SPawel Jakub Dawidek		fi
3491ba4a712SPawel Jakub Dawidek		truncate_cmd ${size} ${file}
3501ba4a712SPawel Jakub Dawidek		eval file${i}=${file}
3511ba4a712SPawel Jakub Dawidek	done
3521ba4a712SPawel Jakub Dawidek}
3531ba4a712SPawel Jakub Dawidek
3541ba4a712SPawel Jakub Dawidekfiles_destroy()
3551ba4a712SPawel Jakub Dawidek{
3561ba4a712SPawel Jakub Dawidek	for i in `nums $nfiles 0`; do
3571ba4a712SPawel Jakub Dawidek		eval file=\$file${i}
3581ba4a712SPawel Jakub Dawidek		rm -f ${file}
3591ba4a712SPawel Jakub Dawidek	done
3601ba4a712SPawel Jakub Dawidek	nfiles=0
3611ba4a712SPawel Jakub Dawidek	[ -n "${TMPDIR_FILES}" ] && TMPDIR="${TMPDIR_FILES}" cleanup_tmpfs
3621ba4a712SPawel Jakub Dawidek	return 0
3631ba4a712SPawel Jakub Dawidek}
3641ba4a712SPawel Jakub Dawidek
3651ba4a712SPawel Jakub Dawidekname_create()
3661ba4a712SPawel Jakub Dawidek{
367*59dee1b0SEnji Cooper	echo "zfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | awk '{ print $NF }'`"
3681ba4a712SPawel Jakub Dawidek}
3691ba4a712SPawel Jakub Dawidek
3701ba4a712SPawel Jakub Dawideknames_create()
3711ba4a712SPawel Jakub Dawidek{
3721ba4a712SPawel Jakub Dawidek	nnames=$1
3731ba4a712SPawel Jakub Dawidek	for i in `nums $nnames 0`; do
3741ba4a712SPawel Jakub Dawidek		eval name${i}=`name_create`
3751ba4a712SPawel Jakub Dawidek	done
3761ba4a712SPawel Jakub Dawidek}
3771ba4a712SPawel Jakub Dawidek
3781ba4a712SPawel Jakub Dawidekis_mountpoint()
3791ba4a712SPawel Jakub Dawidek{
3801ba4a712SPawel Jakub Dawidek	dir="${1}"
3811ba4a712SPawel Jakub Dawidek	if [ ! -d "${dir}" ]; then
3821ba4a712SPawel Jakub Dawidek		return 1
3831ba4a712SPawel Jakub Dawidek	fi
3841ba4a712SPawel Jakub Dawidek	if [ -n "${GNU_STAT}" ]; then
3851ba4a712SPawel Jakub Dawidek		statcmd="stat -c"
3861ba4a712SPawel Jakub Dawidek	else
3871ba4a712SPawel Jakub Dawidek		statcmd="stat -f"
3881ba4a712SPawel Jakub Dawidek	fi
3891ba4a712SPawel Jakub Dawidek	if [ "`${statcmd} '%d' ${dir} 2>/dev/null`" -eq "`${statcmd} '%d' ${dir}/.. 2>/dev/null`" ]; then
3901ba4a712SPawel Jakub Dawidek		return 1
3911ba4a712SPawel Jakub Dawidek	fi
3921ba4a712SPawel Jakub Dawidek	return 0
3931ba4a712SPawel Jakub Dawidek}
3941ba4a712SPawel Jakub Dawidek
3951ba4a712SPawel Jakub Dawideknums()
3961ba4a712SPawel Jakub Dawidek{
3971ba4a712SPawel Jakub Dawidek	which jot >/dev/null 2>&1
3981ba4a712SPawel Jakub Dawidek	if [ $? -eq 0 ]; then
3991ba4a712SPawel Jakub Dawidek		jot ${1} ${2}
4001ba4a712SPawel Jakub Dawidek		return $?
4011ba4a712SPawel Jakub Dawidek	fi
4021ba4a712SPawel Jakub Dawidek
4031ba4a712SPawel Jakub Dawidek	start="${2}"
4041ba4a712SPawel Jakub Dawidek	[ -z "${start}" ] && start="1";
4051ba4a712SPawel Jakub Dawidek	end=$((${1}+${start}-1))
4061ba4a712SPawel Jakub Dawidek
4071ba4a712SPawel Jakub Dawidek	which seq >/dev/null 2>&1
4081ba4a712SPawel Jakub Dawidek	if [ $? -eq 0 ]; then
4091ba4a712SPawel Jakub Dawidek		seq ${start} ${end}
4101ba4a712SPawel Jakub Dawidek		return $?
4111ba4a712SPawel Jakub Dawidek	fi
4121ba4a712SPawel Jakub Dawidek
4131ba4a712SPawel Jakub Dawidek	i=1
4141ba4a712SPawel Jakub Dawidek	while :; do
4151ba4a712SPawel Jakub Dawidek		echo $i
4161ba4a712SPawel Jakub Dawidek		if [ $i -eq ${1} ]; then
4171ba4a712SPawel Jakub Dawidek			break
4181ba4a712SPawel Jakub Dawidek		fi
4191ba4a712SPawel Jakub Dawidek		i=$((i+1))
4201ba4a712SPawel Jakub Dawidek	done
4211ba4a712SPawel Jakub Dawidek}
4221ba4a712SPawel Jakub Dawidek
4231ba4a712SPawel Jakub Dawidekwait_for_resilver()
4241ba4a712SPawel Jakub Dawidek{
4251ba4a712SPawel Jakub Dawidek	for i in `nums 64`; do
4261ba4a712SPawel Jakub Dawidek		${ZPOOL} status ${1} | grep replacing >/dev/null
4271ba4a712SPawel Jakub Dawidek		if [ $? -ne 0 ]; then
4281ba4a712SPawel Jakub Dawidek			break
4291ba4a712SPawel Jakub Dawidek		fi
4301ba4a712SPawel Jakub Dawidek		sleep 1
4311ba4a712SPawel Jakub Dawidek	done
4321ba4a712SPawel Jakub Dawidek}
4331ba4a712SPawel Jakub Dawidek
4341ba4a712SPawel Jakub Dawidekget_guid()
4351ba4a712SPawel Jakub Dawidek{
4361ba4a712SPawel Jakub Dawidek	${ZDB} -l ${1} | grep -B1 ${1} | grep guid | head -n1 | awk 'BEGIN {FS="="} {print $2}'
4371ba4a712SPawel Jakub Dawidek}
438