On Sun, Oct 30, 2011 at 12:00:09AM +0200, Tom Gundersen wrote:
Factor out umounting. Explicitly skip umounting API directories, rather than matching on fs type. This allows us to e.g. unmount all tmpfs but leaving /run and /dev/shm alone.
Signed-off-by: Tom Gundersen <teg@jklm.no> --- functions | 6 ++++++ rc.shutdown | 9 ++++----- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/functions b/functions index 05d8f56..47146ea 100644 --- a/functions +++ b/functions @@ -460,6 +460,12 @@ mount_all() { mount -a -t "nosysfs,no${NETFS//,/,no}" -O no_netdev }
+umount_all() { + # $1: restrict to fstype + umount `mount | grep -e "^\(${1}\)" | awk '{ print $3 }' | grep -v -e "^/\(proc\|sys\|dev\|run\)" | sort -r` \ + -O no_netdev -r +} + remove_leftover() { stat_busy "Removing Leftover Files" # handle this separately until we declare the non-symlinks obsoleted diff --git a/rc.shutdown b/rc.shutdown index 1946068..c042948 100755 --- a/rc.shutdown +++ b/rc.shutdown @@ -50,16 +50,15 @@ kill_all
run_hook shutdown_postkillall
-# TODO: unmount any non-api partitions that are backed by swap, we don't want to -# move their contents into memory (waste of time and might caues OOM). +# unmount any non-api partitions that are backed by swap, we don't want to +# move their contents into memory (waste of time and might caues OOM). +status "Unmounting Swap-backed Filesystems" umount_all "tmpfs\|ramfs"
# almost everything is dead now, so the swap should hopefully be relatively # empty, and quick to switch off status "Deactivating Swap" swapoff -a
-# if we don't have devtmpfs support, /dev is mounted as tmpfs, so don't unmount it -status "Unmounting Filesystems" \ - umount -a -r -t nodevtmpfs,notmpfs,nosysfs,noproc,nodevpts -O no_netdev +status "Unmounting Non-API Filesystems" umount_all
run_hook shutdown_postumount
-- 1.7.7.1
So, as we discussed, I does not like your umount_all. It'll be really nice when umount can do this on its own, but until then, something such as the following should suffice: umount_all() { while read -r fstype options target; do # match only targetted fstypes if [[ $1 && $1 != "$fstype" ]]; then continue fi # don't unmount API filesystems if [[ $target = /@(proc|sys|run|dev)?(/*) ]]; then continue fi # avoid networked devices IFS=, read -ra opts <<< "$options" if in_array _netdev "${opts[@]}"; then continue fi mounts+=("$target") done < <(findmnt -runRo FSTYPE,OPTIONS,TARGET / | tac) } d