1*57718be8SEnji Cooper# $NetBSD: t_miscquota.sh,v 1.8 2013/01/22 06:24:11 dholland Exp $
2*57718be8SEnji Cooper#
3*57718be8SEnji Cooper#  Copyright (c) 2011 Manuel Bouyer
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 Coopertest_case_root walk_list_user quota_walk_list \
29*57718be8SEnji Cooper    "walk user quota list over several disk blocks" -b le 1 user
30*57718be8SEnji Cooper
31*57718be8SEnji Coopertest_case_root psnapshot_user quota_snap \
32*57718be8SEnji Cooper    "create a persistent shapshot of quota-enabled fs, and do some writes" \
33*57718be8SEnji Cooper    -b le 1 user
34*57718be8SEnji Cooper
35*57718be8SEnji Coopertest_case_root npsnapshot_user quota_snap \
36*57718be8SEnji Cooper    "create a non-persistent shapshot of quota-enabled fs, and do some writes" \
37*57718be8SEnji Cooper    -boL le 1 user
38*57718be8SEnji Cooper
39*57718be8SEnji Coopertest_case_root psnapshot_unconf_user quota_snap \
40*57718be8SEnji Cooper    "create a persistent shapshot of quota-enabled fs, and do some writes and unconf" \
41*57718be8SEnji Cooper    -boC le 1 user
42*57718be8SEnji Cooper
43*57718be8SEnji Coopertest_case_root npsnapshot_unconf_user quota_snap \
44*57718be8SEnji Cooper    "create a non-persistent shapshot of quota-enabled fs, and do some writes and unconf" \
45*57718be8SEnji Cooper    -boLC le 1 user
46*57718be8SEnji Cooper
47*57718be8SEnji Coopertest_case log_unlink quota_log \
48*57718be8SEnji Cooper    "an unlinked file cleaned by the log replay should update quota" \
49*57718be8SEnji Cooper    -l le 1 user
50*57718be8SEnji Cooper
51*57718be8SEnji Coopertest_case log_unlink_remount quota_log \
52*57718be8SEnji Cooper    "an unlinked file cleaned by the log replay after remount" \
53*57718be8SEnji Cooper    -oRL le 1 user
54*57718be8SEnji Cooper
55*57718be8SEnji Cooper
56*57718be8SEnji Coopertest_case_root default_deny_user quota_default_deny \
57*57718be8SEnji Cooper    "new quota entry denied by default entry" 5 -b le 1 user
58*57718be8SEnji Cooper
59*57718be8SEnji Coopertest_case_root default_deny_user_big quota_default_deny \
60*57718be8SEnji Cooper    "new quota entry denied by default entry, with list on more than one block" 5000 -b le 1 user
61*57718be8SEnji Cooper
62*57718be8SEnji Cooper
63*57718be8SEnji Cooperquota_walk_list()
64*57718be8SEnji Cooper{
65*57718be8SEnji Cooper	create_ffs_server $*
66*57718be8SEnji Cooper	local q=$4
67*57718be8SEnji Cooper	local expect
68*57718be8SEnji Cooper
69*57718be8SEnji Cooper	case ${q} in
70*57718be8SEnji Cooper	user)
71*57718be8SEnji Cooper		expect=u
72*57718be8SEnji Cooper		fail=g
73*57718be8SEnji Cooper		;;
74*57718be8SEnji Cooper	group)
75*57718be8SEnji Cooper		expect=g
76*57718be8SEnji Cooper		fail=u
77*57718be8SEnji Cooper		;;
78*57718be8SEnji Cooper	*)
79*57718be8SEnji Cooper		atf_fail "wrong quota type"
80*57718be8SEnji Cooper		;;
81*57718be8SEnji Cooper	esac
82*57718be8SEnji Cooper
83*57718be8SEnji Cooper	# create 100 users, all in the same hash list
84*57718be8SEnji Cooper	local i=1;
85*57718be8SEnji Cooper	while [ $i -lt 101 ]; do
86*57718be8SEnji Cooper		atf_check -s exit:0 \
87*57718be8SEnji Cooper		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt edquota -${expect} \
88*57718be8SEnji Cooper		   -s10k/20 -h40M/50k -t 2W/3D $((i * 4096))
89*57718be8SEnji Cooper		i=$((i + 1))
90*57718be8SEnji Cooper	done
91*57718be8SEnji Cooper	# do a repquota
92*57718be8SEnji Cooper	atf_check -s exit:0 -o 'match:user 409600 block  *81920 20 0' \
93*57718be8SEnji Cooper	    env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt repquota -x -${expect} /mnt
94*57718be8SEnji Cooper	rump_quota_shutdown
95*57718be8SEnji Cooper}
96*57718be8SEnji Cooper
97*57718be8SEnji Cooperquota_snap()
98*57718be8SEnji Cooper{
99*57718be8SEnji Cooper	local flag=$1; shift
100*57718be8SEnji Cooper	create_ffs $*
101*57718be8SEnji Cooper	local q=$3
102*57718be8SEnji Cooper	local expect
103*57718be8SEnji Cooper
104*57718be8SEnji Cooper	case ${q} in
105*57718be8SEnji Cooper	user)
106*57718be8SEnji Cooper		expect=u
107*57718be8SEnji Cooper		fail=g
108*57718be8SEnji Cooper		;;
109*57718be8SEnji Cooper	group)
110*57718be8SEnji Cooper		expect=g
111*57718be8SEnji Cooper		fail=u
112*57718be8SEnji Cooper		;;
113*57718be8SEnji Cooper	*)
114*57718be8SEnji Cooper		atf_fail "wrong quota type"
115*57718be8SEnji Cooper		;;
116*57718be8SEnji Cooper	esac
117*57718be8SEnji Cooper
118*57718be8SEnji Cooper	#start our server which takes a snapshot
119*57718be8SEnji Cooper	atf_check -s exit:0 -o ignore \
120*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_quota2_tests ${flag} 4 ${IMG} ${RUMP_SERVER}
121*57718be8SEnji Cooper	# create a few users
122*57718be8SEnji Cooper	local i=1;
123*57718be8SEnji Cooper	while [ $i -lt 11 ]; do
124*57718be8SEnji Cooper		atf_check -s exit:0 \
125*57718be8SEnji Cooper		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt edquota -${expect} \
126*57718be8SEnji Cooper		   -s10k/20 -h40M/50k -t 2W/3D $i
127*57718be8SEnji Cooper		i=$((i + 1))
128*57718be8SEnji Cooper	done
129*57718be8SEnji Cooper	# we should have 5 files (root + 4 regular files)
130*57718be8SEnji Cooper	atf_check -s exit:0 \
131*57718be8SEnji Cooper	    -o 'match:-        -  7days         5       -       -  7days' \
132*57718be8SEnji Cooper	    env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt repquota -av
133*57718be8SEnji Cooper	#shutdown and check filesystem
134*57718be8SEnji Cooper	rump_quota_shutdown
135*57718be8SEnji Cooper}
136*57718be8SEnji Cooper
137*57718be8SEnji Cooperquota_log()
138*57718be8SEnji Cooper{
139*57718be8SEnji Cooper	local srv2args=$1; shift
140*57718be8SEnji Cooper	create_ffs $*
141*57718be8SEnji Cooper	local q=$3
142*57718be8SEnji Cooper	local expect
143*57718be8SEnji Cooper
144*57718be8SEnji Cooper	case ${q} in
145*57718be8SEnji Cooper	user)
146*57718be8SEnji Cooper		expect=u
147*57718be8SEnji Cooper		fail=g
148*57718be8SEnji Cooper		;;
149*57718be8SEnji Cooper	group)
150*57718be8SEnji Cooper		expect=g
151*57718be8SEnji Cooper		fail=u
152*57718be8SEnji Cooper		;;
153*57718be8SEnji Cooper	*)
154*57718be8SEnji Cooper		atf_fail "wrong quota type"
155*57718be8SEnji Cooper		;;
156*57718be8SEnji Cooper	esac
157*57718be8SEnji Cooper
158*57718be8SEnji Cooper	#start our server which create a file and unlink while keeping
159*57718be8SEnji Cooper	# it open. The server halts itself without flush
160*57718be8SEnji Cooper	atf_check -s exit:0 -o ignore \
161*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_quota2_tests -loU 5 ${IMG} ${RUMP_SERVER}
162*57718be8SEnji Cooper	# we should have one unlinked file, but the log covers it.
163*57718be8SEnji Cooper	atf_check -s exit:0 -o match:'3 files' -e ignore \
164*57718be8SEnji Cooper	    fsck_ffs -nf -F ${IMG}
165*57718be8SEnji Cooper	# have a kernel mount the fs again; it should cleanup the
166*57718be8SEnji Cooper	# unlinked file
167*57718be8SEnji Cooper	atf_check -o ignore -e ignore $(atf_get_srcdir)/h_quota2_tests \
168*57718be8SEnji Cooper	    ${srv2args} -b 5 ${IMG} ${RUMP_SERVER}
169*57718be8SEnji Cooper	#shutdown and check filesystem
170*57718be8SEnji Cooper	rump_quota_shutdown
171*57718be8SEnji Cooper}
172*57718be8SEnji Cooper
173*57718be8SEnji Cooperquota_default_deny()
174*57718be8SEnji Cooper{
175*57718be8SEnji Cooper	local nusers=$1; shift
176*57718be8SEnji Cooper	create_ffs_server $*
177*57718be8SEnji Cooper	local q=$4
178*57718be8SEnji Cooper	local expect
179*57718be8SEnji Cooper
180*57718be8SEnji Cooper	case ${q} in
181*57718be8SEnji Cooper	user)
182*57718be8SEnji Cooper		expect=u
183*57718be8SEnji Cooper		fail=g
184*57718be8SEnji Cooper		;;
185*57718be8SEnji Cooper	group)
186*57718be8SEnji Cooper		expect=g
187*57718be8SEnji Cooper		fail=u
188*57718be8SEnji Cooper		;;
189*57718be8SEnji Cooper	*)
190*57718be8SEnji Cooper		atf_fail "wrong quota type"
191*57718be8SEnji Cooper		;;
192*57718be8SEnji Cooper	esac
193*57718be8SEnji Cooper
194*57718be8SEnji Cooper	# create $nusers users, so we are sure the free list has entries
195*57718be8SEnji Cooper	# from block 1. Start from 10, as non-root id is 1.
196*57718be8SEnji Cooper	# set default to deny all
197*57718be8SEnji Cooper	( echo "@format netbsd-quota-dump v1"
198*57718be8SEnji Cooper	  echo "# idtype id objtype   hard soft usage expire grace"
199*57718be8SEnji Cooper	  echo "$q default block   0 0 0 0 0"
200*57718be8SEnji Cooper	  echo "$q default file   0 0 0 0 0"
201*57718be8SEnji Cooper	  local i=10;
202*57718be8SEnji Cooper	  while [ $i -lt $(($nusers + 10)) ]; do
203*57718be8SEnji Cooper		echo "$q $i block   0 0 0 0 0"
204*57718be8SEnji Cooper		echo "$q $i file   0 0 0 0 0"
205*57718be8SEnji Cooper		i=$((i + 1))
206*57718be8SEnji Cooper	  done
207*57718be8SEnji Cooper	) | atf_check -s exit:0 \
208*57718be8SEnji Cooper		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt quotarestore -d /mnt
209*57718be8SEnji Cooper	atf_check -s exit:0 rump.halt
210*57718be8SEnji Cooper	#now start the server which does the limits tests
211*57718be8SEnji Cooper	$(atf_get_srcdir)/h_quota2_tests -oC -b 0 ${IMG} ${RUMP_SERVER}
212*57718be8SEnji Cooper	rump_quota_shutdown
213*57718be8SEnji Cooper}
214