zdb and inuse tests don't pass with real disks

Due to zpool create auto-partioning in Linux (i.e. sdb1),
certain utilities need to use the parition (sdb1) while
others use the whole disk name (sdb).

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Paul Zuchowski <pzuchowski@datto.com>
Closes #6939 
Closes #7261
This commit is contained in:
Paul Zuchowski 2018-03-07 20:03:33 -05:00 committed by Brian Behlendorf
parent 0e85048f53
commit 8e5d14844d
8 changed files with 59 additions and 15 deletions

View File

@ -423,3 +423,19 @@ function get_debug_device
{ {
lsscsi | nawk '/scsi_debug/ {print $6; exit}' | cut -d / -f3 lsscsi | nawk '/scsi_debug/ {print $6; exit}' | cut -d / -f3
} }
#
# Get actual devices used by the pool (i.e. linux sdb1 not sdb).
#
function get_pool_devices #testpool #devdir
{
typeset testpool=$1
typeset devdir=$2
typeset out=""
if is_linux; then
out=$(zpool status -P $testpool |grep ${devdir} | awk '{print $1}')
out=$(echo $out | sed -e "s|${devdir}/||g" | tr '\n' ' ')
fi
echo $out
}

View File

@ -806,7 +806,11 @@ function zero_partitions #<whole_disk_name>
typeset i typeset i
if is_linux; then if is_linux; then
log_must parted $DEV_DSKDIR/$diskname -s -- mklabel gpt DSK=$DEV_DSKDIR/$diskname
DSK=$(echo $DSK | sed -e "s|//|/|g")
log_must parted $DSK -s -- mklabel gpt
blockdev --rereadpt $DSK 2>/dev/null
block_device_wait
else else
for i in 0 1 3 4 5 6 7 for i in 0 1 3 4 5 6 7
do do
@ -834,10 +838,11 @@ function set_partition #<slice_num> <slice_start> <size_plus_units> <whole_disk
typeset start=$2 typeset start=$2
typeset size=$3 typeset size=$3
typeset disk=$4 typeset disk=$4
[[ -z $slicenum || -z $size || -z $disk ]] && \
log_fail "The slice, size or disk name is unspecified."
if is_linux; then if is_linux; then
if [[ -z $size || -z $disk ]]; then
log_fail "The size or disk name is unspecified."
fi
typeset size_mb=${size%%[mMgG]} typeset size_mb=${size%%[mMgG]}
size_mb=${size_mb%%[mMgG][bB]} size_mb=${size_mb%%[mMgG][bB]}
@ -880,6 +885,10 @@ function set_partition #<slice_num> <slice_start> <size_plus_units> <whole_disk
blockdev --rereadpt $DEV_DSKDIR/$disk 2>/dev/null blockdev --rereadpt $DEV_DSKDIR/$disk 2>/dev/null
block_device_wait block_device_wait
else else
if [[ -z $slicenum || -z $size || -z $disk ]]; then
log_fail "The slice, size or disk name is unspecified."
fi
typeset format_file=/var/tmp/format_in.$$ typeset format_file=/var/tmp/format_in.$$
echo "partition" >$format_file echo "partition" >$format_file

View File

@ -43,6 +43,11 @@ config_count=(1 2)
set -A DISK $DISKS set -A DISK $DISKS
default_mirror_setup_noexit $DISKS default_mirror_setup_noexit $DISKS
DEVS=$(get_pool_devices ${TESTPOOL} ${DEV_RDSKDIR})
log_note "$DEVS"
[[ -n $DEVS ]] && set -A DISK $DEVS
log_must dd if=/dev/${DISK[0]} of=/dev/${DISK[1]} bs=1K count=256 conv=notrunc log_must dd if=/dev/${DISK[0]} of=/dev/${DISK[1]} bs=1K count=256 conv=notrunc
for x in 0 1 ; do for x in 0 1 ; do

View File

