Blob Blame History Raw
From 5c3842eb7646c5dcb12d4ab0bacece641b4daeef Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@redhat.com>
Date: Mon, 13 Feb 2012 21:16:31 +0100
Subject: [PATCH] 90mdraid: add "--offroot" support

---
 modules.d/90mdraid/65-md-incremental-imsm.rules |    2 +-
 modules.d/90mdraid/mdadm_auto.sh                |    6 +-
 modules.d/90mdraid/mdcontainer_start.sh         |    3 +-
 modules.d/90mdraid/mdraid-cleanup.sh            |   43 ++++++++-------
 modules.d/90mdraid/mdraid_start.sh              |   67 ++++++++++++++---------
 modules.d/90mdraid/parse-md.sh                  |    2 +
 6 files changed, 73 insertions(+), 50 deletions(-)
 rewrite modules.d/90mdraid/mdraid-cleanup.sh (72%)
 rewrite modules.d/90mdraid/mdraid_start.sh (81%)

diff --git a/modules.d/90mdraid/65-md-incremental-imsm.rules b/modules.d/90mdraid/65-md-incremental-imsm.rules
index 521a7e1..7a81930 100644
--- a/modules.d/90mdraid/65-md-incremental-imsm.rules
+++ b/modules.d/90mdraid/65-md-incremental-imsm.rules
@@ -37,7 +37,7 @@ LABEL="md_auto_end"
 #
 # Incrementally build the md array
 #
-RUN+="/sbin/mdadm -I $env{DEVNAME}"
+RUN+="/sbin/mdadm $env{rd_MD_OFFROOT} -I $env{DEVNAME}"
 
 RUN+="/bin/ln -s /sbin/md_finished.sh $hookdir/initqueue/finished/md_finished.sh"
 
diff --git a/modules.d/90mdraid/mdadm_auto.sh b/modules.d/90mdraid/mdadm_auto.sh
index 0bfcd94..afe7021 100755
--- a/modules.d/90mdraid/mdadm_auto.sh
+++ b/modules.d/90mdraid/mdadm_auto.sh
@@ -2,6 +2,6 @@
 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
 # ex: ts=8 sw=4 sts=4 et filetype=sh
 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
-
-info "Autoassembling MD Raid"    
-/sbin/mdadm -As --auto=yes --run 2>&1 | vinfo
+_offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot)
+info "Autoassembling MD Raid"
+/sbin/mdadm $_offroot -As --auto=yes --run 2>&1 | vinfo
diff --git a/modules.d/90mdraid/mdcontainer_start.sh b/modules.d/90mdraid/mdcontainer_start.sh
index f2c0152..8ba50ea 100755
--- a/modules.d/90mdraid/mdcontainer_start.sh
+++ b/modules.d/90mdraid/mdcontainer_start.sh
@@ -6,7 +6,8 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 md=$1
 udevadm control --stop-exec-queue
 # and activate any containers
-mdadm -IR $md 2>&1 | vinfo
+_offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot)
+mdadm $_offroot -IR $md 2>&1 | vinfo
 ln -s /sbin/mdraid-cleanup $hookdir/pre-pivot/30-mdraid-cleanup.sh 2>/dev/null
 ln -s /sbin/mdraid-cleanup $hookdir/pre-pivot/31-mdraid-cleanup.sh 2>/dev/null
 udevadm control --start-exec-queue
