blob: 74988090893c459d0299ceca0273d162ecd2a335 [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 144
#
# Check that quota softlimit warnings work the way they should. This means
# that we can disobey the softlimit up to warnlimit times before it turns into
# hard(er) enforcement. This is a functional test for quota warnings, but
# since the functionality has been broken for decades, this is also a
# regression test for commit 4b8628d57b72 ("xfs: actually bump warning counts
# when we send warnings").
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/quota
# real QA test starts here
_supported_fs xfs
_require_xfs_quota
_require_scratch
rm -f $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
_qsetup $1
echo "Using type=$type id=$id" >>$seqres.full
echo
echo "*** report initial settings" | tee -a $seqres.full
$XFS_QUOTA_PROG -x \
-c "limit -$type isoft=3 ihard=500000 $id" \
-c "warn -$type -i -d 13" \
$SCRATCH_DEV
$XFS_QUOTA_PROG -x \
-c "state -$type" >> $seqres.full
$XFS_QUOTA_PROG -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_quota_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** push past the soft inode limit" | tee -a $seqres.full
_file_as_id $SCRATCH_MNT/softok1 $id $type $bsize 0
_file_as_id $SCRATCH_MNT/softok2 $id $type $bsize 0
_file_as_id $SCRATCH_MNT/softok3 $id $type $bsize 0
_file_as_id $SCRATCH_MNT/softwarn1 $id $type $bsize 0
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_quota_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** push further past the soft inode limit" | tee -a $seqres.full
for warn_nr in $(seq 2 5); do
_file_as_id $SCRATCH_MNT/softwarn$warn_nr $id $type $bsize 0
done
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_quota_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** push past the soft inode warning limit" | tee -a $seqres.full
for warn_nr in $(seq 6 15); do
_file_as_id $SCRATCH_MNT/softwarn$warn_nr $id $type $bsize 0
done
$XFS_QUOTA_PROG -D $tmp.projects -P $tmp.projid -x \
-c "repquota -birnN -$type" $SCRATCH_DEV |
_filter_quota_report | LC_COLLATE=POSIX sort -ru
echo
echo "*** unmount"
_scratch_unmount
}
_scratch_mkfs > $seqres.full
_scratch_mount >> $seqres.full
chmod a+rwx $SCRATCH_MNT $seqres.full # arbitrary users will write here
bsize=$(_get_file_block_size $SCRATCH_MNT)
_scratch_unmount
cat >$tmp.projects <<EOF
1:$SCRATCH_MNT
EOF
cat >$tmp.projid <<EOF
root:0
scratch: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