PATCH: mkinitrd: Use dmraid instead of setting up dm tables ourselves (fixes dmraid10)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

Use dmraid instead of setting up dm tables ourselves, this fixes stacked
dmraid's like raid10. As an added bonus this means dmraid will also stop
breaking when the disk numbering changes. This patch uses the new
--rm_partitions dmraid option to tell the kernel to remove the partitions
from the used disks, stopping programs probing partitons causing IO-errors
like those reported in bug 475384

Note that this patch also removes part of the (broken) multipath code, which
was in the same code loop as the dyi dm table creation code for dmraid. This
is not a problem, as multipath has never worked in Fedora.
---
 mkinitrd |  117 +++++++++++--------------------------------------------------
 1 files changed, 21 insertions(+), 96 deletions(-)

diff --git a/mkinitrd b/mkinitrd
index 075d00c..d750d40 100755
--- a/mkinitrd
+++ b/mkinitrd
@@ -60,7 +60,7 @@ PROBE="yes"
 MODULES=""
 GRAPHICSMODS=""
 PREMODS=""
-DMDEVS=""
+DMRAIDS=""
 ncryptodevs=0
 ncryptoparts=0
 ncryptolvs=0
@@ -130,10 +130,6 @@ qpopd() {
     popd >/dev/null 2>&1
 }

-dm_get_uuid() {
-    echo nash-dm get_uuid "$1" | /sbin/nash --force --quiet
-}
-
 resolve_device_name() {
     echo nash-resolveDevice "$1" | /sbin/nash --forcequiet
 }
@@ -560,6 +556,7 @@ handledm() {
 EOF
     local name=$(dmsetup info --noheadings -c -j $major -m $minor -o name)
     local vg=$(lvshow "/dev/mapper/$name")
+ local raids=$(/sbin/dmraid -s -craidname 2>/dev/null | grep -vi "no raid disks")
     if [ -n "$vg" ]; then
         vg=`echo $vg` # strip whitespace
         case " $vg_list " in
@@ -569,6 +566,17 @@ EOF
             ;;
         esac
     fi
+    for raid in $raids ; do
+        if [ "$raid" == "$name" ]; then
+            case " $DMRAIDS " in
+                *" $raid "*) ;;
+                *)  DMRAIDS="$DMRAIDS $raid"
+                    [ -z "$nodmraid" ] && find_base_dm_mods
+                    ;;
+            esac
+            break
+        fi
+    done
 }

 handleiscsi() {
@@ -1115,72 +1123,6 @@ if [ -n "${loopfs}" ] || [[ "$rootopts" =~ "loop" ]]; then
         fi
 fi

-# If we use LVM or dm-based raid, include dm-mod
-# XXX: dm not really supported yet.
-testdm=""
-[ -z "$nodmraid" ] && testdm="yes"
-[ "x$PROBE" != "xyes" ] && testdm=""
-
-if [ -n "$testdm" \
-        -a -x /sbin/dmsetup \
-        -a -x /sbin/dmraid \
-        -a -e /dev/mapper/control ]; then
-    dmout=$(/sbin/dmsetup ls 2>/dev/null)
-    if [ "$dmout" != "No devices found" -a "$dmout" != "" ]; then
- RAIDS=$(/sbin/dmraid -s -craidname 2>/dev/null | grep -vi "no raid disks")
-
-        # I fucking hate shell.
-        lineno=1
-        PREV=""
-        LINE=""
-        while :; do
-            PREV="$LINE"
-            LINE=$(/sbin/dmsetup table | head -$lineno | tail -1)
-            if [ "$LINE" == "$PREV" ]; then
-                break;
-            fi
-
-            eval $(echo $LINE | \
-                while read NAME START END TYPE TABLE ; do
-                    echo NAME=\"$(sed 's/:$//'<<< "$NAME")\"
-                    echo START=\"$START\"
-                    echo END=\"$END\"
-                    echo TYPE=\"$TYPE\"
-                    echo TABLE=\"$TABLE\"
-                done)
-
-            case "$TYPE" in
-                multipath|emc)
-                    # ugggh.  We could try to fish the module name out, but it
-                    # requires real parsing...
-                    # XXX also covered by #132001
-                    for mod in $TABLE ; do
- DMMODS="$DMMODS $([[ "$mod" =~ "[[:alpha:]]" ]] && echo "$mod")"
-                    done
-                    DMDEVS="$DMDEVS $NAME"
-                    ;;
-                *)
-                    for raid in $RAIDS ; do
-                        if [ "$raid" == "$NAME" ]; then
-                            DMDEVS="$DMDEVS $NAME"
-                            RAIDS=$(sed 's/ $NAME //' <<< "$RAIDS")
-                            break
-                        fi
-                    done
-                    ;;
-            esac
-            lineno=$(($lineno + 1))
-        done
-
-        [ -n "$DMDEVS" ] && find_base_dm_mods
-
-        DMDEVS=$(tr ' ' '\n' <<< $DMDEVS | sort -u)
-        for mod in $(tr ' ' '\n' <<< $DMMODS | sort -u) ; do
-            findmodule -dm-$mod
-        done
-    fi
-fi
-
 for n in $basicmodules; do
     findmodule $n
 done
@@ -1210,32 +1152,15 @@ emit()
     echo $NONL "$@" >> $RCFILE
 }

-emitdm()
+emitdmraids()
 {
-    vecho "Adding dm map \"$1\""
-    UUID=$(dm_get_uuid "$1")
-    if [ -n "$UUID" ]; then
-        UUID="--uuid $UUID"
+    if [ -z "$nodmraid" -a -n "$DMRAIDS" ]; then
+        inst /sbin/dmraid "$MNTIMAGE" /sbin/dmraid
+        for raid in $DMRAIDS; do
+            vecho "Adding dmraid set: \"$raid\""
+            emit "/sbin/dmraid -a y --rm_partitions $raid"
+        done
     fi
-    emit dm create "$1" $UUID $(/sbin/dmsetup table "$1")
-}
-
-emitdms()
-{
-    [ -z "$DMDEVS" ] && return 0
-    echo dm list $DMDEVS | nash --force --quiet | while read ACTION NAME ; do
-        case $ACTION in
-        rmparts)
-            emit rmparts "$NAME"
-            ;;
-        create)
-            emitdm "$NAME"
-            ;;
-        part)
-            emit dm partadd "$NAME"
-            ;;
-        esac
-    done
 }

 if [ -z "$MNTIMAGE" -o -z "$IMAGE" ]; then
@@ -1639,7 +1564,7 @@ fi
 # things like RAID or LVM
 emit "mkblkdevs"

-emitdms
+emitdmraids

 emitcrypto()
 {
--
1.6.1.2

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux