xfs: test X_QUOTARM functionality

The Q_XQUOTARM quotactl was not working properly, because
we weren't passing in proper flags.  The xfs_fs_set_xstate()
ioctl handler used the same flags for Q_XQUOTAON/OFF as
well as Q_XQUOTARM, but Q_XQUOTAON/OFF look for
XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc,
i.e. quota type + state, while Q_XQUOTARM looks only for
the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc.

Unfortunately these flag spaces overlap a bit, so we
got semi-random results for Q_XQUOTARM; i.e. the value
for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc.  yeargh.

Anyway, here's a simple test that demonstrates it,
kernel patch to fix it will follow.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Eric Sandeen
2014-04-22 10:47:28 +10:00
committed by Dave Chinner
parent 35ee39228b
commit de876b996a
3 changed files with 90 additions and 0 deletions
Executable
+79
View File
@@ -0,0 +1,79 @@
#! /bin/bash
# FS QA Test No. xfs/007
#
# Test to verify Q_XQUOTARM functionality.
#
#-----------------------------------------------------------------------
# Copyright (c) 2014 Red Hat, 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
#-----------------------------------------------------------------------
#
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
# Modify as appropriate.
_supported_fs xfs
_supported_os Linux Irix
_require_scratch
_require_xfs_quota
_scratch_mkfs_xfs >/dev/null 2>&1
_qmount_option "uquota,gquota"
_qmount
echo "*** umount"
umount $SCRATCH_MNT
UQUOTINO=`xfs_db -c "sb 0" -c "p" $SCRATCH_DEV | grep uquotino | awk '{print $NF}'`
GQUOTINO=`xfs_db -c "sb 0" -c "p" $SCRATCH_DEV | grep gquotino | awk '{print $NF}'`
echo "*** Usage before quotarm ***"
xfs_db -c "inode $UQUOTINO" -c "p core.nblocks" $SCRATCH_DEV
xfs_db -c "inode $GQUOTINO" -c "p core.nblocks" $SCRATCH_DEV
_qmount
echo "*** turn off user and group quotas"
xfs_quota -x -c 'off -ug' $SCRATCH_MNT
xfs_quota -x -c "remove -ug" $SCRATCH_MNT
echo "*** umount"
umount $SCRATCH_MNT
echo "*** Usage after quotarm ***"
xfs_db -c "inode $UQUOTINO" -c "p core.nblocks" $SCRATCH_DEV
xfs_db -c "inode $GQUOTINO" -c "p core.nblocks" $SCRATCH_DEV
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 007
*** umount
*** Usage before quotarm ***
core.nblocks = 1
core.nblocks = 1
*** turn off user and group quotas
*** umount
*** Usage after quotarm ***
core.nblocks = 0
core.nblocks = 0
+1
View File
@@ -4,6 +4,7 @@
004 db auto quick 004 db auto quick
005 auto quick 005 auto quick
006 auto dir 006 auto dir
007 auto quota quick
008 rw ioctl auto quick 008 rw ioctl auto quick
009 rw ioctl auto prealloc quick 009 rw ioctl auto prealloc quick
012 rw auto quick 012 rw auto quick