xref: /freebsd-src/contrib/netbsd-tests/kernel/t_umountstress.sh (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper# $NetBSD: t_umountstress.sh,v 1.5 2013/05/31 14:40:48 gson Exp $
2*57718be8SEnji Cooper#
3*57718be8SEnji Cooper# Copyright (c) 2013 The NetBSD Foundation, Inc.
4*57718be8SEnji Cooper# All rights reserved.
5*57718be8SEnji Cooper#
6*57718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
7*57718be8SEnji Cooper# modification, are permitted provided that the following conditions
8*57718be8SEnji Cooper# are met:
9*57718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
10*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
11*57718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
12*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
13*57718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
14*57718be8SEnji Cooper#
15*57718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16*57718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17*57718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18*57718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19*57718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*57718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*57718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*57718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*57718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*57718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*57718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
26*57718be8SEnji Cooper#
27*57718be8SEnji Cooper
28*57718be8SEnji CooperTMPMP=umount-stress_mount
29*57718be8SEnji CooperTMPIM=umount-stress.im
30*57718be8SEnji Cooper
31*57718be8SEnji CooperVND=vnd0
32*57718be8SEnji CooperBVND=/dev/${VND}
33*57718be8SEnji CooperCVND=/dev/r${VND}
34*57718be8SEnji CooperMPART=a
35*57718be8SEnji Cooper
36*57718be8SEnji Cooperatf_test_case fileop cleanup
37*57718be8SEnji Cooperfileop_head()
38*57718be8SEnji Cooper{
39*57718be8SEnji Cooper	atf_set "descr" "Checks unmounting a filesystem doing file operations"
40*57718be8SEnji Cooper	atf_set "require.user" "root"
41*57718be8SEnji Cooper}
42*57718be8SEnji Cooperfileop_body()
43*57718be8SEnji Cooper{
44*57718be8SEnji Cooper	cat >disktab <<EOF
45*57718be8SEnji Cooperfloppy288|2.88MB 3.5in Extra High Density Floppy:\
46*57718be8SEnji Cooper	:ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
47*57718be8SEnji Cooper	:pa#5760:oa#0:ba#4096:fa#512:ta=4.2BSD:\
48*57718be8SEnji Cooper	:pb#5760:ob#0:\
49*57718be8SEnji Cooper	:pc#5760:oc#0:
50*57718be8SEnji CooperEOF
51*57718be8SEnji Cooper
52*57718be8SEnji Cooper	echo "*** Creating a dummy directory tree at" \
53*57718be8SEnji Cooper	     "${TMPMP} mounted on ${TMPIM}"
54*57718be8SEnji Cooper
55*57718be8SEnji Cooper	atf_check -o ignore -e ignore mkdir ${TMPMP}
56*57718be8SEnji Cooper	atf_check -o ignore -e ignore dd if=/dev/zero of=${TMPIM} count=5860
57*57718be8SEnji Cooper	atf_check -o ignore -e ignore vnconfig -v ${VND} ${TMPIM}
58*57718be8SEnji Cooper	atf_check -o ignore -e ignore disklabel -f disktab -rw ${VND} floppy288
59*57718be8SEnji Cooper	atf_check -o ignore -e ignore newfs -i 500 -b 8192 -f 1024 ${CVND}${MPART}
60*57718be8SEnji Cooper	atf_check -o ignore -e ignore mount -o async ${BVND}${MPART} ${TMPMP}
61*57718be8SEnji Cooper
62*57718be8SEnji Cooper	echo "*** Testing fileops"
63*57718be8SEnji Cooper
64*57718be8SEnji Cooper	touch ${TMPMP}/hold
65*57718be8SEnji Cooper	exec 9< ${TMPMP}/hold
66*57718be8SEnji Cooper
67*57718be8SEnji Cooper	(
68*57718be8SEnji Cooper		for j in 0 1 2; do
69*57718be8SEnji Cooper		for k in 0 1 2 3 4 5 6 7 8 9; do
70*57718be8SEnji Cooper			if ! dd msgfmt=quiet if=/dev/zero \
71*57718be8SEnji Cooper				count=1 of=${TMPMP}/test$i$j$k; then
72*57718be8SEnji Cooper				echo 1 >result
73*57718be8SEnji Cooper				exit
74*57718be8SEnji Cooper			fi
75*57718be8SEnji Cooper		done
76*57718be8SEnji Cooper		done
77*57718be8SEnji Cooper		echo 0 >result
78*57718be8SEnji Cooper	) &
79*57718be8SEnji Cooper	busypid=$!
80*57718be8SEnji Cooper
81*57718be8SEnji Cooper	while ! test -f result; do
82*57718be8SEnji Cooper		if err=$(umount ${TMPMP} 2>&1); then
83*57718be8SEnji Cooper			kill $busypid
84*57718be8SEnji Cooper			exec 9<&-
85*57718be8SEnji Cooper			wait
86*57718be8SEnji Cooper			atf_fail "Unmount succeeded while busy"
87*57718be8SEnji Cooper			return
88*57718be8SEnji Cooper		fi
89*57718be8SEnji Cooper
90*57718be8SEnji Cooper		case $err in
91*57718be8SEnji Cooper		*:\ Device\ busy)
92*57718be8SEnji Cooper			;;
93*57718be8SEnji Cooper		*)
94*57718be8SEnji Cooper			kill $busypid
95*57718be8SEnji Cooper			exec 9<&-
96*57718be8SEnji Cooper			wait
97*57718be8SEnji Cooper			atf_fail "Unmount failed: $err"
98*57718be8SEnji Cooper			return
99*57718be8SEnji Cooper			;;
100*57718be8SEnji Cooper		esac
101*57718be8SEnji Cooper	done
102*57718be8SEnji Cooper
103*57718be8SEnji Cooper	exec 9<&-
104*57718be8SEnji Cooper	wait
105*57718be8SEnji Cooper
106*57718be8SEnji Cooper	rc=`cat result`
107*57718be8SEnji Cooper	rm -f result
108*57718be8SEnji Cooper
109*57718be8SEnji Cooper	case $rc in
110*57718be8SEnji Cooper	0) ;;
111*57718be8SEnji Cooper	*) atf_fail "File operation failed"
112*57718be8SEnji Cooper	esac
113*57718be8SEnji Cooper}
114*57718be8SEnji Cooperfileop_cleanup()
115*57718be8SEnji Cooper{
116*57718be8SEnji Cooper	echo "*** Cleaning up ${TMPMP}, ${TMPIM}."
117*57718be8SEnji Cooper	umount -f "${TMPMP}"
118*57718be8SEnji Cooper	vnconfig -u "${VND}"
119*57718be8SEnji Cooper}
120*57718be8SEnji Cooper
121*57718be8SEnji Cooperatf_test_case mountlist cleanup
122*57718be8SEnji Coopermountlist_head()
123*57718be8SEnji Cooper{
124*57718be8SEnji Cooper	atf_set "descr" "Checks unmounting a filesystem using mountlist"
125*57718be8SEnji Cooper	atf_set "require.user" "root"
126*57718be8SEnji Cooper}
127*57718be8SEnji Coopermountlist_body()
128*57718be8SEnji Cooper{
129*57718be8SEnji Cooper	cat >disktab <<EOF
130*57718be8SEnji Cooperfloppy288|2.88MB 3.5in Extra High Density Floppy:\
131*57718be8SEnji Cooper	:ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
132*57718be8SEnji Cooper	:pa#5760:oa#0:ba#4096:fa#512:ta=4.2BSD:\
133*57718be8SEnji Cooper	:pb#5760:ob#0:\
134*57718be8SEnji Cooper	:pc#5760:oc#0:
135*57718be8SEnji CooperEOF
136*57718be8SEnji Cooper
137*57718be8SEnji Cooper	echo "*** Creating a dummy directory tree at" \
138*57718be8SEnji Cooper	     "${TMPMP} mounted on ${TMPIM}"
139*57718be8SEnji Cooper
140*57718be8SEnji Cooper	atf_check -o ignore -e ignore mkdir ${TMPMP}
141*57718be8SEnji Cooper	atf_check -o ignore -e ignore dd if=/dev/zero of=${TMPIM} count=5860
142*57718be8SEnji Cooper	atf_check -o ignore -e ignore vnconfig -v ${VND} ${TMPIM}
143*57718be8SEnji Cooper	atf_check -o ignore -e ignore disklabel -f disktab -rw ${VND} floppy288
144*57718be8SEnji Cooper	atf_check -o ignore -e ignore newfs -i 500 -b 8192 -f 1024 ${CVND}${MPART}
145*57718be8SEnji Cooper	atf_check -o ignore -e ignore mount -o async ${BVND}${MPART} ${TMPMP}
146*57718be8SEnji Cooper
147*57718be8SEnji Cooper	echo "*** Testing mountlist"
148*57718be8SEnji Cooper
149*57718be8SEnji Cooper	(
150*57718be8SEnji Cooper		for j in 0 1 2 3 4 5 6 7 8 9; do
151*57718be8SEnji Cooper		for k in 0 1 2 3 4 5 6 7 8 9; do
152*57718be8SEnji Cooper			if ! out=$(mount); then
153*57718be8SEnji Cooper				echo 1 >result
154*57718be8SEnji Cooper				exit
155*57718be8SEnji Cooper			fi
156*57718be8SEnji Cooper		done
157*57718be8SEnji Cooper		done
158*57718be8SEnji Cooper		echo 0 >result
159*57718be8SEnji Cooper	) &
160*57718be8SEnji Cooper	busypid=$!
161*57718be8SEnji Cooper
162*57718be8SEnji Cooper	while ! test -f result; do
163*57718be8SEnji Cooper		if err=$(umount ${TMPMP} 2>&1); then
164*57718be8SEnji Cooper			if ! mount -o async ${BVND}${MPART} ${TMPMP}; then
165*57718be8SEnji Cooper				kill $busypid
166*57718be8SEnji Cooper				exec 9<&-
167*57718be8SEnji Cooper				wait
168*57718be8SEnji Cooper				atf_fail "Remount failed"
169*57718be8SEnji Cooper				return
170*57718be8SEnji Cooper			fi
171*57718be8SEnji Cooper			continue
172*57718be8SEnji Cooper		fi
173*57718be8SEnji Cooper
174*57718be8SEnji Cooper		case $err in
175*57718be8SEnji Cooper		*:\ Device\ busy)
176*57718be8SEnji Cooper			;;
177*57718be8SEnji Cooper		*)
178*57718be8SEnji Cooper			kill $busypid
179*57718be8SEnji Cooper			exec 9<&-
180*57718be8SEnji Cooper			wait
181*57718be8SEnji Cooper			atf_fail "Unmount failed: $err"
182*57718be8SEnji Cooper			return
183*57718be8SEnji Cooper			;;
184*57718be8SEnji Cooper		esac
185*57718be8SEnji Cooper	done
186*57718be8SEnji Cooper
187*57718be8SEnji Cooper	exec 9<&-
188*57718be8SEnji Cooper	wait
189*57718be8SEnji Cooper
190*57718be8SEnji Cooper	rc=`cat result`
191*57718be8SEnji Cooper	rm -f result
192*57718be8SEnji Cooper
193*57718be8SEnji Cooper	case $rc in
194*57718be8SEnji Cooper	0) ;;
195*57718be8SEnji Cooper	*) atf_fail "Mountlist operation failed"
196*57718be8SEnji Cooper	esac
197*57718be8SEnji Cooper}
198*57718be8SEnji Coopermountlist_cleanup()
199*57718be8SEnji Cooper{
200*57718be8SEnji Cooper	echo "*** Cleaning up ${TMPMP}, ${TMPIM}."
201*57718be8SEnji Cooper	umount -f "${TMPMP}"
202*57718be8SEnji Cooper	vnconfig -u "${VND}"
203*57718be8SEnji Cooper}
204*57718be8SEnji Cooper
205*57718be8SEnji Cooperatf_init_test_cases()
206*57718be8SEnji Cooper{
207*57718be8SEnji Cooper	atf_add_test_case fileop
208*57718be8SEnji Cooper	atf_add_test_case mountlist
209*57718be8SEnji Cooper}
210