diff options
author | Sydney Vanda <[email protected]> | 2016-07-22 15:07:04 +0000 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-09-08 13:45:34 -0700 |
commit | 7050a65d5c760aa039d195fe0b6773a20a81048b (patch) | |
tree | 70bc4498bee7878d4abab11b95a7113c341b8152 /tests/zfs-tests/include/libtest.shlib | |
parent | 178acea364bc19da6cd30c6aaa7147f9a14fdb5a (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/libtest.shlib')
-rw-r--r-- | tests/zfs-tests/include/libtest.shlib | 175 |
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 |