]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Workaround broken VDEV_UPATH
authorRich Ercolani <214141+rincebrain@users.noreply.github.com>
Tue, 10 May 2022 17:14:07 +0000 (13:14 -0400)
committerGitHub <noreply@github.com>
Tue, 10 May 2022 17:14:07 +0000 (10:14 -0700)
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 <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rich Ercolani <rincebrain@gmail.com>
Closes #13436

cmd/zpool/zpool.d/iostat
cmd/zpool/zpool.d/lsblk
cmd/zpool/zpool.d/smart

index 95c459a3f0bf3e2cf5e8ed532a0ada2279384d1c..2f8d79af89262dda373978275214f4097e1e777d 100755 (executable)
@@ -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
 
 
index 1ed1464431aac0faaac2cdc8db7cd5b01b858ab5..293effd48ac522f7907a21689b47f3c0c4104f0a 100755 (executable)
@@ -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:]]*$//')
index 032491988c183ed879a8aec1ba9ffb4c9ab5b717..8ad3e107f09149e62b8c8ed62827e95c540700cd 100755 (executable)
@@ -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: