a56a5e
From 4584826e9a25fdddb876f07875423196d9fc8840 Mon Sep 17 00:00:00 2001
90b079
From: Harald Hoyer <harald@redhat.com>
90b079
Date: Mon, 7 Oct 2013 15:06:22 +0200
90b079
Subject: [PATCH] rootfs-block: add support for the rootfallback= kernel
90b079
 cmdline option
90b079
90b079
---
49e6a8
 dracut.cmdline.7.asc                     |  6 ++++
49e6a8
 modules.d/95rootfs-block/module-setup.sh |  3 +-
49e6a8
 modules.d/95rootfs-block/rootfallback.sh | 46 ++++++++++++++++++++++++
90b079
 3 files changed, 54 insertions(+), 1 deletion(-)
90b079
 create mode 100755 modules.d/95rootfs-block/rootfallback.sh
90b079
90b079
diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc
1755ca
index 09c47e85..4b2ab035 100644
90b079
--- a/dracut.cmdline.7.asc
90b079
+++ b/dracut.cmdline.7.asc
90b079
@@ -69,6 +69,12 @@ rootfstype=ext3
90b079
     force mounting _/_ and _/usr_ (if it is a separate device) read-write.
90b079
     See also ro option.
90b079
 
90b079
+**rootfallback=**_<path to blockdevice>_::
90b079
+    specify the block device to use as the root filesystem, if the normal root cannot be found.
90b079
+    This can only be a simple block device with a simple file system, for which the filesystem
90b079
+    driver is either compiled in, or added manually to the initramfs.
90b079
+    This parameter can be specified multiple times.
90b079
+
90b079
 **rd.auto** **rd.auto=1**::
90b079
     enable autoassembly of special devices like cryptoLUKS, dmraid, mdraid or lvm.
90b079
     Default is off as of dracut version >= 024.
90b079
diff --git a/modules.d/95rootfs-block/module-setup.sh b/modules.d/95rootfs-block/module-setup.sh
1755ca
index f066a79c..7e714eb0 100755
90b079
--- a/modules.d/95rootfs-block/module-setup.sh
90b079
+++ b/modules.d/95rootfs-block/module-setup.sh
90b079
@@ -44,5 +44,6 @@ install() {
90b079
         inst_hook pre-udev 30 "$moddir/block-genrules.sh"
90b079
         inst_hook mount 99 "$moddir/mount-root.sh"
90b079
     fi
90b079
-}
90b079
 
90b079
+    inst_hook initqueue/timeout 99 "$moddir/rootfallback.sh"
90b079
+}
90b079
diff --git a/modules.d/95rootfs-block/rootfallback.sh b/modules.d/95rootfs-block/rootfallback.sh
90b079
new file mode 100755
1755ca
index 00000000..246ce9a4
90b079
--- /dev/null
90b079
+++ b/modules.d/95rootfs-block/rootfallback.sh
90b079
@@ -0,0 +1,46 @@
90b079
+#!/bin/sh
90b079
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
90b079
+# ex: ts=8 sw=4 sts=4 et filetype=sh
90b079
+
90b079
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
90b079
+
90b079
+for root in $(getargs rootfallback=); do
90b079
+    case "$root" in
90b079
+        block:LABEL=*|LABEL=*)
90b079
+            root="${root#block:}"
90b079
+            root="$(echo $root | sed 's,/,\\x2f,g')"
90b079
+            root="/dev/disk/by-label/${root#LABEL=}"
90b079
+            ;;
90b079
+        block:UUID=*|UUID=*)
90b079
+            root="${root#block:}"
90b079
+            root="${root#UUID=}"
90b079
+            root="$(echo $root | tr "[:upper:]" "[:lower:]")"
90b079
+            root="/dev/disk/by-uuid/${root#UUID=}"
90b079
+            ;;
90b079
+        block:PARTUUID=*|PARTUUID=*)
90b079
+            root="${root#block:}"
90b079
+            root="${root#PARTUUID=}"
90b079
+            root="$(echo $root | tr "[:upper:]" "[:lower:]")"
90b079
+            root="/dev/disk/by-partuuid/${root}"
90b079
+            ;;
90b079
+        block:PARTLABEL=*|PARTLABEL=*)
90b079
+            root="${root#block:}"
90b079
+            root="/dev/disk/by-partlabel/${root#PARTLABEL=}"
90b079
+            ;;
90b079
+    esac
90b079
+
90b079
+    if ! [ -b "$root" ]; then
90b079
+        warn "Could not find rootfallback $root"
90b079
+        continue
90b079
+    fi
90b079
+
90b079
+    if mount "$root" /sysroot; then
90b079
+        info "Mounted rootfallback $root"
90b079
+        exit 0
90b079
+    else
90b079
+        warn "Failed to mount rootfallback $root"
90b079
+        exit 1
90b079
+    fi
90b079
+done
90b079
+
90b079
+[ -e "$job" ] && rm -f "$job"