#! /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").

. ./common/preamble
_begin_fstest auto quick quota

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

# real QA test starts here
_supported_fs xfs
_require_xfs_quota
_require_scratch

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
