]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
feat(lvm): only run lvchange for LV that is seen on devices
authorDavid Teigland <teigland@redhat.com>
Fri, 10 Dec 2021 18:51:26 +0000 (12:51 -0600)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Wed, 2 Feb 2022 22:48:13 +0000 (22:48 +0000)
Change the command listing LVs from lvscan to lvs, and list
only the LV names that are being activated.  Before attempting
to activate an LV, check that that LV name appears in the
lvs command output.  This avoids wasting time running an
lvchange command that we know will fail.

modules.d/90lvm/lvm_scan.sh

index bda265f6e27f95ae660e2d3e7d99a1e987280fe8..89f077aef9940ff60b90a707c6725767385af4ed 100755 (executable)
@@ -119,7 +119,7 @@ sub=${sub%%\(*}
 # ignores locking failures (--ignorelockingfailure)
 # disables hints (--nohints)
 #
-# For lvscan and vgscan:
+# For lvs and vgscan:
 # disable locking (--nolocking)
 # disable hints (--nohints)
 
@@ -136,10 +136,20 @@ check_lvm_ver 2 3 14 "$maj" "$min" "$sub" \
 if [ -n "$LVS" ]; then
     info "Scanning devices $lvmdevs for LVM logical volumes $LVS"
     # shellcheck disable=SC2086
-    lvm lvscan $scan_args 2>&1 | vinfo
+    LVSLIST=$(lvm lvs $scan_args --noheading -o lv_full_name,segtype $LVS)
+    info "$LVSLIST"
+
+    # Only attempt to activate an LV if it appears in the lvs output.
     for LV in $LVS; do
-        # shellcheck disable=SC2086
-        lvm lvchange --yes -K -ay $activate_args "$LV" 2>&1 | vinfo
+        if strstr "$LVSLIST" "$LV"; then
+            # This lvchange is expected to fail if all PVs used by
+            # the LV are not yet present.  Premature/failed lvchange
+            # could be avoided by reporting if an LV is complete
+            # from the lvs command above and skipping this lvchange
+            # if the LV is not lised as complete.
+            # shellcheck disable=SC2086
+            lvm lvchange --yes -K -ay $activate_args "$LV" 2>&1 | vinfo
+        fi
     done
 fi