diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index 038b570df236..a771cb9bbb3d 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -1,4 +1,4 @@ -# $NetBSD: rc.conf,v 1.145 2018/09/23 07:24:19 maxv Exp $ +# $NetBSD: rc.conf,v 1.146 2018/10/19 14:11:12 martin Exp $ # # /etc/defaults/rc.conf -- # default configuration of /etc/rc.conf @@ -99,6 +99,12 @@ no_swap=NO # Set to YES if you have purposefully setup no swap # partitions and don't want to be warned about it. swapoff=YES # Remove block-type swap partitions upon shutdown # This defaults to yes, so that raids shutdown cleanly +swapoff_umount=auto # Set to 'manual' to umount the tmpfs partitions listed + # in swapoff_umount_fs before removing swap. Set to + # 'auto' to umount all tmpfs paritions that contain + # no device nodes. +swapoff_umount_fs= # space-separated list of tmpfs mount points to umount + # before removing swap if swapoff_umount=manual # Concatenated disk driver. # diff --git a/etc/rc.d/swap1 b/etc/rc.d/swap1 index 4c4093afdfd6..0b80d8b9d0a4 100755 --- a/etc/rc.d/swap1 +++ b/etc/rc.d/swap1 @@ -1,6 +1,6 @@ #!/bin/sh # -# $NetBSD: swap1,v 1.12 2015/04/20 18:01:46 prlw1 Exp $ +# $NetBSD: swap1,v 1.13 2018/10/19 14:11:12 martin Exp $ # # PROVIDE: localswap @@ -13,6 +13,40 @@ name="swap1" start_cmd="swap1_start" stop_cmd="swap1_stop" +dev_free_tmpfs() +{ + # Generate a list of tmpfs filesystems that contain no device nodes, + # which can presumably be unmounted safetly at shutdown time. + # Filenames are quoted and the list contains no unquoted newlines, + # so that the output can be reparsed as a single argument list. + mount -t tmpfs | while read -r line + do + fs=${line#tmpfs on } + fs=${fs% type tmpfs*} + find -x "${fs}" \( -type b -or -type c \) -exit 1 && + echo -n "'${fs}' " + done +} + +umount_vm_consumers() +{ + case ${swapoff_umount} in + auto) + swapoff_umount_fs="$(dev_free_tmpfs)" + ;; + manual) + # swapoff_umount_fs set manually + ;; + esac + # eval so that quotes within $swapoff_umount_fs are parsed properly + eval set -- "${swapoff_umount_fs}" + for fs in "$@" + do + echo "Forcibly unmounting ${fs}" + umount -ft tmpfs "${fs}" + done +} + # Add all block-type swap devices; these might be necessary # during disk checks. # @@ -31,8 +65,7 @@ swap1_start() swap1_stop() { if checkyesno swapoff || [ -n "$rc_force" ]; then - echo "Forcibly unmounting tmpfs filesystems" - umount -aft tmpfs + umount_vm_consumers echo "Removing block-type swap devices" swapctl -U -t blk || [ $? = 2 ] fi diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5 index 5346a1ff1e68..68808927a447 100644 --- a/share/man/man5/rc.conf.5 +++ b/share/man/man5/rc.conf.5 @@ -1,4 +1,4 @@ -.\" $NetBSD: rc.conf.5,v 1.177 2018/10/01 11:16:04 uwe Exp $ +.\" $NetBSD: rc.conf.5,v 1.178 2018/10/19 14:11:12 martin Exp $ .\" .\" Copyright (c) 1996 Matthew R. Green .\" All rights reserved. @@ -55,7 +55,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd September 23, 2018 +.Dd October 19, 2018 .Dt RC.CONF 5 .Os .Sh NAME @@ -353,6 +353,25 @@ Defaults to false. Boolean value. Remove block-type swap devices at shutdown time. Useful if swapping onto RAIDframe devices. +.It Sy swapoff_umount +.Dq "auto" +or +.Dq "manual" . +Before removing block-type swap devices, it is wise to unmount tmpfs filesystems to avoid having to swap their contents back into RAM. +By default +.Dq ( "auto" ) +all tmpfs filesystems that contain no device nodes are unmounted. +Set to +.Dq "manual" +to explicitly specify which filesystems to unmount before removing swap. +.It Sy swapoff_umount_fs +A space-separated list of absolute paths to tmpfs mount points. +If +.Sy swapoff_umount +is set to +.Dq "manual" , +these tmpfs filesystems will be forcibly unmounted before removing block-type +swap devices. .It Sy var_shm_symlink A path. If set, names a path that