Harald Hoyer d9da66
From 9ed6eb741f0bc0178167e7063751eb2bb4ac6de5 Mon Sep 17 00:00:00 2001
Harald Hoyer d9da66
From: Harald Hoyer <harald@redhat.com>
Harald Hoyer d9da66
Date: Mon, 15 Jan 2018 15:44:46 +0100
Harald Hoyer d9da66
Subject: [PATCH] dracut-functions.sh:check_vol_slaves() speedup LV -> VG name
Harald Hoyer d9da66
Harald Hoyer d9da66
Instead of trying all /dev/mapper/* devices to match the maj:min, and
Harald Hoyer d9da66
get the VG name with "lvm lvs", use the dm/name from /sys and dmsetup
Harald Hoyer d9da66
splitname.
Harald Hoyer d9da66
Harald Hoyer d9da66
This should speedup execution with lots of LVs.
Harald Hoyer d9da66
---
Harald Hoyer d9da66
 dracut-functions.sh | 64 ++++++++++++++++++++++++-----------------------------
Harald Hoyer d9da66
 1 file changed, 29 insertions(+), 35 deletions(-)
Harald Hoyer d9da66
Harald Hoyer d9da66
diff --git a/dracut-functions.sh b/dracut-functions.sh
Harald Hoyer d9da66
index e99c4533..badd2a22 100755
Harald Hoyer d9da66
--- a/dracut-functions.sh
Harald Hoyer d9da66
+++ b/dracut-functions.sh
Harald Hoyer d9da66
@@ -560,45 +560,39 @@ for_each_host_dev_and_slaves()
Harald Hoyer d9da66
 # but you cannot create the logical volume without the volume group.
Harald Hoyer d9da66
 # And the volume group might be bigger than the devices the LV needs.
Harald Hoyer d9da66
 check_vol_slaves() {
Harald Hoyer d9da66
-    local _lv _vg _pv _dm
Harald Hoyer d9da66
-    for i in /dev/mapper/*; do
Harald Hoyer d9da66
-        [[ $i == /dev/mapper/control ]] && continue
Harald Hoyer d9da66
-        _lv=$(get_maj_min $i)
Harald Hoyer d9da66
-        _dm=/sys/dev/block/$_lv/dm
Harald Hoyer d9da66
-        [[ -f $_dm/uuid  && $(<$_dm/uuid) =~ LVM-* ]] || continue
Harald Hoyer d9da66
-        if [[ $_lv = $2 ]]; then
Harald Hoyer d9da66
-            _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null)
Harald Hoyer d9da66
-            # strip space
Harald Hoyer d9da66
-            _vg="${_vg//[[:space:]]/}"
Harald Hoyer d9da66
-            if [[ $_vg ]]; then
Harald Hoyer d9da66
-                for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
Harald Hoyer d9da66
-                do
Harald Hoyer d9da66
-                    check_block_and_slaves $1 $(get_maj_min $_pv) && return 0
Harald Hoyer d9da66
-                done
Harald Hoyer d9da66
-            fi
Harald Hoyer d9da66
-        fi
Harald Hoyer d9da66
-    done
Harald Hoyer d9da66
+    local _lv _vg _pv _dm _majmin
Harald Hoyer d9da66
+    _majmin="$2"
Harald Hoyer d9da66
+    _lv="/dev/block/$_majmin"
Harald Hoyer d9da66
+    _dm=/sys/dev/block/$_majmin/dm
Harald Hoyer d9da66
+    [[ -f $_dm/uuid  && $(<$_dm/uuid) =~ LVM-* ]] || return 1
Harald Hoyer d9da66
+    _vg=$(dmsetup splitname --noheadings -o vg_name $(<"$_dm/name") )
Harald Hoyer d9da66
+    # strip space
Harald Hoyer d9da66
+    _vg="${_vg//[[:space:]]/}"
Harald Hoyer d9da66
+    if [[ $_vg ]]; then
Harald Hoyer d9da66
+        for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
Harald Hoyer d9da66
+        do
Harald Hoyer d9da66
+            check_block_and_slaves $1 $(get_maj_min $_pv) && return 0
Harald Hoyer d9da66
+        done
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
     return 1
Harald Hoyer d9da66
 }
Harald Hoyer d9da66
 
Harald Hoyer d9da66
 check_vol_slaves_all() {
Harald Hoyer d9da66
-    local _lv _vg _pv
Harald Hoyer d9da66
-    for i in /dev/mapper/*; do
Harald Hoyer d9da66
-        [[ $i == /dev/mapper/control ]] && continue
Harald Hoyer d9da66
-        _lv=$(get_maj_min $i)
Harald Hoyer d9da66
-        if [[ $_lv = $2 ]]; then
Harald Hoyer d9da66
-            _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null)
Harald Hoyer d9da66
-            # strip space
Harald Hoyer d9da66
-            _vg="${_vg//[[:space:]]/}"
Harald Hoyer d9da66
-            if [[ $_vg ]]; then
Harald Hoyer d9da66
-                for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
Harald Hoyer d9da66
-                do
Harald Hoyer d9da66
-                    check_block_and_slaves_all $1 $(get_maj_min $_pv)
Harald Hoyer d9da66
-                done
Harald Hoyer d9da66
-                return 0
Harald Hoyer d9da66
-            fi
Harald Hoyer d9da66
-        fi
Harald Hoyer d9da66
-    done
Harald Hoyer d9da66
+    local _lv _vg _pv _majmin
Harald Hoyer d9da66
+    _majmin="$2"
Harald Hoyer d9da66
+    _lv="/dev/block/$_majmin"
Harald Hoyer d9da66
+    _dm="/sys/dev/block/$_majmin/dm"
Harald Hoyer d9da66
+    [[ -f $_dm/uuid  && $(<$_dm/uuid) =~ LVM-* ]] || return 1
Harald Hoyer d9da66
+    _vg=$(dmsetup splitname --noheadings -o vg_name $(<"$_dm/name") )
Harald Hoyer d9da66
+    # strip space
Harald Hoyer d9da66
+    _vg="${_vg//[[:space:]]/}"
Harald Hoyer d9da66
+    if [[ $_vg ]]; then
Harald Hoyer d9da66
+        for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
Harald Hoyer d9da66
+        do
Harald Hoyer d9da66
+            check_block_and_slaves_all $1 $(get_maj_min $_pv)
Harald Hoyer d9da66
+        done
Harald Hoyer d9da66
+        return 0
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
     return 1
Harald Hoyer d9da66
 }
Harald Hoyer d9da66
 
Harald Hoyer d9da66