Michael Tokarev: fixes for initramfs integration (#644389, #678262, #685161 )

Michael Tokarev mjt at alioth.debian.org
Thu Aug 23 17:54:24 UTC 2012


Module: mdadm
Branch: master
Commit: ea9f34c0b34f4c595010ba2ce61a3a6e423f2235
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=ea9f34c0b34f4c595010ba2ce61a3a6e423f2235

Author: Michael Tokarev <mjt at tls.msk.ru>
Date:   Tue Aug 21 11:27:46 2012 +0400

fixes for initramfs integration (#644389, #678262, #685161)

---

 debian/changelog                  |    5 +++
 debian/initramfs/hook             |   73 +++++++++----------------------------
 debian/initramfs/script.local-top |   31 ++++++++--------
 3 files changed, 38 insertions(+), 71 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index d0bb8f1..2053f8a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,11 @@ mdadm (3.2.5-2) UNRELEASED; urgency=low
    - change --help printing and shorten/simplify the text
    - make --quiet cumulative and stop documenting --real-quiet
    - do not prduce help in case of incorrect usage, and exit with 1
+  * fixes for initramfs integration (Closes: #644389, #678262, #685161):
+   - check INITRDSTART=none early
+   - do not explicitly load raid level modules (modprobe/kmod does this)
+   - do not collect needed raid levels (we include all modules anyway)
+   - load md_mod explicitly since we need to change global parameter
 
   [ Dmitrijs Ledkovs ]
   * Use dh_installinit with --no-restart-on-upgrade, which will start
diff --git a/debian/initramfs/hook b/debian/initramfs/hook
index 8181946..42fa9d4 100644
--- a/debian/initramfs/hook
+++ b/debian/initramfs/hook
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
-# Copyright © 2006-2008 Martin F. Krafft <madduck at debian.org>
+# Copyright © 2006-2008 Martin F. Krafft <madduck at debian.org>,
+#             2012 Michael Tokarev <mjt at tls.msk.ru>
 # based on the scripts in the initramfs-tools package.
 # released under the terms of the Artistic Licence.
 #
@@ -74,7 +75,7 @@ INITRDSTART=all
 [ -z "$INITRDSTART" ] && INITRDSTART=none
 
 DESTMDADMCONF=$DESTDIR/etc/mdadm/mdadm.conf
-DESTCONFIG=$DESTDIR/conf/conf.d/md
+DESTCONFIG=$DESTDIR/conf/mdadm
 
 if [ -f $CONFIG ]; then
   homehost="$(sed -ne 's,^[[:space:]]*HOMEHOST[[:space:]]*,,p' $CONFIG)"
@@ -163,8 +164,9 @@ elif ! grep -q '^ARRAY' $DESTMDADMCONF; then
   info "letting initramfs assemble auto-detected arrays."
   exit 0
 else
-  # obtain dev:level pairs from config file, honouring multiline entries
-  devpairs="$(
+  # obtain devices list from config file, honouring multiline entries
+  devices="$(
+    dev=
     while read line; do
       case "$line" in
         (ARRAY*) :;;
@@ -173,21 +175,12 @@ else
       for atom in $line; do
         case "$atom" in
           (/dev*) dev=$atom;;
-          (level=raid*|level=linear|level=multipath) level=${atom#level=};;
-          (level=*)
-            err "invalid level specified in ARRAY statement in $CONFIG:"
-            err "  $line"
-            err "levels should be either raid*, linear, or multipath."
-            warn "falling back to emergency procedure in initramfs."
-            exit 1
-            ;;
-          (*) :;;
         esac
       done
-      [ -n "${dev:-}" ] || continue
 
       # /dev/mdX and /dev/md/X are the same, really
       case "$dev" in
+        "") continue ;;
         (/dev/md/*) alt=/dev/md${dev##*/};;
         (/dev/md*) alt=/dev/md/${dev#/dev/md};;
         (*)
@@ -200,32 +193,20 @@ else
         dev="$alt"
       fi
 
-      echo -n "${dev}:"
-      if [ -n "${level:-}" ]; then
-        echo -n "$level"
-      else
-        echo -n "$($MDADM --detail $dev | sed -rne 's,[[:space:]]+Raid Level : ,,p')"
-      fi
-      echo -n ' '
+      echo "$dev"
     done < $DESTMDADMCONF)" || exit $?
 fi
 
-uniquify()
-{
-  for i in $@; do echo "$i"; done | sort -u
-}
+if [ "$INITRDSTART" != none ] && [ -n "$devices" ]; then
 
-if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then
-  echo "MD_DEVPAIRS='${devpairs% }'" >> $DESTCONFIG
-
-  devs= levels=
-  for i in $devpairs; do
-    dev=${i%:*}
-    level=${i##*:}
-    case "$INITRDSTART" in
-      all|*${dev}*)
-        devs="${devs:+$devs }$dev"
-        levels="${levels:+$levels }$level"
+  devs=
+  for dev in $devices; do
+    case "$INITRDSTART " in
+      all|*${dev}[[:space:]]*)
+        case "$devs " in	# uniquiness
+          (*${dev}\ *) :;;
+          (*) devs="${devs:+$devs }$dev" ;;
+        esac
         ;;
       *) :;;
     esac
@@ -244,7 +225,7 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then
   done
 
   for i in $INITRDSTART; do
-    case "$INITRDSTART" in all|none|'') break;; *) :;; esac
+    case "$INITRDSTART" in all) break;; *) :;; esac
     case "$devs" in
       *${i}*) continue;;
       *) :;;
