summaryrefslogtreecommitdiffstats
path: root/debian/initramfs/scripts/local-block/mdadm
diff options
context:
space:
mode:
Diffstat (limited to 'debian/initramfs/scripts/local-block/mdadm')
-rwxr-xr-xdebian/initramfs/scripts/local-block/mdadm61
1 files changed, 61 insertions, 0 deletions
diff --git a/debian/initramfs/scripts/local-block/mdadm b/debian/initramfs/scripts/local-block/mdadm
new file mode 100755
index 0000000..214f24c
--- /dev/null
+++ b/debian/initramfs/scripts/local-block/mdadm
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+PREREQ="multipath"
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+. /scripts/functions
+
+# Poor man's mdadm-last-resort@.timer
+# That kicks in 2/3rds into the ROOTDELAY
+
+if [ ! -f /run/count.mdadm.initrd ]
+then
+ COUNT=0
+
+ # Unfortunately raid personalities can be registered _after_ block
+ # devices have already been added, and their rules processed, try
+ # triggering again. See #830770
+ udevadm trigger --action=add -s block || true
+ wait_for_udev 10
+else
+ COUNT=$(cat /run/count.mdadm.initrd)
+fi
+COUNT=$((COUNT + 1))
+
+echo $COUNT > /run/count.mdadm.initrd
+
+# Run pure assemble command, even though we default to incremental
+# assembly it is supported for users to export variables via
+# param.conf such as IMSM_NO_PLATFORM. See #830300
+mdadm -q --assemble --scan --no-degraded || true
+
+MAX=30
+if [ ${ROOTDELAY:-0} -gt $MAX ]; then
+ MAX=$ROOTDELAY
+fi
+MAX=$((MAX*2/3))
+
+if [ "$COUNT" = "$MAX" ]
+then
+ # Poor man's mdadm-last-resort@.service for incremental devices
+ mdadm -q --run /dev/md?*
+
+ # And last try for all others
+ mdadm -q --assemble --scan --run
+
+ rm -f /run/count.mdadm.initrd
+fi
+
+exit 0