diff --git a/modules.d/90mdraid/mdraid-cleanup.sh b/modules.d/90mdraid/mdraid-cleanup.sh
dissimilarity index 72%
index ea9e179..da86d65 100755
--- a/modules.d/90mdraid/mdraid-cleanup.sh
+++ b/modules.d/90mdraid/mdraid-cleanup.sh
@@ -1,19 +1,24 @@
-#!/bin/sh
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-
-# stop everything which is not busy
-for i in /dev/md* /dev/md/*; do
-    [ -b $i ] || continue
-
-    mddetail=$(udevadm info --query=property --name=$i)
-    case "$mddetail" in 
-        *MD_LEVEL=container*) 
-        ;;
-        *DEVTYPE=partition*)
-        ;;
-        *)
-            mdadm --stop $i >/dev/null 2>&1
-            ;;
-    esac
-done
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+_offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot)
+containers=""
+for md in /dev/md[0-9_]*; do
+    [ -b "$md" ] || continue
+    udevinfo="$(udevadm info --query=env --name=$md)"
+    strstr "$udevinfo" "DEVTYPE=partition" && continue
+    if strstr "$udevinfo" "MD_LEVEL=container"; then
+        containers="$containers $md"
+        continue
+    fi
+    mdadm $_offroot -S "$md" >/dev/null 2>&1
+done
+
+for md in $containers; do
+    mdadm $_offroot -S "$md" >/dev/null 2>&1
+done
+
+unset containers udevinfo _offroot
diff --git a/modules.d/90mdraid/mdraid_start.sh b/modules.d/90mdraid/mdraid_start.sh
dissimilarity index 81%
index 1c9d7fe..0d1b3bf 100755
--- a/modules.d/90mdraid/mdraid_start.sh
+++ b/modules.d/90mdraid/mdraid_start.sh
@@ -1,26 +1,41 @@
-#!/bin/sh
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-
-type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
-# run mdadm if udev has settled
-info "Assembling MD RAID arrays"
-udevadm control --stop-exec-queue
-mdadm -As --auto=yes --run 2>&1 | vinfo
-mdadm -Is --run 2>&1 | vinfo
-
-# there could still be some leftover devices
-# which have had a container added
-for md in /dev/md[0-9]* /dev/md/*; do 
-    [ -b "$md" ] || continue
-    udevinfo="$(udevadm info --query=env --name=$md)"
-    strstr "$udevinfo" "MD_UUID=" && continue
-    strstr "$udevinfo" "MD_LEVEL=container" && continue
-    strstr "$udevinfo" "DEVTYPE=partition" && continue
-    mdadm --run "$md" 2>&1 | vinfo
-done
-unset udevinfo
-
-ln -s /sbin/mdraid-cleanup $hookdir/pre-pivot/30-mdraid-cleanup.sh 2>/dev/null
-ln -s /sbin/mdraid-cleanup $hookdir/pre-pivot/31-mdraid-cleanup.sh 2>/dev/null
-udevadm control --start-exec-queue
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+_md_force_run() {
+    local _offroot
+    _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot)
+    local _udevinfo
+    local _path_s
+    local _path_d
+    local _offroot
+    _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot)
+    # try to force-run anything not running yet
+    for md in /dev/md[0-9_]*; do
+        [ -b "$md" ] || continue
+        _udevinfo="$(udevadm info --query=env --name="$md")"
+        strstr "$_udevinfo" "MD_LEVEL=container" && continue
+        strstr "$_udevinfo" "DEVTYPE=partition" && continue
+
+        _path_s="/sys/$(udevadm info -q path -n "$md")/md/array_state"
+        [ ! -r "$_path_s" ] && continue
+
+        # inactive ?
+        [ "$(cat "$_path_s")" != "inactive" ] && continue
+
+        mdadm $_offroot -R "$md" 2>&1 | vinfo
+
+        # still inactive ?
+        [ "$(cat "$_path_s")" = "inactive" ] && continue
+
+        _path_d="${_path_s%/*}/degraded"
+        [ ! -r "$_path_d" ] && continue
+
+        # workaround for mdmon bug
+        [ "$(cat "$_path_d")" -gt "0" ] && mdmon $_offroot --takeover "$md"
+    done
+}
+
+_md_force_run
diff --git a/modules.d/90mdraid/parse-md.sh b/modules.d/90mdraid/parse-md.sh
index b879b07..ef6c30d 100755
--- a/modules.d/90mdraid/parse-md.sh
+++ b/modules.d/90mdraid/parse-md.sh
@@ -42,3 +42,5 @@ if ! getargbool 1 rd.md.imsm -n rd_NO_MDIMSM || getarg noiswmd || getarg nodmrai
     info "no MD RAID for imsm/isw raids"
     udevproperty rd_NO_MDIMSM=1
 fi
+
+strstr "$(mdadm --help-options 2>&1)" offroot && udevproperty rd_MD_OFFROOT=--offroot
-- 
1.7.9.3