summaryrefslogtreecommitdiffstats
path: root/tests/zfs-tests/include/libtest.shlib
diff options
context:
space:
mode:
Diffstat (limited to 'tests/zfs-tests/include/libtest.shlib')
-rw-r--r--tests/zfs-tests/include/libtest.shlib175
1 files changed, 175 insertions, 0 deletions
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