summaryrefslogtreecommitdiff
path: root/tests/generic/230
blob: e49e0da25c5bd01000ec5cf8767e34b3edcdd980 (plain)
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2010 Jan Kara.  All Rights Reserved.
# Copyright (c) 2005 Silicon Graphics, Inc.  All Rights Reserved.
#
# FS QA Test No. 230
#
# Simple quota enforcement test.
#
. ./common/preamble
_begin_fstest auto quota quick

# Import common functions.
. ./common/filter
. ./common/quota

# real QA test starts here
_supported_fs generic
_require_scratch
_require_quota
_require_user

test_files()
{
	echo; echo "### create files, setting up ownership (type=$type)"
	touch $SCRATCH_MNT/file{1,2} 2>/dev/null
	chown $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null
	chgrp $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null
	chmod 777 $SCRATCH_MNT 2>/dev/null
}

test_enforcement()
{
	echo "### some buffered IO (type=$type)"
	echo "--- initiating IO..." >>$seqres.full
	# Firstly fit below block soft limit
	echo "Write 225 blocks..."
	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((225 * $BLOCK_SIZE))' -c fsync \
		$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
		_filter_xfs_io_error | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# Secondly overcome block soft limit
	echo "Rewrite 250 blocks plus 1 byte..."
	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE + 1))' -c fsync \
		$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
		_filter_xfs_io_error | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# Now try to overcome block hardlimit
	# Reset grace time here due to the repquota will invoke Q_SYNC on
	# old quota which may be time consuming on the low speed or busy
	# scratch device that may leed to grace time exceed.
	setquota -$type $qa_user -T $grace $grace $SCRATCH_MNT 2>/dev/null
	echo "Write 250 blocks..."
	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE))' -c fsync \
		$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
		_filter_xfs_io_error | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# Now sleep for grace time and check that softlimit got enforced
	sleep $((grace+1))
	echo "Write 1 block..."
	su $qa_user -c "$XFS_IO_PROG -c 'truncate 0' -c 'pwrite 0 $BLOCK_SIZE' \
		$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
		_filter_xfs_io_error | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# And now the softlimit test for inodes
	# First reset space limits so that we don't have problems with
	# space reservations on XFS
	setquota -$type $qa_user 0 0 3 5 $SCRATCH_MNT
	echo "Touch 3+4"
	su $qa_user -c "touch $SCRATCH_MNT/file3 $SCRATCH_MNT/file4" \
		2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# Try to exceed inode hardlimit
	# Reset grace time here due to the repquota will invoke Q_SYNC on
	# old quota which may be time consuming on the low speed or busy
	# scratch device that may leed to grace time exceed.
	setquota -$type $qa_user -T $grace $grace $SCRATCH_MNT 2>/dev/null
	echo "Touch 5+6"
	su $qa_user -c "touch $SCRATCH_MNT/file5 $SCRATCH_MNT/file6" \
		2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	# Wait and check grace time enforcement
	rm -f $SCRATCH_MNT/file5 >>$seqres.full 2>&1
	sleep $((grace+1))
	echo "Touch 5"
	su $qa_user -c "touch $SCRATCH_MNT/file5" 2>&1 >>$seqres.full |
		_filter_scratch | tee -a $seqres.full
	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
	echo "--- completed IO ($type)" >>$seqres.full
}

cleanup_files()
{
	rm -f $SCRATCH_MNT/file{1,2,3,4,5,6}
}

# real QA test starts here

grace=2

# Test only the quota type specified in each _scratch_mount clause below.
_qmount_option 'defaults'

_scratch_mkfs >> $seqres.full 2>&1
_scratch_mount "-o usrquota,grpquota"
BLOCK_SIZE=$(_get_file_block_size $SCRATCH_MNT)
quotacheck -u -g $SCRATCH_MNT 2>/dev/null
quotaon $SCRATCH_MNT 2>/dev/null
setquota -u $qa_user $((250 * $BLOCK_SIZE / 1024)) \
	 $((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
setquota -u -t $grace $grace $SCRATCH_MNT
setquota -g $qa_user $((250 * $BLOCK_SIZE / 1024)) \
	 $((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
setquota -g -t $grace $grace $SCRATCH_MNT
_scratch_unmount

echo; echo "### test user limit enforcement"
_scratch_mount "-o usrquota"
quotaon $SCRATCH_MNT 2>/dev/null
type=u
test_files
test_enforcement
cleanup_files
_scratch_unmount 2>/dev/null

echo; echo "### test group limit enforcement"
_scratch_mount "-o grpquota"
quotaon $SCRATCH_MNT 2>/dev/null
type=g
test_files
test_enforcement
cleanup_files
_scratch_unmount 2>/dev/null

status=0
exit