summaryrefslogtreecommitdiffstats
path: root/tests/zfs-tests/include
diff options
context:
space:
mode:
authorSydney Vanda <[email protected]>2016-07-22 15:07:04 +0000
committerBrian Behlendorf <[email protected]>2016-09-08 13:45:34 -0700
commit7050a65d5c760aa039d195fe0b6773a20a81048b (patch)
tree70bc4498bee7878d4abab11b95a7113c341b8152 /tests/zfs-tests/include
parent178acea364bc19da6cd30c6aaa7147f9a14fdb5a (diff)
Real disk partitioning now enabled in test suite for Linux
When using real devices, specify DISKS="sdb sdc sdd" opposed to /dev/sdb in zfs-tests.sh - otherwise errors with directory names and disk names registering as "/dev//dev/sdb" for some tests. The same goes for mpath: DISK="mpatha mpathad mpathb" Expected Usage: $ DISKS="sdb sdc sdd" zfs-tests.sh SLICE_PREFIX is now set as "p" for a loop device (ie loop0p2) or "" for a real device (ie sdb2), or either for multipath devices (ie mpatha1 or mpath1p1) instead of only "p" by default. Note that kpartx partitioning is not currently supported in this patch (ie "partx") and may need to be disabled on Debian distributions. Functions added for determining test directory (/dev or /dev/mapper) as well as slice prefix are determined and exported mostly in the cfg file of each test group directory. Currently zpools cannot be created on whole mpath devices that have been partitioned. In order to fix this tests have either been revised to use a partition instead, or if there is a size constraint and the pool needs to be created on the whole disk, partitions are then deleted if the device is a multipath device. This functionality is added to default_cleanup() or to individual cleanup scripts if a non-default cleanup method is used. The max partitions is currently set at 8 to account for all of the tests thus far. Patch changes are generally encompassed in "if is_linux" construct. Signed-off-by: Sydney Vanda <[email protected]> Reviewed-by: John Salinas <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: David Quigley <[email protected]> Closes #4447 Closes #4964 Closes #5074
Diffstat (limited to 'tests/zfs-tests/include')
-rw-r--r--tests/zfs-tests/include/commands.cfg.in2
-rw-r--r--tests/zfs-tests/include/default.cfg.in6
-rw-r--r--tests/zfs-tests/include/libtest.shlib175
3 files changed, 181 insertions, 2 deletions
diff --git a/tests/zfs-tests/include/commands.cfg.in b/tests/zfs-tests/include/commands.cfg.in
index bea8df629..10d8ffd8a 100644
--- a/tests/zfs-tests/include/commands.cfg.in
+++ b/tests/zfs-tests/include/commands.cfg.in
@@ -52,6 +52,7 @@ export LOCKFS="@LOCKFS@"
export LOFIADM="@LOFIADM@"
export LOGNAME="@LOGNAME@"
export LS="@LS@"
+export LSBLK="@LSBLK@"
export MD5SUM="@MD5SUM@"
export MKDIR="@MKDIR@"
export MKNOD="@MKNOD@"
@@ -75,6 +76,7 @@ export PRTVTOC="@PRTVTOC@"
export PS="@PS@"
export PSRINFO="@PSRINFO@"
export PYTHON="@PYTHON@"
+export READLINK="@READLINK@"
export REBOOT="@REBOOT@"
export RM="@RM@"
export RMDIR="@RMDIR@"
diff --git a/tests/zfs-tests/include/default.cfg.in b/tests/zfs-tests/include/default.cfg.in
index 13317ea87..ec2eb90f0 100644
--- a/tests/zfs-tests/include/default.cfg.in
+++ b/tests/zfs-tests/include/default.cfg.in
@@ -171,6 +171,8 @@ for i in $ZFS_ALL_VERSIONS; do
eval 'export ZFS_VERSION_$i="v${i}-fs"'
done
+export MAX_PARTITIONS=8
+
if is_linux; then
unpack_opts="--sparse -xf"
pack_opts="--sparse -cf"
@@ -180,8 +182,8 @@ if is_linux; then
ZVOL_DEVDIR="/dev/zvol"
ZVOL_RDEVDIR="/dev/zvol"
- DEV_DSKDIR="/dev"
DEV_RDSKDIR="/dev"
+ DEV_MPATHDIR="/dev/mapper"
NEWFS_DEFAULT_FS="ext2"
else
@@ -199,4 +201,4 @@ else
NEWFS_DEFAULT_FS="ufs"
fi
export unpack_opts pack_opts verbose unpack_preserve pack_preserve \
- ZVOL_DEVDIR ZVOL_RDEVDIR NEWFS_DEFAULT_FS DEV_DSKDIR DEV_RDSKDIR
+ ZVOL_DEVDIR ZVOL_RDEVDIR NEWFS_DEFAULT_FS DEV_RDSKDIR DEV_MPATHDIR
diff --git a/tests/zfs-tests/include/libtest.shlib b/tests/zfs-tests/include/libtest.shlib
index a9236a3bc..0c9ddd1cf 100644
--- a/tests/zfs-tests/include/libtest.shlib
+++ b/tests/zfs-tests/include/libtest.shlib
@@ -456,6 +456,11 @@ function default_cleanup_noexit
[[ -d $TESTDIR ]] && \
log_must $RM -rf $TESTDIR
+
+ disk1=${DISKS%% *}
+ if is_mpath_device $disk1; then
+ delete_partitions
+ fi
}
@@ -734,6 +739,69 @@ function set_partition #<slice_num> <slice_start> <size_plus_units> <whole_disk
}
#
+# Delete all partitions on all disks - this is specifically for the use of multipath
+# devices which currently can only be used in the test suite as raw/un-partitioned
+# devices (ie a zpool cannot be created on a whole mpath device that has partitions)
+#
+function delete_partitions
+{
+ typeset -i j=1
+
+ if [[ -z $DISK_ARRAY_NUM ]]; then
+ DISK_ARRAY_NUM=$($ECHO ${DISKS} | $NAWK '{print NF}')
+ fi
+ if [[ -z $DISKSARRAY ]]; then
+ DISKSARRAY=$DISKS
+ fi
+
+ if is_linux; then
+ if (( $DISK_ARRAY_NUM == 1 )); then
+ while ((j < MAX_PARTITIONS)); do
+ $FORMAT $DEV_DSKDIR/$DISK -s rm $j > /dev/null 2>&1
+ if (( $? == 1 )); then
+ $LSBLK | $EGREP ${DISK}${SLICE_PREFIX}${j} > /dev/null
+ if (( $? == 1 )); then
+ log_note "Partitions for $DISK should be deleted"
+ else
+ log_fail "Partition for ${DISK}${SLICE_PREFIX}${j} not deleted"
+ fi
+ return 0
+ else
+ $LSBLK | $EGREP ${DISK}${SLICE_PREFIX}${j} > /dev/null
+ if (( $? == 0 )); then
+ log_fail "Partition for ${DISK}${SLICE_PREFIX}${j} not deleted"
+ fi
+ fi
+ ((j = j+1))
+ done
+ else
+ for disk in `$ECHO $DISKSARRAY`; do
+ while ((j < MAX_PARTITIONS)); do
+ $FORMAT $DEV_DSKDIR/$disk -s rm $j > /dev/null 2>&1
+ if (( $? == 1 )); then
+ $LSBLK | $EGREP ${disk}${SLICE_PREFIX}${j} > /dev/null
+ if (( $? == 1 )); then
+ log_note "Partitions for $disk should be deleted"
+ else
+ log_fail "Partition for ${disk}${SLICE_PREFIX}${j} not deleted"
+ fi
+ j=7
+ else
+ $LSBLK | $EGREP ${disk}${SLICE_PREFIX}${j} > /dev/null
+ if (( $? == 0 )); then
+ log_fail "Partition for ${disk}${SLICE_PREFIX}${j} not deleted"
+ fi
+ fi
+ ((j = j+1))
+ done
+ j=1
+ done
+ fi
+ fi
+ return 0
+}
+
+#
# Get the end cyl of the given slice
#
function get_endslice #<disk> <slice>
@@ -2483,6 +2551,113 @@ function is_physical_device #device
}
#
+# Check if the given device is a real device (ie SCSI device)
+#
+function is_real_device #disk
+{
+ typeset disk=$1
+ [[ -z $disk ]] && log_fail "No argument for disk given."
+
+ if is_linux; then
+ $LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP disk > /dev/null 2>&1
+ return $?
+ fi
+}
+
+#
+# Check if the given device is a loop device
+#
+function is_loop_device #disk
+{
+ typeset disk=$1
+ [[ -z $disk ]] && log_fail "No argument for disk given."
+
+ if is_linux; then
+ $LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP loop > /dev/null 2>&1
+ return $?
+ fi
+}
+
+#
+# Check if the given device is a multipath device and if there is a sybolic
+# link to a device mapper and to a disk
+# Currently no support for dm devices alone without multipath
+#
+function is_mpath_device #disk
+{
+ typeset disk=$1
+ [[ -z $disk ]] && log_fail "No argument for disk given."
+
+ if is_linux; then
+ $LSBLK $DEV_MPATHDIR/$disk -o TYPE | $EGREP mpath > /dev/null 2>&1
+ if (($? == 0)); then
+ $READLINK $DEV_MPATHDIR/$disk > /dev/null 2>&1
+ return $?
+ else
+ return $?
+ fi
+ fi
+}
+
+# Set the slice prefix for disk partitioning depending
+# on whether the device is a real, multipath, or loop device.
+# Currently all disks have to be of the same type, so only
+# checks first disk to determine slice prefix.
+#
+function set_slice_prefix
+{
+ typeset disk
+ typeset -i i=0
+
+ if is_linux; then
+ while (( i < $DISK_ARRAY_NUM )); do
+ disk="$($ECHO $DISKS | $NAWK '{print $(i + 1)}')"
+ if ( is_mpath_device $disk ) && [[ -z $($ECHO $disk | awk 'substr($1,18,1)\
+ ~ /^[[:digit:]]+$/') ]] || ( is_real_device $disk ); then
+ export SLICE_PREFIX=""
+ return 0
+ elif ( is_mpath_device $disk || is_loop_device $disk ); then
+ export SLICE_PREFIX="p"
+ return 0
+ else
+ log_fail "$disk not supported for partitioning."
+ fi
+ (( i = i + 1))
+ done
+ fi
+}
+
+#
+# Set the directory path of the listed devices in $DISK_ARRAY_NUM
+# Currently all disks have to be of the same type, so only
+# checks first disk to determine device directory
+# default = /dev (linux)
+# real disk = /dev (linux)
+# multipath device = /dev/mapper (linux)
+#
+function set_device_dir
+{
+ typeset disk
+ typeset -i i=0
+
+ if is_linux; then
+ while (( i < $DISK_ARRAY_NUM )); do
+ disk="$($ECHO $DISKS | $NAWK '{print $(i + 1)}')"
+ if is_mpath_device $disk; then
+ export DEV_DSKDIR=$DEV_MPATHDIR
+ return 0
+ else
+ export DEV_DSKDIR=$DEV_RDSKDIR
+ return 0
+ fi
+ (( i = i + 1))
+ done
+ else
+ export DEV_DSKDIR=$DEV_RDSKDIR
+ fi
+}
+
+#
# Get the directory path of given device
#
function get_device_dir #device