diff options
Diffstat (limited to '0016-Let-user-specify-the-action-after-fail.patch')
-rw-r--r-- | 0016-Let-user-specify-the-action-after-fail.patch | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/0016-Let-user-specify-the-action-after-fail.patch b/0016-Let-user-specify-the-action-after-fail.patch new file mode 100644 index 0000000..0d367b6 --- /dev/null +++ b/0016-Let-user-specify-the-action-after-fail.patch @@ -0,0 +1,222 @@ +From 9d787df19674937e8c07bd295b5d282a63829209 Mon Sep 17 00:00:00 2001 +From: Baoquan He <bhe@redhat.com> +Date: Fri, 29 Mar 2013 18:36:16 +0800 +Subject: [PATCH] Let user specify the action after fail + +Currently the default action is emergency_shell when failure happened +during system boot. In kdump, this default may not be expected. E.g, +if dump target is not rootfs, it does not matter if mount root failed. +Adding an action which allow dracut always go ahead though failure +happens is needed by kdump. + +So here add a function action_on_fail() and cmdline parameter +action_on_fail=<shell | continue>. Use action_to_fail() to replace +emergency_shell which was called after failure. By $(getarg action_on_fail=), +decide to drop into shell, or to leave away the failure and go ahead. + +v3->v4: +add handling of selinux policy loaded failure, and change code format to +be consitent + +Signed-off-by: Baoquan He <bhe@redhat.com> + +[Edited by harald@redhat.com] +--- + dracut.cmdline.7.asc | 4 ++++ + modules.d/95rootfs-block/mount-root.sh | 2 +- + modules.d/98selinux/selinux-loadpolicy.sh | 6 ++---- + modules.d/98systemd/dracut-initqueue.sh | 2 +- + modules.d/98systemd/dracut-mount.sh | 2 +- + modules.d/98usrmount/mount-usr.sh | 4 ++-- + modules.d/99base/dracut-lib.sh | 22 ++++++++++++++++++++++ + modules.d/99base/init.sh | 12 ++++++------ + 8 files changed, 39 insertions(+), 15 deletions(-) + +diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc +index f1457d5..4626279 100644 +--- a/dracut.cmdline.7.asc ++++ b/dracut.cmdline.7.asc +@@ -121,6 +121,10 @@ Misc + specify the controlling terminal for the console. + This is useful, if you have multiple "console=" arguments. + ++**action_on_fail=**_{shell|continue}_:: ++ Specify the action after failure. By default it's emergency_shell. ++ 'continue' means: ignore the current failure and go ahead. ++ + [[dracutkerneldebug]] + Debug + ~~~~~ +diff --git a/modules.d/95rootfs-block/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh +index c7626c3..6ed35c1 100755 +--- a/modules.d/95rootfs-block/mount-root.sh ++++ b/modules.d/95rootfs-block/mount-root.sh +@@ -68,7 +68,7 @@ mount_root() { + warn "*** Warning -- the system did not shut down cleanly. " + warn "*** Dropping you to a shell; the system will continue" + warn "*** when you leave the shell." +- emergency_shell ++ action_on_fail + fi + fsckoptions="$AUTOFSCK_OPT $fsckoptions" + fi +diff --git a/modules.d/98selinux/selinux-loadpolicy.sh b/modules.d/98selinux/selinux-loadpolicy.sh +index d6e24d6..7526265 100755 +--- a/modules.d/98selinux/selinux-loadpolicy.sh ++++ b/modules.d/98selinux/selinux-loadpolicy.sh +@@ -52,16 +52,14 @@ rd_load_policy() + if [ $ret -eq 3 -o $permissive -eq 0 ]; then + warn "Machine in enforcing mode." + warn "Not continuing" +- emergency_shell -n selinux +- exit 1 ++ action_on_fail -n selinux || exit 1 + fi + return 0 + elif [ $permissive -eq 0 -a "$SELINUX" != "disabled" ]; then + warn "Machine in enforcing mode and cannot execute load_policy." + warn "To disable selinux, add selinux=0 to the kernel command line." + warn "Not continuing" +- emergency_shell -n selinux +- exit 1 ++ action_on_fail -n selinux || exit 1 + fi + } + +diff --git a/modules.d/98systemd/dracut-initqueue.sh b/modules.d/98systemd/dracut-initqueue.sh +index c6fab30..2c71bf4 100755 +--- a/modules.d/98systemd/dracut-initqueue.sh ++++ b/modules.d/98systemd/dracut-initqueue.sh +@@ -62,7 +62,7 @@ while :; do + fi + + main_loop=$(($main_loop+1)) +- [ $main_loop -gt $RDRETRY ] && emergency_shell "Could not boot." ++ [ $main_loop -gt $RDRETRY ] && action_on_fail "Could not boot." && break + done + + unset job +diff --git a/modules.d/98systemd/dracut-mount.sh b/modules.d/98systemd/dracut-mount.sh +index 5f3d9f0..ae01512 100755 +--- a/modules.d/98systemd/dracut-mount.sh ++++ b/modules.d/98systemd/dracut-mount.sh +@@ -31,7 +31,7 @@ while :; do + done + + i=$(($i+1)) +- [ $i -gt 20 ] && emergency_shell "Can't mount root filesystem" ++ [ $i -gt 20 ] && action_on_fail "Can't mount root filesystem" && break + done + + export -p > /dracut-state.sh +diff --git a/modules.d/98usrmount/mount-usr.sh b/modules.d/98usrmount/mount-usr.sh +index 5aaefbc..a4a66ae 100755 +--- a/modules.d/98usrmount/mount-usr.sh ++++ b/modules.d/98usrmount/mount-usr.sh +@@ -42,7 +42,7 @@ fsck_usr() + warn "*** Warning -- the system did not shut down cleanly. " + warn "*** Dropping you to a shell; the system will continue" + warn "*** when you leave the shell." +- emergency_shell ++ action_on_fail + fi + _fsckoptions="$AUTOFSCK_OPT $_fsckoptions" + fi +@@ -105,7 +105,7 @@ mount_usr() + warn "Mounting /usr to $NEWROOT/usr failed" + warn "*** Dropping you to a shell; the system will continue" + warn "*** when you leave the shell." +- emergency_shell ++ action_on_fail + fi + fi + } +diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh +index f2b16d3..1defb6f 100755 +--- a/modules.d/99base/dracut-lib.sh ++++ b/modules.d/99base/dracut-lib.sh +@@ -994,6 +994,28 @@ emergency_shell() + [ -e /run/initramfs/.die ] && exit 1 + } + ++action_on_fail() ++{ ++ local _action=$(getarg action_on_fail=) ++ case "$_action" in ++ continue) ++ [ "$1" = "-n" ] && shift 2 ++ [ "$1" = "--shutdown" ] && shift 2 ++ warn "$*" ++ warn "Not dropping to emergency shell, because 'action_on_fail=continue' was set on the kernel command line." ++ return 0 ++ ;; ++ shell) ++ emergency_shell $@ ++ return 1 ++ ;; ++ *) ++ emergency_shell $@ ++ return 1 ++ ;; ++ esac ++} ++ + # Retain the values of these variables but ensure that they are unexported + # This is a POSIX-compliant equivalent of bash's "export -n" + export_n() +diff --git a/modules.d/99base/init.sh b/modules.d/99base/init.sh +index 410201a..880a2c0 100755 +--- a/modules.d/99base/init.sh ++++ b/modules.d/99base/init.sh +@@ -79,7 +79,7 @@ if ! ismounted /run; then + rm -fr /newrun + fi + +-trap "emergency_shell Signal caught!" 0 ++trap "action_on_fail Signal caught!" 0 + + [ -d /run/initramfs ] || mkdir -p -m 0755 /run/initramfs + [ -d /run/log ] || mkdir -p -m 0755 /run/log +@@ -199,7 +199,7 @@ while :; do + + main_loop=$(($main_loop+1)) + [ $main_loop -gt $RDRETRY ] \ +- && { flock -s 9 ; emergency_shell "Could not boot."; } 9>/.console_lock ++ && { flock -s 9 ; action_on_fail "Could not boot." && break; } 9>/.console_lock + done + unset job + unset queuetriggered +@@ -234,7 +234,7 @@ while :; do + + i=$(($i+1)) + [ $i -gt 20 ] \ +- && { flock -s 9 ; emergency_shell "Can't mount root filesystem"; } 9>/.console_lock ++ && { flock -s 9 ; action_on_fail "Can't mount root filesystem" && break; } 9>/.console_lock + done + + { +@@ -268,7 +268,7 @@ done + [ "$INIT" ] || { + echo "Cannot find init!" + echo "Please check to make sure you passed a valid root filesystem!" +- emergency_shell ++ action_on_fail + } + + if [ $UDEVVERSION -lt 168 ]; then +@@ -370,13 +370,13 @@ if [ -f /etc/capsdrop ]; then + warn "Command:" + warn capsh --drop=$CAPS_INIT_DROP -- -c exec switch_root "$NEWROOT" "$INIT" $initargs + warn "failed." +- emergency_shell ++ action_on_fail + } + else + unset RD_DEBUG + exec $SWITCH_ROOT "$NEWROOT" "$INIT" $initargs || { + warn "Something went very badly wrong in the initramfs. Please " + warn "file a bug against dracut." +- emergency_shell ++ action_on_fail + } + fi |