xref: /netbsd-src/tests/fs/ffs/t_miscquota.sh (revision a289199b7e91cf3d4ecc768032f3df3577b2aa1b)
1*a289199bSmsaitoh# $NetBSD: t_miscquota.sh,v 1.9 2021/12/05 07:51:26 msaitoh Exp $
2063f96f3Sbouyer#
3063f96f3Sbouyer#  Copyright (c) 2011 Manuel Bouyer
4063f96f3Sbouyer#  All rights reserved.
5063f96f3Sbouyer#
6063f96f3Sbouyer#  Redistribution and use in source and binary forms, with or without
7063f96f3Sbouyer#  modification, are permitted provided that the following conditions
8063f96f3Sbouyer#  are met:
9063f96f3Sbouyer#  1. Redistributions of source code must retain the above copyright
10063f96f3Sbouyer#     notice, this list of conditions and the following disclaimer.
11063f96f3Sbouyer#  2. Redistributions in binary form must reproduce the above copyright
12063f96f3Sbouyer#     notice, this list of conditions and the following disclaimer in the
13063f96f3Sbouyer#     documentation and/or other materials provided with the distribution.
14063f96f3Sbouyer#
15063f96f3Sbouyer#  THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16063f96f3Sbouyer#  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17063f96f3Sbouyer#  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18063f96f3Sbouyer#  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19063f96f3Sbouyer#  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20063f96f3Sbouyer#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21063f96f3Sbouyer#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22063f96f3Sbouyer#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23063f96f3Sbouyer#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24063f96f3Sbouyer#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25063f96f3Sbouyer#  POSSIBILITY OF SUCH DAMAGE.
26063f96f3Sbouyer#
27063f96f3Sbouyer
28063f96f3Sbouyertest_case_root walk_list_user quota_walk_list \
29063f96f3Sbouyer    "walk user quota list over several disk blocks" -b le 1 user
30063f96f3Sbouyer
31063f96f3Sbouyertest_case_root psnapshot_user quota_snap \
32*a289199bSmsaitoh    "create a persistent snapshot of quota-enabled fs, and do some writes" \
33063f96f3Sbouyer    -b le 1 user
34063f96f3Sbouyer
35063f96f3Sbouyertest_case_root npsnapshot_user quota_snap \
36*a289199bSmsaitoh    "create a non-persistent snapshot of quota-enabled fs, and do some writes" \
37063f96f3Sbouyer    -boL le 1 user
38063f96f3Sbouyer
39063f96f3Sbouyertest_case_root psnapshot_unconf_user quota_snap \
40*a289199bSmsaitoh    "create a persistent snapshot of quota-enabled fs, and do some writes and unconf" \
41063f96f3Sbouyer    -boC le 1 user
42063f96f3Sbouyer
43063f96f3Sbouyertest_case_root npsnapshot_unconf_user quota_snap \
44*a289199bSmsaitoh    "create a non-persistent snapshot of quota-enabled fs, and do some writes and unconf" \
45063f96f3Sbouyer    -boLC le 1 user
46063f96f3Sbouyer
47063f96f3Sbouyertest_case log_unlink quota_log \
48063f96f3Sbouyer    "an unlinked file cleaned by the log replay should update quota" \
49063f96f3Sbouyer    -l le 1 user
50063f96f3Sbouyer
51063f96f3Sbouyertest_case log_unlink_remount quota_log \
52063f96f3Sbouyer    "an unlinked file cleaned by the log replay after remount" \
53063f96f3Sbouyer    -oRL le 1 user
54063f96f3Sbouyer
55063f96f3Sbouyer
5676ad4067Sdhollandtest_case_root default_deny_user quota_default_deny \
57f800b89bSbouyer    "new quota entry denied by default entry" 5 -b le 1 user
58f800b89bSbouyer
5976ad4067Sdhollandtest_case_root default_deny_user_big quota_default_deny \
60f800b89bSbouyer    "new quota entry denied by default entry, with list on more than one block" 5000 -b le 1 user
61f800b89bSbouyer
62f800b89bSbouyer
63063f96f3Sbouyerquota_walk_list()
64063f96f3Sbouyer{
6594276795Sbouyer	create_ffs_server $*
66063f96f3Sbouyer	local q=$4
67063f96f3Sbouyer	local expect
68063f96f3Sbouyer
69063f96f3Sbouyer	case ${q} in
70063f96f3Sbouyer	user)
71063f96f3Sbouyer		expect=u
72063f96f3Sbouyer		fail=g
73063f96f3Sbouyer		;;
74063f96f3Sbouyer	group)
75063f96f3Sbouyer		expect=g
76063f96f3Sbouyer		fail=u
77063f96f3Sbouyer		;;
78063f96f3Sbouyer	*)
79063f96f3Sbouyer		atf_fail "wrong quota type"
80063f96f3Sbouyer		;;
81063f96f3Sbouyer	esac
82063f96f3Sbouyer
83063f96f3Sbouyer	# create 100 users, all in the same hash list
84063f96f3Sbouyer	local i=1;
85063f96f3Sbouyer	while [ $i -lt 101 ]; do
86063f96f3Sbouyer		atf_check -s exit:0 \
8737628c8cSbouyer		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt edquota -${expect} \
88063f96f3Sbouyer		   -s10k/20 -h40M/50k -t 2W/3D $((i * 4096))
89063f96f3Sbouyer		i=$((i + 1))
90063f96f3Sbouyer	done
91063f96f3Sbouyer	# do a repquota
9225693661Sdholland	atf_check -s exit:0 -o 'match:user 409600 block  *81920 20 0' \
9337628c8cSbouyer	    env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt repquota -x -${expect} /mnt
9494276795Sbouyer	rump_quota_shutdown
95063f96f3Sbouyer}
96063f96f3Sbouyer
97063f96f3Sbouyerquota_snap()
98063f96f3Sbouyer{
99063f96f3Sbouyer	local flag=$1; shift
10094276795Sbouyer	create_ffs $*
101063f96f3Sbouyer	local q=$3
102063f96f3Sbouyer	local expect
103063f96f3Sbouyer
104063f96f3Sbouyer	case ${q} in
105063f96f3Sbouyer	user)
106063f96f3Sbouyer		expect=u
107063f96f3Sbouyer		fail=g
108063f96f3Sbouyer		;;
109063f96f3Sbouyer	group)
110063f96f3Sbouyer		expect=g
111063f96f3Sbouyer		fail=u
112063f96f3Sbouyer		;;
113063f96f3Sbouyer	*)
114063f96f3Sbouyer		atf_fail "wrong quota type"
115063f96f3Sbouyer		;;
116063f96f3Sbouyer	esac
117063f96f3Sbouyer
118063f96f3Sbouyer	#start our server which takes a snapshot
119063f96f3Sbouyer	atf_check -s exit:0 -o ignore \
120063f96f3Sbouyer	    $(atf_get_srcdir)/h_quota2_tests ${flag} 4 ${IMG} ${RUMP_SERVER}
121063f96f3Sbouyer	# create a few users
122063f96f3Sbouyer	local i=1;
123063f96f3Sbouyer	while [ $i -lt 11 ]; do
124063f96f3Sbouyer		atf_check -s exit:0 \
12537628c8cSbouyer		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt edquota -${expect} \
126063f96f3Sbouyer		   -s10k/20 -h40M/50k -t 2W/3D $i
127063f96f3Sbouyer		i=$((i + 1))
128063f96f3Sbouyer	done
129063f96f3Sbouyer	# we should have 5 files (root + 4 regular files)
130063f96f3Sbouyer	atf_check -s exit:0 \
131063f96f3Sbouyer	    -o 'match:-        -  7days         5       -       -  7days' \
13237628c8cSbouyer	    env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt repquota -av
133063f96f3Sbouyer	#shutdown and check filesystem
13494276795Sbouyer	rump_quota_shutdown
135063f96f3Sbouyer}
136063f96f3Sbouyer
137063f96f3Sbouyerquota_log()
138063f96f3Sbouyer{
139063f96f3Sbouyer	local srv2args=$1; shift
14094276795Sbouyer	create_ffs $*
141063f96f3Sbouyer	local q=$3
142063f96f3Sbouyer	local expect
143063f96f3Sbouyer
144063f96f3Sbouyer	case ${q} in
145063f96f3Sbouyer	user)
146063f96f3Sbouyer		expect=u
147063f96f3Sbouyer		fail=g
148063f96f3Sbouyer		;;
149063f96f3Sbouyer	group)
150063f96f3Sbouyer		expect=g
151063f96f3Sbouyer		fail=u
152063f96f3Sbouyer		;;
153063f96f3Sbouyer	*)
154063f96f3Sbouyer		atf_fail "wrong quota type"
155063f96f3Sbouyer		;;
156063f96f3Sbouyer	esac
157063f96f3Sbouyer
158063f96f3Sbouyer	#start our server which create a file and unlink while keeping
159063f96f3Sbouyer	# it open. The server halts itself without flush
160063f96f3Sbouyer	atf_check -s exit:0 -o ignore \
161063f96f3Sbouyer	    $(atf_get_srcdir)/h_quota2_tests -loU 5 ${IMG} ${RUMP_SERVER}
162063f96f3Sbouyer	# we should have one unlinked file, but the log covers it.
163063f96f3Sbouyer	atf_check -s exit:0 -o match:'3 files' -e ignore \
164063f96f3Sbouyer	    fsck_ffs -nf -F ${IMG}
165063f96f3Sbouyer	# have a kernel mount the fs again; it should cleanup the
166063f96f3Sbouyer	# unlinked file
167063f96f3Sbouyer	atf_check -o ignore -e ignore $(atf_get_srcdir)/h_quota2_tests \
168063f96f3Sbouyer	    ${srv2args} -b 5 ${IMG} ${RUMP_SERVER}
169063f96f3Sbouyer	#shutdown and check filesystem
17094276795Sbouyer	rump_quota_shutdown
171063f96f3Sbouyer}
172f800b89bSbouyer
17376ad4067Sdhollandquota_default_deny()
174f800b89bSbouyer{
175f800b89bSbouyer	local nusers=$1; shift
176f800b89bSbouyer	create_ffs_server $*
177f800b89bSbouyer	local q=$4
178f800b89bSbouyer	local expect
179f800b89bSbouyer
180f800b89bSbouyer	case ${q} in
181f800b89bSbouyer	user)
182f800b89bSbouyer		expect=u
183f800b89bSbouyer		fail=g
184f800b89bSbouyer		;;
185f800b89bSbouyer	group)
186f800b89bSbouyer		expect=g
187f800b89bSbouyer		fail=u
188f800b89bSbouyer		;;
189f800b89bSbouyer	*)
190f800b89bSbouyer		atf_fail "wrong quota type"
191f800b89bSbouyer		;;
192f800b89bSbouyer	esac
193f800b89bSbouyer
194f800b89bSbouyer	# create $nusers users, so we are sure the free list has entries
195f800b89bSbouyer	# from block 1. Start from 10, as non-root id is 1.
196f800b89bSbouyer	# set default to deny all
197f800b89bSbouyer	( echo "@format netbsd-quota-dump v1"
198f800b89bSbouyer	  echo "# idtype id objtype   hard soft usage expire grace"
199f800b89bSbouyer	  echo "$q default block   0 0 0 0 0"
200f800b89bSbouyer	  echo "$q default file   0 0 0 0 0"
201f800b89bSbouyer	  local i=10;
202f800b89bSbouyer	  while [ $i -lt $(($nusers + 10)) ]; do
203f800b89bSbouyer		echo "$q $i block   0 0 0 0 0"
204f800b89bSbouyer		echo "$q $i file   0 0 0 0 0"
205f800b89bSbouyer		i=$((i + 1))
206f800b89bSbouyer	  done
207f800b89bSbouyer	) | atf_check -s exit:0 \
208f800b89bSbouyer		   env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=vfs=getvfsstat,blanket=/mnt quotarestore -d /mnt
209f800b89bSbouyer	atf_check -s exit:0 rump.halt
210f800b89bSbouyer	#now start the server which does the limits tests
211f800b89bSbouyer	$(atf_get_srcdir)/h_quota2_tests -oC -b 0 ${IMG} ${RUMP_SERVER}
212f800b89bSbouyer	rump_quota_shutdown
213f800b89bSbouyer}
214