mirror_zfs/tests/zfs-tests/tests/functional/mount/umountall_001.ksh
Matthew Macy 7839c4b5e1 Update ZTS to work on FreeBSD
Update the common ZTS scripts and individual test cases as needed 
in order to allow them to be run on FreeBSD.  The high level goal
is to provide compatibility wrappers whenever possible to minimize
changes to individual test cases.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: John Kennedy <john.kennedy@delphix.com>
Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
Signed-off-by: Ryan Moeller <ryan@ixsystems.com>
Closes #9692
2019-12-18 12:29:43 -08:00

82 lines
2.5 KiB
Bash
Executable File

#!/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"