blob: 814c831e408cfd334f1971d73aa2e62db32d010e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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"
|