File pm-utils-1.3.0-suse-grub.patch of Package pm-utils.import5908
Index: pm-utils-1.3.0/pm/sleep.d/01grub
===================================================================
--- pm-utils-1.3.0.orig/pm/sleep.d/01grub 2010-03-30 13:01:02.069674802 +0200
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,34 +0,0 @@
-#!/bin/sh
-# Ensure grub will load the correct kernel on resume from hibernate,
-# TODO: This is rather redhat specific, and very grub specific.
-
-default_resume_kernel()
-{
- [ "$1" = "suspend" ] && return $NA
- case $(uname -m) in
- i?86|x86_64|athlon)
- ;;
- *) # this is only valid for x86 and x86_64
- return $NA
- ;;
- esac
-
- [ -x /sbin/grubby -a -x /sbin/grub ] || return $NA
- [ -e "/boot/vmlinuz-$(uname -r)" ] || return 1
- out=$(/sbin/grubby --info /boot/vmlinuz-$(uname -r) |grep index)
- [ -n "${out}" ] || return 1
- current=${out#index=}
- echo "savedefault --default=${current} --once" | \
- /sbin/grub --device-map=/boot/grub/device.map \
- --batch --no-floppy --no-curses >/dev/null
-
- return 0
-}
-
-case "$1" in
- hibernate|suspend)
- default_resume_kernel $2
- ;;
- *) exit $NA
- ;;
-esac
Index: pm-utils-1.3.0/pm/sleep.d/99Zgrub
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ pm-utils-1.3.0/pm/sleep.d/99Zgrub 2010-03-30 13:01:16.839798542 +0200
@@ -0,0 +1,193 @@
+#!/bin/bash
+#
+# Stefan Seyfried, SUSE Linux Products GmbH 2006, GPL v2
+# mostly taken from the powersave project.
+
+GRUBONCE="/usr/sbin/grubonce"
+GRUBDEFAULT="/boot/grub/default"
+GRUBDEFSAVE="/var/run/suspend.grubonce.default"
+
+#####################################################################
+# gets a list of available kernels from /boot/grub/menu.lst
+# kernels are in the array $KERNELS, output to stdout to be eval-ed.
+getkernels()
+{
+ # DEBUG "Running getkernels()" INFO
+ local MENU_LST="/boot/grub/menu.lst"
+ local I DUMMY MNT ROOTDEV
+ declare -i I=0 J=-1
+
+ # we need the root partition later to decide if this is the kernel to select
+ while read ROOTDEV MNT DUMMY; do
+ [ "$ROOTDEV" = "rootfs" ] && continue # not what we are searching for
+ if [ "$MNT" = "/" ]; then
+ break
+ fi
+ done < /proc/mounts
+
+ # build an array KERNELS with all the kernels in /boot/grub/menu.lst
+ # the array MENU_ENTRIES contains the corresponding menu entry numbers
+ # DEFAULT_BOOT contains the default entry.
+ while read LINE; do
+ case $LINE in
+ title*)
+ let J++ # increase for every menu entry, even for non-linux
+ # DEBUG "Found grub menu entry #${J}: '${LINE}'" INFO
+ ;;
+ default*)
+ DUMMY=($LINE) # "default 0 #maybe a comment"
+ echo "DEFAULT_BOOT=${DUMMY[1]}" # ^^[0]^^ 1 ^^[2]^ 3 ^^[4]^^
+ # DEBUG "Default boot entry is '${DUMMY[1]}'" INFO
+ ;;
+ kernel*noresume*)
+ # we probably found the "failsafe" kernel that won't resume...
+ echo " Skipping grub entry #${J}, because it has the noresume option" >&2
+ ;;
+ kernel*root=*)
+ local ROOT
+ ROOT=${LINE#*root=}
+ DUMMY=($ROOT)
+ ROOT=${DUMMY[0]}
+ if [ "$(stat -Lc '%t:%T' $ROOT)" != "$(stat -Lc '%t:%T' $ROOTDEV)" ]; then
+ echo " Skipping grub entry #${J}, because its root= parameter ($ROOT)" >&2
+ echo " does not match the current root device ($ROOTDEV)." >&2
+ continue
+ fi
+ DUMMY=($LINE) # kernel (hd0,1)/boot/vmlinuz-ABC root=/dev/hda2
+ echo "KERNELS[$I]='${DUMMY[1]##*/}'" # vmlinuz-ABC
+ echo "MENU_ENTRIES[$I]=$J"
+ # DEBUG "Found kernel entry #${I}: '${DUMMY[1]##*/}'" INFO
+ let I++
+ ;;
+ kernel*)
+ # a kernel without "root="? We better skip that one...
+ echo " Skipping grub entry #${J}, because it has no root= option" >&2
+ ;;
+ *) ;;
+ esac
+ done < $MENU_LST
+}
+
+#############################################################
+# runs grubonce from the grub package to select which kernel
+# to boot on next startup
+grub-once()
+{
+ if [ -x "$GRUBONCE" ]; then
+ rm -f "$GRUBDEFSAVE"
+ if [ -e "$GRUBDEFAULT" ]; then
+ echo " saving original $GRUBDEFAULT"
+ cp "$GRUBDEFAULT" "$GRUBDEFSAVE"
+ fi
+ echo " running '$GRUBONCE $1'"
+ $GRUBONCE $1
+ else
+ echo "WARNING: $GRUBONCE not found, not preparing bootloader"
+ fi
+}
+
+#############################################################
+# restore grub default after (eventually failed) resume
+grub-once-restore()
+{
+ echo "INFO: running grub-once-restore"
+ rm -f "$GRUBDEFAULT"
+ if [ -e "$GRUBDEFSAVE" ]; then
+ echo " restoring original $GRUBDEFAULT"
+ mv "$GRUBDEFSAVE" "$GRUBDEFAULT"
+ fi
+}
+
+#############################################################################
+# try to find a kernel image that matches the actually running kernel.
+# We need this, if more than one kernel is installed. This works reasonably
+# well with grub, if all kernels are named "vmlinuz-`uname -r`" and are
+# located in /boot. If they are not, good luck ;-)
+find-kernel-entry()
+{
+ NEXT_BOOT=-1
+ ARCH=`uname -m`
+ declare -i I=0
+ # DEBUG "running kernel: $RUNNING" DIAG
+ while [ -n "${KERNELS[$I]}" ]; do
+ BOOTING="${KERNELS[$I]}"
+ if IMAGE=`readlink /boot/$BOOTING` && [ -e "/boot/${IMAGE##*/}" ]; then
+ # DEBUG "Found kernel symlink $BOOTING => $IMAGE" INFO
+ BOOTING=$IMAGE
+ fi
+ case $ARCH in
+ ppc*) BOOTING="${BOOTING#*vmlinux-}" ;;
+ *) BOOTING="${BOOTING#*vmlinuz-}" ;;
+ esac
+ if [ "$RUNNING" == "$BOOTING" ]; then
+ NEXT_BOOT=${MENU_ENTRIES[$I]}
+ echo " running kernel is grub menu entry $NEXT_BOOT (${KERNELS[$I]})"
+ break
+ fi
+ let I++
+ done
+ # if we have not found a kernel, issue a warning.
+ # if we have found a kernel, we'll do "grub-once" later, after
+ # prepare_suspend finished.
+ if [ $NEXT_BOOT -eq -1 ]; then
+ echo "WARNING: no kernelfile matching the running kernel found"
+ fi
+}
+
+#############################################################################
+# if we did not find a kernel (or BOOT_LOADER is not GRUB) check,
+# if the running kernel is still the one that will (probably) be booted for
+# resume (default entry in menu.lst or, if there is none, the kernel file
+# /boot/vmlinuz points to.)
+# This will only work, if you use "original" SUSE kernels.
+# you can always override with the config variable set to "yes"
+prepare-grub()
+{
+ echo "INFO: running prepare-grub"
+ eval `getkernels`
+ RUNNING=`uname -r`
+ find-kernel-entry
+
+ RET=0
+
+ if [ $NEXT_BOOT -eq -1 ]; then
+ # which kernel is booted with the default entry?
+ BOOTING="${KERNELS[$DEFAULT_BOOT]}"
+ # if there is no default entry (no menu.lst?) we fall back to
+ # the default of /boot/vmlinuz.
+ [ -z "$BOOTING" ] && BOOTING="vmlinuz"
+ if IMAGE=`readlink /boot/$BOOTING` && [ -e "/boot/${IMAGE##*/}" ]; then
+ BOOTING=$IMAGE
+ fi
+ BOOTING="${BOOTING#*vmlinuz-}"
+ echo "running kernel: '$RUNNING', probably booting kernel: '$BOOTING'"
+ if [ "$BOOTING" != "$RUNNING" ]; then
+ echo "ERROR: kernel version mismatch, cannot suspend to disk"
+ echo "running: $RUNNING booting: $BOOTING" >> $INHIBIT
+ RET=1
+ fi
+ else
+ # set the bootloader to the running kernel
+ echo " preparing boot-loader: selecting entry $NEXT_BOOT, kernel /boot/$BOOTING"
+ T1=`date +"%s%N"`
+ sync; sync; sync # this is needed to speed up grub-once on reiserfs
+ T2=`date +"%s%N"`
+ echo " grub-once: `grub-once $NEXT_BOOT`"
+ T3=`date +"%s%N"`
+ S=$(((T2-T1)/100000000)); S="$((S/10)).${S:0-1}"
+ G=$(((T3-T2)/100000000)); G="$((G/10)).${G:0-1}"
+ echo " time needed for sync: $S seconds, time needed for grub: $G seconds."
+ fi
+
+ return $RET
+}
+
+
+###### main()
+
+if [ "$1" = hibernate ] || [ "$1" = suspend -a "$2" = suspend_hybrid ]; then
+ prepare-grub
+fi
+if [ "$1" = thaw ] || [ "$1" = resume -a "$2" = suspend_hybrid ]; then
+ grub-once-restore
+fi
Index: pm-utils-1.3.0/pm/sleep.d/Makefile.am
===================================================================
--- pm-utils-1.3.0.orig/pm/sleep.d/Makefile.am 2010-03-30 13:01:02.069674802 +0200
+++ pm-utils-1.3.0/pm/sleep.d/Makefile.am 2010-03-30 13:01:16.839798542 +0200
@@ -3,7 +3,7 @@
sleep_SCRIPTS = \
00logging \
00powersave \
- 01grub \
+ 99Zgrub \
49bluetooth \
55NetworkManager \
75modules \
Index: pm-utils-1.3.0/pm/sleep.d/Makefile.in
===================================================================
--- pm-utils-1.3.0.orig/pm/sleep.d/Makefile.in 2010-03-30 13:01:02.069674802 +0200
+++ pm-utils-1.3.0/pm/sleep.d/Makefile.in 2010-03-30 13:01:16.904797911 +0200
@@ -161,7 +161,7 @@
sleep_SCRIPTS = \
00logging \
00powersave \
- 01grub \
+ 99Zgrub \
49bluetooth \
55NetworkManager \
75modules \