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