mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
ZTS: Add helper for disk device check
Replace `test -b` and equivalents with `is_disk_device`, so that `-c` is used instead on FreeBSD which has no block cache layer for devices. Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ryan Moeller <ryan@ixsystems.com> Closes #9795
This commit is contained in:
parent
d7164b27be
commit
665684d721
@ -93,11 +93,19 @@ function is_physical_device #device
|
|||||||
device=${device#$DEV_RDSKDIR}
|
device=${device#$DEV_RDSKDIR}
|
||||||
|
|
||||||
if is_linux; then
|
if is_linux; then
|
||||||
[[ -b "$DEV_DSKDIR/$device" ]] && \
|
is_disk_device "$DEV_DSKDIR/$device" && \
|
||||||
[[ -f /sys/module/loop/parameters/max_part ]]
|
[[ -f /sys/module/loop/parameters/max_part ]]
|
||||||
return $?
|
return $?
|
||||||
elif is_freebsd; then
|
elif is_freebsd; then
|
||||||
echo $device | grep -q -e '^a?da[0-9]*$' -e '^md[0-9]*$' > /dev/null 2>&1
|
is_disk_device "$DEV_DSKDIR/$device" && \
|
||||||
|
echo $device | grep -q \
|
||||||
|
-e '^a?da[0-9]+$' \
|
||||||
|
-e '^md[0-9]+$' \
|
||||||
|
-e '^mfid[0-9]+$' \
|
||||||
|
-e '^nda[0-9]+$' \
|
||||||
|
-e '^nvd[0-9]+$' \
|
||||||
|
-e '^vtbd[0-9]+$' \
|
||||||
|
> /dev/null 2>&1
|
||||||
return $?
|
return $?
|
||||||
else
|
else
|
||||||
echo $device | egrep "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1
|
echo $device | egrep "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1
|
||||||
@ -162,12 +170,27 @@ function is_mpath_device #disk
|
|||||||
return $?
|
return $?
|
||||||
fi
|
fi
|
||||||
elif is_freebsd; then
|
elif is_freebsd; then
|
||||||
test -b $DEV_MPATHDIR/$disk
|
is_disk_device $DEV_MPATHDIR/$disk
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check if the given path is the appropriate sort of device special node.
|
||||||
|
#
|
||||||
|
function is_disk_device #path
|
||||||
|
{
|
||||||
|
typeset path=$1
|
||||||
|
|
||||||
|
if is_freebsd; then
|
||||||
|
# FreeBSD doesn't have block devices, only character devices.
|
||||||
|
test -c $path
|
||||||
|
else
|
||||||
|
test -b $path
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Set the slice prefix for disk partitioning depending
|
# Set the slice prefix for disk partitioning depending
|
||||||
# on whether the device is a real, multipath, or loop device.
|
# on whether the device is a real, multipath, or loop device.
|
||||||
# Currently all disks have to be of the same type, so only
|
# Currently all disks have to be of the same type, so only
|
||||||
@ -241,7 +264,7 @@ function get_device_dir #device
|
|||||||
if [[ $device != "/" ]]; then
|
if [[ $device != "/" ]]; then
|
||||||
device=${device%/*}
|
device=${device%/*}
|
||||||
fi
|
fi
|
||||||
if [[ -b "$DEV_DSKDIR/$device" ]]; then
|
if is_disk_device "$DEV_DSKDIR/$device"; then
|
||||||
device="$DEV_DSKDIR"
|
device="$DEV_DSKDIR"
|
||||||
fi
|
fi
|
||||||
echo $device
|
echo $device
|
||||||
|
@ -2392,13 +2392,12 @@ EOF
|
|||||||
# each case. limit the number to max_finddisksnum
|
# each case. limit the number to max_finddisksnum
|
||||||
count=0
|
count=0
|
||||||
for disk in $unused_candidates; do
|
for disk in $unused_candidates; do
|
||||||
if [ -b $DEV_DSKDIR/${disk}s0 ]; then
|
if is_disk_device $DEV_DSKDIR/${disk}s0 && \
|
||||||
if [ $count -lt $max_finddisksnum ]; then
|
[ $count -lt $max_finddisksnum ]; then
|
||||||
unused="$unused $disk"
|
unused="$unused $disk"
|
||||||
# do not impose limit if $@ is provided
|
# do not impose limit if $@ is provided
|
||||||
[[ -z $@ ]] && ((count = count + 1))
|
[[ -z $@ ]] && ((count = count + 1))
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# finally, return our disk list
|
# finally, return our disk list
|
||||||
|
@ -26,7 +26,7 @@ verify_runnable "global"
|
|||||||
DISK1=${DISKS%% *}
|
DISK1=${DISKS%% *}
|
||||||
|
|
||||||
typeset -i max_discard=0
|
typeset -i max_discard=0
|
||||||
if [[ -b $DEV_RDSKDIR/$DISK1 ]]; then
|
if is_disk_device $DEV_RDSKDIR/$DISK1; then
|
||||||
max_discard=$(lsblk -Dbn $DEV_RDSKDIR/$DISK1 | awk '{ print $4; exit }')
|
max_discard=$(lsblk -Dbn $DEV_RDSKDIR/$DISK1 | awk '{ print $4; exit }')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -76,23 +76,23 @@ log_must diff <(echo ${contents//$recv_mnt/}) \
|
|||||||
log_must zfs redact $sendvol@snap book2 $clonevol@snap
|
log_must zfs redact $sendvol@snap book2 $clonevol@snap
|
||||||
log_must eval "zfs send --redact book2 $sendvol@snap >$stream"
|
log_must eval "zfs send --redact book2 $sendvol@snap >$stream"
|
||||||
log_must eval "zfs receive $recvvol <$stream"
|
log_must eval "zfs receive $recvvol <$stream"
|
||||||
[[ -b $recv_vol_file ]] && log_fail "Volume device file should not exist."
|
is_disk_device $recv_vol_file && log_fail "Volume device file should not exist."
|
||||||
log_must set_tunable32 zfs_allow_redacted_dataset_mount 1
|
log_must set_tunable32 zfs_allow_redacted_dataset_mount 1
|
||||||
log_must zpool export $POOL2
|
log_must zpool export $POOL2
|
||||||
log_must zpool import $POOL2
|
log_must zpool import $POOL2
|
||||||
udevadm settle
|
udevadm settle
|
||||||
|
|
||||||
# The device file isn't guaranteed to show up right away.
|
# The device file isn't guaranteed to show up right away.
|
||||||
if [[ ! -b $recv_vol_file ]]; then
|
if ! is_disk_device $recv_vol_file; then
|
||||||
udevadm settle
|
udevadm settle
|
||||||
for t in 10 5 3 2 1; do
|
for t in 10 5 3 2 1; do
|
||||||
log_note "Polling $t seconds for device file."
|
log_note "Polling $t seconds for device file."
|
||||||
udevadm settle
|
udevadm settle
|
||||||
sleep $t
|
sleep $t
|
||||||
[[ -b $recv_vol_file ]] && break
|
is_disk_device $recv_vol_file && break
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
[[ -b $recv_vol_file ]] || log_fail "Volume device file should exist."
|
is_disk_device $recv_vol_file || log_fail "Volume device file should exist."
|
||||||
|
|
||||||
log_must dd if=/dev/urandom of=$send_mnt/dir1/contents1 bs=512 count=2
|
log_must dd if=/dev/urandom of=$send_mnt/dir1/contents1 bs=512 count=2
|
||||||
log_must rm $send_mnt/dir1/dir2/empty
|
log_must rm $send_mnt/dir1/dir2/empty
|
||||||
|
@ -44,13 +44,13 @@ sleep 10
|
|||||||
log_must zpool export $POOL
|
log_must zpool export $POOL
|
||||||
log_must zpool import $POOL
|
log_must zpool import $POOL
|
||||||
udevadm settle
|
udevadm settle
|
||||||
if [[ ! -b $send_file ]]; then
|
if ! is_disk_device $send_file; then
|
||||||
udevadm settle
|
udevadm settle
|
||||||
for t in 10 5 3 2 1; do
|
for t in 10 5 3 2 1; do
|
||||||
log_note "Polling $t seconds for device file."
|
log_note "Polling $t seconds for device file."
|
||||||
udevadm settle
|
udevadm settle
|
||||||
sleep $t
|
sleep $t
|
||||||
[[ -b $send_file ]] && break
|
is_disk_device $send_file && break
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
log_must dd if=/dev/urandom of=$send_file bs=8k count=64
|
log_must dd if=/dev/urandom of=$send_file bs=8k count=64
|
||||||
@ -66,13 +66,13 @@ sleep 10
|
|||||||
log_must zpool export $POOL2
|
log_must zpool export $POOL2
|
||||||
log_must zpool import $POOL2
|
log_must zpool import $POOL2
|
||||||
udevadm settle
|
udevadm settle
|
||||||
if [[ ! -b $recv_file ]]; then
|
if ! is_disk_device $recv_file; then
|
||||||
udevadm settle
|
udevadm settle
|
||||||
for t in 10 5 3 2 1; do
|
for t in 10 5 3 2 1; do
|
||||||
log_note "Polling $t seconds for device file."
|
log_note "Polling $t seconds for device file."
|
||||||
udevadm settle
|
udevadm settle
|
||||||
sleep $t
|
sleep $t
|
||||||
[[ -b $recv_file ]] && break
|
is_disk_device $recv_file && break
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
log_must dd if=$send_file of=$tmpdir/send.dd bs=8k count=64
|
log_must dd if=$send_file of=$tmpdir/send.dd bs=8k count=64
|
||||||
@ -89,13 +89,13 @@ sleep 10
|
|||||||
log_must zpool export $POOL2
|
log_must zpool export $POOL2
|
||||||
log_must zpool import $POOL2
|
log_must zpool import $POOL2
|
||||||
udevadm settle
|
udevadm settle
|
||||||
if [[ ! -b $recv_file ]]; then
|
if ! is_disk_device $recv_file; then
|
||||||
udevadm settle
|
udevadm settle
|
||||||
for t in 10 5 3 2 1; do
|
for t in 10 5 3 2 1; do
|
||||||
log_note "Polling $t seconds for device file."
|
log_note "Polling $t seconds for device file."
|
||||||
udevadm settle
|
udevadm settle
|
||||||
sleep $t
|
sleep $t
|
||||||
[[ -b $recv_file ]] && break
|
is_disk_device $recv_file && break
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
log_must dd if=$send_file of=$tmpdir/send.dd bs=8k count=32 skip=32
|
log_must dd if=$send_file of=$tmpdir/send.dd bs=8k count=32 skip=32
|
||||||
|
@ -30,7 +30,7 @@ else
|
|||||||
DISK1=${DISKS%% *}
|
DISK1=${DISKS%% *}
|
||||||
|
|
||||||
typeset -i max_discard=0
|
typeset -i max_discard=0
|
||||||
if [[ -b $DEV_RDSKDIR/$DISK1 ]]; then
|
if is_disk_device $DEV_RDSKDIR/$DISK1; then
|
||||||
max_discard=$(lsblk -Dbn $DEV_RDSKDIR/$DISK1 | awk '{ print $4; exit }')
|
max_discard=$(lsblk -Dbn $DEV_RDSKDIR/$DISK1 | awk '{ print $4; exit }')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ function blockdev_exists # device
|
|||||||
# that can affect device nodes
|
# that can affect device nodes
|
||||||
for i in {1..3}; do
|
for i in {1..3}; do
|
||||||
udev_wait
|
udev_wait
|
||||||
[[ -b "$device" ]] && return 0
|
is_disk_device "$device" && return 0
|
||||||
done
|
done
|
||||||
log_fail "$device does not exist as a block device"
|
log_fail "$device does not exist as a block device"
|
||||||
}
|
}
|
||||||
@ -127,17 +127,17 @@ function verify_partition # device
|
|||||||
{
|
{
|
||||||
typeset device="$1"
|
typeset device="$1"
|
||||||
|
|
||||||
if [[ ! -b "$device" ]]; then
|
if ! is_disk_device "$device"; then
|
||||||
log_fail "$device is not a block device"
|
log_fail "$device is not a block device"
|
||||||
fi
|
fi
|
||||||
# create a small dummy partition
|
# create a small dummy partition
|
||||||
set_partition 0 1 1m $device
|
set_partition 0 1 1m $device
|
||||||
# verify we can access the partition on the device
|
# verify we can access the partition on the device
|
||||||
devname="$(readlink -f "$device")"
|
devname="$(readlink -f "$device")"
|
||||||
if is_linux; then
|
if is_linux || is_freebsd; then
|
||||||
[[ -b "$devname""p1" ]]
|
is_disk_device "$devname""p1"
|
||||||
else
|
else
|
||||||
[[ -b "$devname""s0" ]]
|
is_disk_device "$devname""s0"
|
||||||
fi
|
fi
|
||||||
return $?
|
return $?
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user