--- /etc/rc.d/swap1.orig	2016-03-13 18:54:23.000000000 +0100
+++ /etc/rc.d/swap1	2016-03-23 21:41:54.000000000 +0100
@@ -13,6 +13,40 @@
 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_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
