You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.2 KiB
94 lines
3.2 KiB
From 15384bcedb8002440e1327e97cd9c139af8a32dd Mon Sep 17 00:00:00 2001 |
|
From: Harald Hoyer <harald@redhat.com> |
|
Date: Mon, 15 Jan 2018 15:44:46 +0100 |
|
Subject: [PATCH] dracut-functions.sh:check_vol_slaves() speedup LV -> VG name |
|
|
|
Instead of trying all /dev/mapper/* devices to match the maj:min, and |
|
get the VG name with "lvm lvs", use the dm/name from /sys and dmsetup |
|
splitname. |
|
|
|
This should speedup execution with lots of LVs. |
|
|
|
Cherry-picked from: 9ed6eb741 |
|
Resolves: #1531503 |
|
--- |
|
dracut-functions.sh | 62 +++++++++++++++++++++++++---------------------------- |
|
1 file changed, 29 insertions(+), 33 deletions(-) |
|
|
|
diff --git a/dracut-functions.sh b/dracut-functions.sh |
|
index ca54bd7f..53289ca0 100755 |
|
--- a/dracut-functions.sh |
|
+++ b/dracut-functions.sh |
|
@@ -687,43 +687,39 @@ for_each_host_dev_and_slaves() |
|
# but you cannot create the logical volume without the volume group. |
|
# And the volume group might be bigger than the devices the LV needs. |
|
check_vol_slaves() { |
|
- local _lv _vg _pv |
|
- for i in /dev/mapper/*; do |
|
- [[ $i == /dev/mapper/control ]] && continue |
|
- _lv=$(get_maj_min $i) |
|
- if [[ $_lv = $2 ]]; then |
|
- _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null) |
|
- # strip space |
|
- _vg="${_vg//[[:space:]]/}" |
|
- if [[ $_vg ]]; then |
|
- for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null) |
|
- do |
|
- check_block_and_slaves $1 $(get_maj_min $_pv) && return 0 |
|
- done |
|
- fi |
|
- fi |
|
- done |
|
+ local _lv _vg _pv _dm _majmin |
|
+ _majmin="$2" |
|
+ _lv="/dev/block/$_majmin" |
|
+ _dm=/sys/dev/block/$_majmin/dm |
|
+ [[ -f $_dm/uuid && $(<$_dm/uuid) =~ LVM-* ]] || return 1 |
|
+ _vg=$(dmsetup splitname --noheadings -o vg_name $(<"$_dm/name") ) |
|
+ # strip space |
|
+ _vg="${_vg//[[:space:]]/}" |
|
+ if [[ $_vg ]]; then |
|
+ for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null) |
|
+ do |
|
+ check_block_and_slaves $1 $(get_maj_min $_pv) && return 0 |
|
+ done |
|
+ fi |
|
return 1 |
|
} |
|
|
|
check_vol_slaves_all() { |
|
- local _lv _vg _pv |
|
- for i in /dev/mapper/*; do |
|
- [[ $i == /dev/mapper/control ]] && continue |
|
- _lv=$(get_maj_min $i) |
|
- if [[ $_lv = $2 ]]; then |
|
- _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null) |
|
- # strip space |
|
- _vg="${_vg//[[:space:]]/}" |
|
- if [[ $_vg ]]; then |
|
- for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null) |
|
- do |
|
- check_block_and_slaves_all $1 $(get_maj_min $_pv) |
|
- done |
|
- return 0 |
|
- fi |
|
- fi |
|
- done |
|
+ local _lv _vg _pv _majmin |
|
+ _majmin="$2" |
|
+ _lv="/dev/block/$_majmin" |
|
+ _dm="/sys/dev/block/$_majmin/dm" |
|
+ [[ -f $_dm/uuid && $(<$_dm/uuid) =~ LVM-* ]] || return 1 |
|
+ _vg=$(dmsetup splitname --noheadings -o vg_name $(<"$_dm/name") ) |
|
+ # strip space |
|
+ _vg="${_vg//[[:space:]]/}" |
|
+ if [[ $_vg ]]; then |
|
+ for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null) |
|
+ do |
|
+ check_block_and_slaves_all $1 $(get_maj_min $_pv) |
|
+ done |
|
+ return 0 |
|
+ fi |
|
return 1 |
|
} |
|
|
|
|