aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh')
-rwxr-xr-xsys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh81
1 files changed, 81 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh
new file mode 100755
index 000000000000..814c831e408c
--- /dev/null
+++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh
@@ -0,0 +1,81 @@
+#!/bin/ksh -p
+
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# There are myriad problems associated with trying to test umountall in a way
+# that works reliable across different systems. Some filesystems won't unmount
+# because they're busy. Some won't remount because they were legacy mounts in
+# the first place. etc...
+# Make a best approximation by calling umountall with the -n option, and verify
+# that the list of things it would try to unmout makes sense.
+#
+# STRATEGY:
+# 1. Make a list of file systems umountall is known to ignore.
+# 2. Append all ZFS file systems on this system.
+# 3. Run umountall -n and verify the file systems it reports are in the list.
+#
+
+log_must zfs mount -a
+for fs in 1 2 3 ; do
+ log_must mounted $TESTPOOL/$TESTFS.$fs
+done
+
+# This is the list we check the output of umountall -n against. We seed it
+# with these values because umountall will ignore them, and they're possible
+# (though most are improbable) ZFS filesystem mountpoints.
+zfs_list="/ /lib /sbin /tmp /usr /var /var/adm /var/run"
+
+# Append our ZFS filesystems to the list, not worrying about duplicates.
+if is_linux; then
+ typeset mounts=$(mount | awk '{if ($5 == "zfs") print $3}')
+elif is_freebsd; then
+ typeset mounts=$(mount -p | awk '{if ($3 == "zfs") print $2}')
+else
+ typeset mounts=$(mount -p | awk '{if ($4 == "zfs") print $3}')
+fi
+
+for fs in $mounts; do
+ zfs_list="$zfs_list $fs"
+done
+
+if is_linux; then
+ mounts=$(umount --fake -av -t zfs 2>&1 | \
+ grep "successfully umounted" | awk '{print $1}')
+ # Fallback to /proc/mounts for umount(8) (util-linux-ng 2.17.2)
+ if [[ -z $mounts ]]; then
+ mounts=$(awk '/zfs/ { print $2 }' /proc/mounts)
+ fi
+elif is_freebsd; then
+ # Umountall and umount not supported on FreeBSD
+ mounts=$(mount -t zfs | sort -r | awk '{print $3}')
+else
+ mounts=$(umountall -n -F zfs 2>&1 | awk '{print $2}')
+fi
+
+fs=''
+for fs in $mounts; do
+ for i in $zfs_list; do
+ [[ $fs = $i ]] && continue 2
+ done
+ log_fail "umountall -n -F zfs tried to unmount $fs"
+done
+[[ -n $mounts ]] || log_fail "umountall -n -F zfs produced no output"
+
+log_pass "All ZFS file systems would have been unmounted"