From ecaccf764a8ccbece8bb411f56b81ef5858fe710 Mon Sep 17 00:00:00 2001 From: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Tue, 10 May 2022 13:14:07 -0400 Subject: [PATCH] Workaround broken VDEV_UPATH Sometimes, for reasons I haven't looked into yet, VDEV_UPATH gets set to /dev/(null), breaking all these scripts. It'd be nice to have a fallback case to avoid total failure. Reviewed-by: Tony Hutter Reviewed-by: Brian Behlendorf Signed-off-by: Rich Ercolani Closes #13436 --- cmd/zpool/zpool.d/iostat | 16 ++++++++++++---- cmd/zpool/zpool.d/lsblk | 16 ++++++++++++---- cmd/zpool/zpool.d/smart | 12 ++++++++++-- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/cmd/zpool/zpool.d/iostat b/cmd/zpool/zpool.d/iostat index 95c459a3f0..2f8d79af89 100755 --- a/cmd/zpool/zpool.d/iostat +++ b/cmd/zpool/zpool.d/iostat @@ -15,6 +15,15 @@ if [ "$1" = "-h" ] ; then exit fi +# Sometimes, UPATH ends up /dev/(null). +# That should be corrected, but for now... +# shellcheck disable=SC2154 +if [ ! -b "$VDEV_UPATH" ]; then + somepath="${VDEV_PATH}" +else + somepath="${VDEV_UPATH}" +fi + if [ "$script" = "iostat-1s" ] ; then # Do a single one-second sample interval=1 @@ -27,8 +36,7 @@ elif [ "$script" = "iostat-10s" ] ; then brief="yes" fi -# shellcheck disable=SC2154 -if [ -f "$VDEV_UPATH" ] ; then +if [ -f "$somepath" ] ; then # We're a file-based vdev, iostat doesn't work on us. Do nothing. exit fi @@ -37,13 +45,13 @@ if [ "$(uname)" = "FreeBSD" ]; then out=$(iostat -dKx \ ${interval:+"-w $interval"} \ ${interval:+"-c 1"} \ - "$VDEV_UPATH" | tail -n 2) + "$somepath" | tail -n 2) else out=$(iostat -kx \ ${brief:+"-y"} \ ${interval:+"$interval"} \ ${interval:+"1"} \ - "$VDEV_UPATH" | grep -v '^$' | tail -n 2) + "$somepath" | grep -v '^$' | tail -n 2) fi diff --git a/cmd/zpool/zpool.d/lsblk b/cmd/zpool/zpool.d/lsblk index 1ed1464431..293effd48a 100755 --- a/cmd/zpool/zpool.d/lsblk +++ b/cmd/zpool/zpool.d/lsblk @@ -61,21 +61,29 @@ else list=$(echo "$script" | tr '[:upper:]' '[:lower:]') fi +# Sometimes, UPATH ends up /dev/(null). +# That should be corrected, but for now... +# shellcheck disable=SC2154 +if [ ! -b "$VDEV_UPATH" ]; then + somepath="${VDEV_PATH}" +else + somepath="${VDEV_UPATH}" +fi + # Older versions of lsblk don't support all these values (like SERIAL). for i in $list ; do # Special case: Looking up the size of a file-based vdev can't # be done with lsblk. - # shellcheck disable=SC2154 - if [ "$i" = "size" ] && [ -f "$VDEV_UPATH" ] ; then - size=$(du -h --apparent-size "$VDEV_UPATH" | cut -f 1) + if [ "$i" = "size" ] && [ -f "$somepath" ] ; then + size=$(du -h --apparent-size "$somepath" | cut -f 1) echo "size=$size" continue fi val="" - if val=$(eval "lsblk -dl -n -o $i $VDEV_UPATH 2>/dev/null") ; then + if val=$(eval "lsblk -dl -n -o $i $somepath 2>/dev/null") ; then # Remove leading/trailing whitespace from value val=$(echo "$val" | sed -e 's/^[[:space:]]*//' \ -e 's/[[:space:]]*$//') diff --git a/cmd/zpool/zpool.d/smart b/cmd/zpool/zpool.d/smart index 032491988c..8ad3e107f0 100755 --- a/cmd/zpool/zpool.d/smart +++ b/cmd/zpool/zpool.d/smart @@ -69,8 +69,16 @@ if [ "$1" = "-h" ] ; then exit fi +# Sometimes, UPATH ends up /dev/(null). +# That should be corrected, but for now... # shellcheck disable=SC2154 -if [ -b "$VDEV_UPATH" ] && PATH="/usr/sbin:$PATH" command -v smartctl > /dev/null || [ -n "$samples" ] ; then +if [ ! -b "$VDEV_UPATH" ]; then + somepath="${VDEV_PATH}" +else + somepath="${VDEV_UPATH}" +fi + +if [ -b "$somepath" ] && PATH="/usr/sbin:$PATH" command -v smartctl > /dev/null || [ -n "$samples" ] ; then if [ -n "$samples" ] ; then # cat a smartctl output text file instead of running smartctl # on a vdev (only used for developer testing). @@ -78,7 +86,7 @@ if [ -b "$VDEV_UPATH" ] && PATH="/usr/sbin:$PATH" command -v smartctl > /dev/nul echo "file=$file" raw_out=$(cat "$samples/$file") else - raw_out=$(sudo smartctl -a "$VDEV_UPATH") + raw_out=$(sudo smartctl -a "$somepath") fi # What kind of drive are we? Look for the right line in smartctl: