Files
apfstests/tests/xfs/050
T
Darrick J. Wong e5bbd47e7c xfs/{050,299}: clear quota warnings in between checks
Both of these quota tests contain the output of the xfs_quota repquota
command in the golden output.  Unfortunately, the output was recorded
before quota soft warnings were implemented, which means they'll regress
the output when we make quota warning work.  Fix this by resetting the
warning count to zero before generating output.

While we're at it, use $XFS_QUOTA_PROG instead of xfs_quota.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2020-08-09 23:52:46 +08:00

245 lines
6.1 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
#
# FS QA Test No. 050
#
# Exercises basic XFS quota functionality
# uquota, gquota, uqnoenforce, gqnoenforce, pquota, pqnoenforce
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/quota
_cleanup()
{
cd /
_scratch_unmount 2>/dev/null
rm -f $tmp.*
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# real QA test starts here
_supported_fs xfs
_supported_os Linux
cp /dev/null $seqres.full
chmod a+rwx $seqres.full # arbitrary users will write here
_require_scratch
_require_xfs_quota
_scratch_mkfs >/dev/null 2>&1
_scratch_mount
bsize=$(_get_file_block_size $SCRATCH_MNT)
_scratch_unmount
bsoft=$(( 200 * $bsize ))
bhard=$(( 1000 * $bsize ))
isoft=4
ihard=10
_filter_report()
{
tr -s '[:space:]' | \
perl -npe '
s/^\#'$id' /[NAME] /g;
s/^\#0 \d+ /[ROOT] 0 /g;
s/6 days/7 days/g' |
perl -npe '
$val = 0;
if ($ENV{'LARGE_SCRATCH_DEV'}) {
$val = $ENV{'NUM_SPACE_FILES'};
}
s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g' |
sed -e 's/ 65535 \[--------\]/ 00 \[--------\]/g' |
perl -npe '
s|^(.*?) (\d+) (\d+) (\d+)|$1 @{[$2 * 1024 /'$bsize']} @{[$3 * 1024 /'$bsize']} @{[$4 * 1024 /'$bsize']}|'
}
# The actual point at which limit enforcement takes place for the
# hard block limit is variable depending on filesystem blocksize,
# and iosize. What we want to test is that the limit is enforced
# (ie. blksize less than limit but not unduly less - ~85% is kind)
# nowadays we actually get much closer to the limit before EDQUOT.
#
_filter_and_check_blks()
{
perl -npe '
if (/^\#'$id'\s+(\d+)/ && '$enforce') {
$maximum = '$bhard';
$minimum = '$bhard' * 85/100;
$used = $1 * 1024;
if (($used < $minimum || $used > $maximum) && '$noextsz') {
printf(" URK %d: %d is out of range! [%d,%d]\n",
'$id', $used, $minimum, $maximum);
}
s/^(\#'$id'\s+)(\d+)/\1 =OK=/g;
}
' | _filter_report
}
_qsetup()
{
opt=$1
enforce=0
if [ $opt = "u" -o $opt = "uno" ]; then
type=u
eval `_choose_uid`
elif [ $opt = "g" -o $opt = "gno" ]; then
type=g
eval `_choose_gid`
elif [ $opt = "p" -o $opt = "pno" ]; then
type=p
eval `_choose_prid`
fi
[ $opt = "u" -o $opt = "g" -o $opt = "p" ] && enforce=1
echo "Using type=$type id=$id" >> $seqres.full
}
_exercise()
{
_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs
cat $tmp.mkfs >>$seqres.full
# keep the blocksize and data size for dd later
. $tmp.mkfs
_qmount
# Figure out whether we're doing large allocations
# (bail out if they're so large they stuff the test up)
_test_inode_flag extsz-inherit $SCRATCH_MNT
noextsz=$?
extsize=`_test_inode_extsz $SCRATCH_MNT`
[ $extsize -ge 512000 ] && \
_notrun "Extent size hint is too large ($extsize bytes)"
_qsetup $1
echo "Using type=$type id=$id" >>$seqres.full
$XFS_QUOTA_PROG -x -c "warn -$type 65535 -d" $SCRATCH_DEV
echo
echo "*** report no quota settings" | tee -a $seqres.full
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** report initial settings" | tee -a $seqres.full
_file_as_id $SCRATCH_MNT/initme $id $type 1024 0
echo "ls -l $SCRATCH_MNT" >>$seqres.full
ls -l $SCRATCH_MNT >>$seqres.full
$XFS_QUOTA_PROG -D $tmp.projects -P $temp.projid -x \
-c "limit -$type bsoft=${bsoft} bhard=${bhard} $id" \
-c "limit -$type isoft=$isoft ihard=$ihard $id" \
$SCRATCH_DEV
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** push past the soft inode limit" | tee -a $seqres.full
_file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0
_file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0
_file_as_id $SCRATCH_MNT/softie3 $id $type 1024 0
_file_as_id $SCRATCH_MNT/softie4 $id $type 1024 0
_qmount
$XFS_QUOTA_PROG -x -c "warn -i -$type 0 $id" $SCRATCH_DEV
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** push past the soft block limit" | tee -a $seqres.full
_file_as_id $SCRATCH_MNT/softie $id $type $bsize 300
_qmount
$XFS_QUOTA_PROG -x -c "warn -i -$type 0 $id" \
-c "warn -b -$type 0 $id" $SCRATCH_DEV
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_report | LC_COLLATE=POSIX sort -ru
echo
# Note: for quota accounting (not enforcement), EDQUOT is not expected
echo "*** push past the hard inode limit (expect EDQUOT)" | tee -a $seqres.full
for i in 1 2 3 4 5 6 7 8 9 10 11 12
do
_file_as_id $SCRATCH_MNT/hard$i $id $type 1024 0
done
_qmount
$XFS_QUOTA_PROG -x -c "warn -b -$type 0 $id" \
-c "warn -i -$type 0 $id" $SCRATCH_DEV
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_report | LC_COLLATE=POSIX sort -ru
echo
# Note: for quota accounting (not enforcement), EDQUOT is not expected
echo "*** push past the hard block limit (expect EDQUOT)" | tee -a $seqres.full
_file_as_id $SCRATCH_MNT/softie $id $type $bsize 1200
echo "ls -l $SCRATCH_MNT" >>$seqres.full
ls -l $SCRATCH_MNT >>$seqres.full
_qmount
$XFS_QUOTA_PROG -x -c "warn -b -$type 0 $id" $SCRATCH_DEV
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_and_check_blks | LC_COLLATE=POSIX sort -ru
echo
echo "*** unmount"
_scratch_unmount
}
cat >$tmp.projects <<EOF
1:$SCRATCH_MNT
EOF
cat >$tmp.projid <<EOF
root:0
scrach:1
EOF
projid_file="$tmp.projid"
echo "*** user"
_qmount_option "uquota"
_exercise u
echo "*** group"
_qmount_option "gquota"
_exercise g
echo "*** uqnoenforce"
_qmount_option "uqnoenforce"
_exercise uno
echo "*** gqnoenforce"
_qmount_option "gqnoenforce"
_exercise gno
echo "*** pquota"
_qmount_option "pquota"
_exercise p
echo "*** pqnoenforce"
_qmount_option "pqnoenforce"
_exercise pno
# success, all done
status=0
exit