aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <williamh@gentoo.org>2012-02-12 12:37:46 -0600
committerWilliam Hubbs <williamh@gentoo.org>2012-02-13 08:35:29 -0600
commit79d6f109262ac936218332730b231a5b5897d612 (patch)
treebd935b7acdc580866e38b402167826ec8c59029f
parent5396bf185157a8a825c19215fb741f93444487ff (diff)
Improve swap handling
Modify the swap script so it starts before and stops after localmount. Also, on linux, this script should skip mounting swap on loopback. Add a swapfiles script which runs after localmount and is designed to activate additional swap space which could not be activated before localmount was run. This includes loopback swap on linux and swapfiles which are on local file systems that were not mounted when swap was activated initially. The start code does reactivate swap that is already active, but this is not an error condition. Reported-by: Giampaolo Tomassoni <giampaolo@tomassoni.biz> X-Gentoo-Bug: 401003 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=401003
-rw-r--r--init.d/Makefile4
-rw-r--r--init.d/swap.in11
-rw-r--r--init.d/swapfiles.in45
-rw-r--r--runlevels/Makefile2
4 files changed, 58 insertions, 4 deletions
diff --git a/init.d/Makefile b/init.d/Makefile
index 8351f3c5..863864f2 100644
--- a/init.d/Makefile
+++ b/init.d/Makefile
@@ -1,7 +1,7 @@
DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
- network.in root.in savecache.in staticroute.in swap.in swclock.in \
- sysctl.in urandom.in ${SRCS-${OS}}
+ network.in root.in savecache.in staticroute.in swap.in swapfiles.in \
+ swclock.in sysctl.in urandom.in ${SRCS-${OS}}
BIN= ${OBJS}
INSTALLAFTER= _installafter_net.lo
diff --git a/init.d/swap.in b/init.d/swap.in
index bd20ffec..bdc5dc71 100644
--- a/init.d/swap.in
+++ b/init.d/swap.in
@@ -4,7 +4,7 @@
depend()
{
- need localmount
+ before localmount
keyword -jail -openvz -prefix -vserver -lxc
}
@@ -12,6 +12,15 @@ start()
{
ebegin "Activating swap devices"
case "$RC_UNAME" in
+ Linux)
+ local dev
+ for dev in $(fstabinfo -b -t swap); do
+ case "$dev" in
+ /dev/loop*) ;;
+ *) swapon $dev 2>/dev/null;;
+ esac
+ done
+ ;;
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
*) swapon -a >/dev/null;;
esac
diff --git a/init.d/swapfiles.in b/init.d/swapfiles.in
new file mode 100644
index 00000000..f46f3c86
--- /dev/null
+++ b/init.d/swapfiles.in
@@ -0,0 +1,45 @@
+#!@PREFIX@/sbin/runscript
+# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
+# Released under the 2-clause BSD license.
+
+depend()
+{
+ need localmount
+ keyword -jail -openvz -prefix -vserver -lxc
+}
+
+start()
+{
+ ebegin "Activating additional swap space"
+ case "$RC_UNAME" in
+ NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
+ *) swapon -a >/dev/null;;
+ esac
+ eend 0 # If swapon has nothing todo it errors, so always return 0
+}
+
+stop()
+{
+ ebegin "Deactivating additional swap space"
+
+ # Try to unmount all tmpfs filesystems not in use, else a deadlock may
+ # occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
+ # fixme: Do we need this here since we are only unmounting swap files
+ # and loopback swap?
+ cd "$RC_SVCDIR"
+ umount -a -t tmpfs 2>/dev/null
+
+ case "$RC_UNAME" in
+ Linux)
+ while read filename type rest; do
+ case "$type" in
+ file) swapoff $filename >/dev/null;;
+ esac
+ case "$filename" in
+ /dev/loop*) swapoff $filename >/dev/null;;
+ esac
+ done < /proc/swaps
+ ;;
+ esac
+ eend 0
+}
diff --git a/runlevels/Makefile b/runlevels/Makefile
index c1a9f096..1573572e 100644
--- a/runlevels/Makefile
+++ b/runlevels/Makefile
@@ -1,5 +1,5 @@
BOOT= bootmisc fsck hostname localmount \
- root swap sysctl urandom ${BOOT-${OS}}
+ root swap swapfiles sysctl urandom ${BOOT-${OS}}
DEFAULT= local netmount
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
SYSINIT= ${SYSINIT-${OS}}