# when making release, make sure you do it as RELEASE document describes
NAME := geninitrd
VERSION := $(shell test -d .git && git describe --tags || echo git)
-MODS := ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
+MODS := ide luks multipath dmraid lvm md blkid udev tuxonice suspend swsusp fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
FILES_MODS := $(MODS:%=mod-%.sh)
FILES_ADDON := extract-ikconfig
FILES_UDEV := 01-ignore.rules 59-persistent-storage.rules 61-persistent-storage.rules 11-dm.rules
warn "/proc filesystem not mounted, may cause wrong results or failure."
fi
-geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
+geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev swsusp tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
while [ $# -gt 0 ]; do
case $1 in
--without-fbcondecor)
FB_CON_DECOR=no
;;
+ --without-swsusp)
+ USE_SWSUSP=no
+ ;;
--with-suspend)
USE_SUSPEND=yes
;;
find_modules_suspend
fi
+if is_yes "$USE_SWSUSP"; then
+ find_modules_swsusp
+fi
+
find_root "$fstab" || exit
verbose "Using $rootdev as device for rootfs"
# resume after killing local processes
initrd_gen_tuxonice
initrd_gen_suspend
+initrd_gen_swsusp
# clean up env
add_linuxrc <<-'EOF'
--- /dev/null
+#!/bin/sh
+# geninitrd mod: swsusp
+#
+USE_SWSUSP=${USE_SWSUSP:-yes}
+
+# resume device
+swap_dev=""
+
+# setup geninitrd module
+# @access public
+setup_mod_swsusp() {
+ if ! is_yes "$USE_SWSUSP"; then
+ return
+ fi
+
+ swap_dev="$(awk '/^\/dev\// { print $1 }' /proc/swaps | head -1)"
+ if [ -z "$swap_dev" ]; then
+ warn "Cannot determine swap device. You may try add specific device to kernel command line"
+ else
+ verbose "swsusp: will try to resume from swap device $swap_dev"
+ fi
+}
+
+# find modules for for swsusp
+# @access public
+find_modules_swsusp() {
+ swap_dev="$(awk '/^\/dev\// { print $1 }' /proc/swaps | head -1)"
+
+ # save state
+ local vgvolumes=$LVM_VGVOLUMES
+ find_modules_for_devpath $swap_dev
+
+ # check for saved state, differenciate between rootfs VG
+ if [ "$LVM_VGVOLUMES" != "$vgvolumes" ]; then
+ # add swap device to LVM_SUSPENDVG
+ LVM_SUSPENDVG="$LVM_SUSPENDVG $LVM_VGVOLUMES"
+ LVM_VGVOLUMES=$vgvolumes
+ verbose "swap device is on LVM"
+ fi
+}
+
+# generate initrd fragment
+# @access public
+initrd_gen_swsusp() {
+ if ! is_yes "$USE_SWSUSP"; then
+ return
+ fi
+
+ verbose "Setting up swsusp..."
+
+ mkdir -p $DESTDIR${swap_dev%/*}
+ inst $swap_dev $swap_dev
+
+ mount_dev
+ mount_sys
+ echo "swap_dev=$swap_dev" | add_linuxrc
+
+ add_linuxrc <<-'EOF'
+ resume=no
+ for arg in $CMDLINE; do
+ if [ "${arg##resume=/dev/}" != "${arg}" ]; then
+ swap_dev=${arg##resume=}
+ resume=yes
+ elif [ "${arg##resume=}" != "${arg}" ]; then
+ resume=${arg##resume=}
+ fi
+ done
+
+ if [ "$resume" = "yes" ] && [ -n "$swap_dev" ]; then
+ echo "Resuming from $swap_dev..."
+ echo "$swap_dev" > /sys/power/resume
+ fi
+ EOF
+}