#! /bin/bash
# FS QA Test No. 050
#
# Exercises basic XFS quota functionality
#       uquota, gquota, uqnoenforce, gqnoenforce, pquota, pqnoenforce
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#-----------------------------------------------------------------------
#
# creator
owner=nathans@sgi.com

seq=`basename $0`
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 /
	umount $SCRATCH_MNT 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 IRIX


cp /dev/null $seq.full
chmod a+rwx $seq.full	# arbitrary users will write here

_require_scratch
_require_xfs_quota

bsoft=100
bhard=500
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'
}

# 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;
			if (($1 < $minimum || $1 > $maximum) && '$noextsz') {
				printf(" URK %d: %d is out of range! [%d,%d]\n",
					'$id', $1, $minimum, $maximum);
			}
			s/^(\#'$id'\s+)(\d+)/\1 =OK=/g;
		}
	' | _filter_report
}

_exercise()
{
	_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs
	cat $tmp.mkfs >>$seq.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

	echo "Using output from '" `ls -l $seq.out` "'" >>$seq.full
	echo "and using type=$type id=$id" >>$seq.full

	echo
	echo "*** report no quota settings" | tee -a $seq.full
	xfs_quota -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 $seq.full
	_file_as_id $SCRATCH_MNT/initme $id $type 1024 0
	echo "ls -l $SCRATCH_MNT" >>$seq.full
	ls -l $SCRATCH_MNT >>$seq.full
	xfs_quota -D $tmp.projects -P $temp.projid -x \
		-c "limit -$type bsoft=${bsoft}k bhard=${bhard}k $id" \
		-c "limit -$type isoft=$isoft ihard=$ihard $id" \
		$SCRATCH_DEV
	xfs_quota -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 $seq.full
	_file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0
	_file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0
	_qmount
	xfs_quota -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 $seq.full
	_file_as_id $SCRATCH_MNT/softie $id $type 1024 140
	_qmount
	xfs_quota -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 $seq.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 -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 $seq.full
	_file_as_id $SCRATCH_MNT/softie $id $type 1024 540
	echo "ls -l $SCRATCH_MNT" >>$seq.full
	ls -l $SCRATCH_MNT >>$seq.full
	_qmount
	xfs_quota -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"
	umount $SCRATCH_MNT

}

cat >$tmp.projects <<EOF
1:$SCRATCH_MNT
EOF

cat >$tmp.projid <<EOF
root:0
scrach:1
EOF

projid_file="$tmp.projid"

echo "*** user"
if [ "$HOSTOS" == "IRIX" ]
then
	_qmount_option "quota"
else
	_qmount_option "uquota"
fi
_exercise

echo "*** group"
_qmount_option "gquota"
_exercise

echo "*** uqnoenforce"
if [ "$HOSTOS" == "IRIX" ]
then
	_qmount_option "qnoenforce"
else
	_qmount_option "uqnoenforce"
fi
_exercise

echo "*** gqnoenforce"
_qmount_option "gqnoenforce"
_exercise

echo "*** pquota"
_qmount_option "pquota"
_exercise

echo "*** pqnoenforce"
_qmount_option "pqnoenforce"
_exercise

# success, all done
status=0
exit
