From deb36d236e2dd86ddc16b33d5ca8c648cc8ed369 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Wed, 1 Sep 2021 15:46:04 +0200 Subject: [PATCH 3/5] vdo: better message for missing device Show readable message when passed device cannot be accessed. And use STAT shell var wrapper to call 'stat' command. (cherry picked from commit 3287d37f440ca272b52f900fc60ee5effcf73697) Conflicts: scripts/lvm_import_vdo.sh --- scripts/lvm_import_vdo.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh index f8dd71f..dec32bc 100755 --- a/scripts/lvm_import_vdo.sh +++ b/scripts/lvm_import_vdo.sh @@ -18,8 +18,8 @@ # # Needed utilities: # lvm, dmsetup, -# vdo, vdo2lvm, -# grep, awk, sed, blockdev, readlink, mkdir +# vdo, +# grep, awk, sed, blockdev, readlink, stat, mkdir # # Conversion is using 'vdo convert' support from VDO manager to move # existing VDO header by 2M which makes space to place in PV header @@ -40,6 +40,7 @@ VDOCONF=${VDOCONF:-} BLOCKDEV="blockdev" READLINK="readlink" READLINK_E="-e" +STAT="stat" MKDIR="mkdir" DMSETUP="dmsetup" @@ -156,8 +157,8 @@ detect_lv_() { local MAJORMINOR DEVICE=${1/#"${DM_DEV_DIR}/"/} - DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") - test -n "$DEVICE" || error "Cannot get readlink \"$1\"." + DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE" || true) + test -n "$DEVICE" || error "Readlink cannot access device \"$1\"." RDEVICE=$DEVICE case "$RDEVICE" in # hardcoded /dev since udev does not create these entries elsewhere @@ -168,9 +169,9 @@ detect_lv_() { DEVMINOR=${MAJORMINOR##*:} ;; *) - STAT=$(stat --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE") - test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." - eval "$STAT" + RSTAT=$("$STAT" --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE" || true) + test -n "$RSTAT" || error "Cannot get major:minor for \"$DEVICE\"." + eval "$RSTAT" ;; esac @@ -269,8 +270,8 @@ convert2lvm_() { for i in $(awk '/.*device:/ {print $2}' "$TEMPDIR/vdoconf.yml") ; do local DEV DEV=$("$READLINK" $READLINK_E "$i") || continue - STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue - eval "$STAT" + RSTAT=$("$STAT" --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue + eval "$RSTAT" test "$MAJOR" = "$DEVMAJOR" && test "$MINOR" = "$DEVMINOR" && { test -z "$FOUND" || error "VDO configuration contains duplicate entries $FOUND and $i" FOUND=$i @@ -287,7 +288,7 @@ convert2lvm_() { DM_OPEN="$("$DMSETUP" info -c -o open "$VDONAME" --noheadings --nameprefixes 2>/dev/null || true)" case "$DM_OPEN" in Device*) ;; # no devices - *) eval "$DM_OPEN" + *) eval "$DM_OPEN" test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" ;; esac -- 1.8.3.1