@@ -257,29 +238,12 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then
     break
   done
 
-  echo "MD_LEVELS='$levels'" >> $DESTCONFIG
   if [ "$INITRDSTART" = all ]; then
     echo "MD_DEVS=all" >> $DESTCONFIG
   else
     echo "MD_DEVS='$devs'" >> $DESTCONFIG
   fi
 
-  # handle module synonyms
-  modules="$(echo $levels \
-    | sed -re 's,\<[[:digit:]]+\>,raid&,g;   # prefix digits with raid
-               s,stripe,raid0,g;             # striping is raid0
-               s,mirror,raid1,g;             # mirroring is raid1
-               s,raid4,raid5,g;              # use raid5 to handle raid4
-               s,mp,multipath,g              # mp is multipath
-               ')"
-
-  # if raid456 module is present, use it for raid[456]
-  modprobe --set-version="$version" --show-depends raid456 >/dev/null 2>&1 \
-    && modules="$(echo $modules | sed -e 's,raid[456],raid456,g')"
-
-  modules="$(uniquify $modules | tr '\n' ' ')"
-  echo "MD_MODULES='${modules% }'" >> $DESTCONFIG
-
   if [ "$INITRDSTART" = all ]; then
     info "will start all available MD arrays from the initial ramdisk."
   else
@@ -299,7 +263,6 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then
 
 else
   echo "MD_DEVS=none" >> $DESTCONFIG
-  echo "MD_MODULES=''" >> $DESTCONFIG
   info "no MD arrays will be started from the initial ramdisk."
 fi
 
diff --git a/debian/initramfs/script.local-top b/debian/initramfs/script.local-top
index 7ef6d4f..53341e8 100644
--- a/debian/initramfs/script.local-top
+++ b/debian/initramfs/script.local-top
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
-# Copyright © 2006-2008 Martin F. Krafft <madduck at debian.org>
+# Copyright © 2006-2008 Martin F. Krafft <madduck at debian.org>,
+#             2012 Michael Tokarev <mjt at tls.msk.ru>
 # based on the scripts in the initramfs-tools package.
 # released under the terms of the Artistic Licence.
 #
@@ -32,24 +33,25 @@ verbose()
 }
 
 MD_DEVS=all
-MD_MODULES='linear multipath raid0 raid1 raid456 raid5 raid6 raid10'
-[ -s /conf/conf.d/md ] && . /conf/conf.d/md
+[ -s /conf/md ] && . /conf/md
 
-verbose && log_begin_msg Loading MD modules
-for module in ${MD_MODULES:-}; do
-  if modprobe -q "$module"; then
-    verbose && log_success_msg "loaded module ${module}."
-  else
-    log_failure_msg "failed to load module ${module}."
-  fi
-done
-log_end_msg
+if [ "$MD_DEVS" = none ]; then
+  verbose &&
+    log_warning_msg "INITRDSTART set to \"none\" in /etc/default/mdadm, not assembling raid arrays"
+  exit 0
+fi
 
+if [ ! -f /proc/mdstat ] && ! modprobe -q md_mod; then
+  verbose && log_failure_msg "failed to load module md_mod."
+fi
 if [ ! -f /proc/mdstat ]; then
   verbose && panic "cannot initialise MD subsystem (/proc/mdstat missing)"
   exit 1
 fi
 
+# prevent writes/syncs so that resuming works (#415441).
+echo 1 > /sys/module/md_mod/parameters/start_ro
+
 # handle /dev/md/X nodes
 mkdir -p /dev/md
 
@@ -69,9 +71,6 @@ if [ ! -e $CONFIG ]; then
   MD_DEVS=all
 fi
 
-# prevent writes/syncs so that resuming works (#415441).
-echo 1 > /sys/module/md_mod/parameters/start_ro
-
 if [ "$MD_DEVS" = all ]; then
 
   verbose && log_begin_msg "Assembling all MD arrays"
@@ -84,7 +83,7 @@ if [ "$MD_DEVS" = all ]; then
   fi
   verbose && log_end_msg
 
-elif [ "$MD_DEVS" != none ]; then
+else
   for dev in $MD_DEVS; do
 
     verbose && log_begin_msg "Assembling MD array $dev"




More information about the pkg-mdadm-commits mailing list