@ -45,17 +45,22 @@ function cleanup
verify_runnable "global" verify_runnable "global"
verify_disk_count "$DISKS" 2 verify_disk_count "$DISKS" 2
set -A DISK $DISKS set -A DISK $DISKS
WHOLE_DISK=${DISK[0]}
default_mirror_setup_noexit $DISKS default_mirror_setup_noexit $DISKS
log_must zpool offline $TESTPOOL ${DISK[0]} DEVS=$(get_pool_devices ${TESTPOOL} ${DEV_RDSKDIR})
[[ -n $DEVS ]] && set -A DISK $DEVS
log_must zpool offline $TESTPOOL ${WHOLE_DISK}
log_must dd if=/dev/urandom of=$TESTDIR/testfile bs=1K count=2 log_must dd if=/dev/urandom of=$TESTDIR/testfile bs=1K count=2
log_must zpool export $TESTPOOL log_must zpool export $TESTPOOL
log_must dd if=$DEV_RDSKDIR/${DISK[0]} of=$DEV_RDSKDIR/${DISK[1]} bs=1K count=256 conv=notrunc log_must dd if=$DEV_RDSKDIR/${DISK[0]} of=$DEV_RDSKDIR/${DISK[1]} bs=1K count=256 conv=notrunc
ubs=$(zdb -lu $DEV_RDSKDIR/${DISK[1]} | grep -e LABEL -e Uberblock -e 'labels = ') ubs=$(zdb -lu ${DISK[1]} | grep -e LABEL -e Uberblock -e 'labels = ')
log_note "vdev 1: ubs $ubs" log_note "vdev 1: ubs $ubs"
ub_dump_counts=$(zdb -lu $DEV_RDSKDIR/${DISK[1]} | \ ub_dump_counts=$(zdb -lu ${DISK[1]} | \
awk ' /LABEL/ {label=$NF; blocks[label]=0}; awk ' /LABEL/ {label=$NF; blocks[label]=0};
/Uberblock/ {blocks[label]++}; /Uberblock/ {blocks[label]++};
END {print blocks[0],blocks[1],blocks[2],blocks[3]}') END {print blocks[0],blocks[1],blocks[2],blocks[3]}')

View File

@ -45,6 +45,10 @@ verify_disk_count "$DISKS" 2
set -A DISK $DISKS set -A DISK $DISKS
default_mirror_setup_noexit $DISKS default_mirror_setup_noexit $DISKS
DEVS=$(get_pool_devices ${TESTPOOL} ${DEV_RDSKDIR})
log_note "$DEVS"
[[ -n $DEVS ]] && set -A DISK $DEVS
log_must dd if=/dev/zero of=$DEV_RDSKDIR/${DISK[1]} bs=1K count=256 conv=notrunc log_must dd if=/dev/zero of=$DEV_RDSKDIR/${DISK[1]} bs=1K count=256 conv=notrunc
log_must truncate -s 0 $TEMPFILE log_must truncate -s 0 $TEMPFILE

View File

@ -82,19 +82,18 @@ typeset -i i=0
unset NOINUSE_CHECK unset NOINUSE_CHECK
while (( i < ${#vdevs[*]} )); do while (( i < ${#vdevs[*]} )); do
for num in 0 1 2 3 ; do for num in 0 1 2 3 ; do
eval typeset disk=\${FS_DISK$num} eval typeset disk=\${FS_DISK$num}
zero_partitions $disk zero_partitions $disk
done done
typeset cyl="" typeset cyl=""
for num in 0 1 2 3 ; do for num in 0 1 2 3 ; do
eval typeset slice=\${FS_SIDE$num} eval typeset slice=\${FS_SIDE$num}
disk=${slice%${SLICE_PREFIX}*} disk=${slice%${SLICE_PREFIX}*}
slice=${slice##*${SLICE_PREFIX}} [[ -z $SLICE_PREFIX ]] && eval typeset disk=\${FS_DISK$num}
slice=$(echo $slice | awk '{ print substr($1,length($1),1) }')
log_must set_partition $slice "$cyl" $FS_SIZE $disk log_must set_partition $slice "$cyl" $FS_SIZE $disk
cyl=$(get_endslice $disk $slice) [[ $num < 3 ]] && cyl=$(get_endslice $disk $slice)
done done
if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
@ -115,7 +114,6 @@ while (( i < ${#vdevs[*]} )); do
(( i = i + 1 )) (( i = i + 1 ))
continue continue
fi fi
create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks
verify_assertion "$rawtargets" verify_assertion "$rawtargets"
destroy_pool $TESTPOOL1 destroy_pool $TESTPOOL1

View File

@ -92,9 +92,10 @@ done
for num in 0 1 2 3 ; do for num in 0 1 2 3 ; do
eval typeset slice=\${FS_SIDE$num} eval typeset slice=\${FS_SIDE$num}
disk=${slice%${SLICE_PREFIX}*} disk=${slice%${SLICE_PREFIX}*}
slice=${slice##*${SLICE_PREFIX}} [[ -z $SLICE_PREFIX ]] && eval typeset disk=\${FS_DISK$num}
slice=$(echo $slice | awk '{ print substr($1,length($1),1) }')
log_must set_partition $slice "$cyl" $FS_SIZE $disk log_must set_partition $slice "$cyl" $FS_SIZE $disk
cyl=$(get_endslice $disk $slice) [[ $num < 3 ]] && cyl=$(get_endslice $disk $slice)
done done
while (( i < ${#vdevs[*]} )); do while (( i < ${#vdevs[*]} )); do

View File

@ -82,13 +82,19 @@ typeset -i i=0
while (( i < ${#vdevs[*]} )); do while (( i < ${#vdevs[*]} )); do
for num in 0 1 2 3 ; do
eval typeset disk=\${FS_DISK$num}
zero_partitions $disk
done
typeset cyl="" typeset cyl=""
for num in 0 1 2 3 ; do for num in 0 1 2 3 ; do
eval typeset slice=\${FS_SIDE$num} eval typeset slice=\${FS_SIDE$num}
disk=${slice%${SLICE_PREFIX}*} disk=${slice%${SLICE_PREFIX}*}
slice=${slice##*${SLICE_PREFIX}} [[ -z $SLICE_PREFIX ]] && eval typeset disk=\${FS_DISK$num}
slice=$(echo $slice | awk '{ print substr($1,length($1),1) }')
log_must set_partition $slice "$cyl" $FS_SIZE $disk log_must set_partition $slice "$cyl" $FS_SIZE $disk
cyl=$(get_endslice $disk $slice) [[ $num < 3 ]] && cyl=$(get_endslice $disk $slice)
done done
if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then