##/bin/bash
-#
-# Copyright (c) 2000-2001,2005 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
-#
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. All Rights Reserved.
#
# Functions useful for quota tests
-#
-#
# checks that the generic quota support in the kernel is enabled
# and that we have valid quota user tools installed.
#
[ -n "$QUOTA_PROG" ] || _notrun "Quota user tools not installed"
case $FSTYP in
- ext2|ext3|ext4|ext4dev|reiserfs)
+ ext2|ext3|ext4|ext4dev|f2fs|reiserfs)
if [ ! -d /proc/sys/fs/quota ]; then
_notrun "Installed kernel does not support quotas"
fi
;;
- gfs2)
+ gfs2|ocfs2)
;;
xfs)
if [ ! -f /proc/fs/xfs/xqmstat ]; then
_notrun "disk quotas not supported by this filesystem type: $FSTYP"
;;
esac
-
- # SELinux adds extra xattrs which can mess up our expected output.
- # So, mount with a context, and they won't be created
- # nfs_t is a "liberal" context so we can use it.
- if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then
- export SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0"
- fi
}
#
#
_require_xfs_quota()
{
- src/feature -q $TEST_DEV
+ $here/src/feature -q $TEST_DEV
[ $? -ne 0 ] && _notrun "Installed kernel does not support XFS quota"
if [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_RTDEV" ]; then
_notrun "Quotas not supported on realtime test device"
}
#
-# checks that the project quota support in the kernel is enabled.
+# Checks that the project quota support in the kernel is enabled.
+# The device must be mounted for detection to work properly.
#
_require_prjquota()
{
[ -n "$1" ] && _dev="$1" || _dev="$TEST_DEV"
- if [ "$FSTYP" == "ext4" ]; then
+ if [[ "$FSTYP" == ext[234] ]]; then
dumpe2fs -h $_dev 2>&1 | grep -qw project || \
- _notrun "Project quota not available on this ext4"
+ _notrun "Project quota not available on this $FSTYP"
+ fi
+ if [ "$FSTYP" == "f2fs" ]; then
+ dump.f2fs $_dev 2>&1 | grep -qw project_quota
+ [ $? -ne 0 ] && _notrun "Project quota not enabled in this device $_dev"
+ dump.f2fs $_dev 2>&1 | grep -qw quota_ino
+ [ $? -ne 0 ] && _notrun "quota sysfile not enabled in this device $_dev"
+ cat /sys/fs/f2fs/features/project_quota | grep -qw supported
+ [ $? -ne 0 ] && _notrun "Installed kernel does not support project quotas"
+ return
fi
- src/feature -P $_dev
+ $here/src/feature -P $_dev
[ $? -ne 0 ] && _notrun "Installed kernel does not support project quotas"
- if [ "$USE_EXTERNAL" = yes -a ! -z "$_dev" ]; then
- _notrun "Project quotas not supported on realtime filesystem"
+ if [ "$USE_EXTERNAL" = yes ]; then
+ if [ -n "$TEST_RTDEV" -o -n "$SCRATCH_RTDEV" ]; then
+ _notrun "Project quotas not supported on realtime filesystem"
+ fi
fi
}
+#
+# Do we have GETNEXTQUOTA? Querying ID 0 should work.
+#
+_require_getnextquota()
+{
+ _require_test_program "test-nextquota"
+ $here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
+ _notrun "No GETNEXTQUOTA support"
+}
+
#
# ext4 (for now) is unique in that we must enable the project quota feature
# prior to mount. This is a relatively new feature ...
_scratch_enable_pquota()
{
- [ "$FSTYP" != "ext4" ] && return
-
- tune2fs -O quota,project $SCRATCH_DEV >>$seqres.full 2>&1
+ case $FSTYP in
+ ext2|ext3|ext4)
+ tune2fs -O quota,project $SCRATCH_DEV >>$seqres.full 2>&1
+ _try_scratch_mount >/dev/null 2>&1 \
+ || _notrun "kernel doesn't support project feature on $FSTYP"
+ _scratch_unmount
+ ;;
+ f2fs)
+ _scratch_mkfs "-O extra_attr -O quota -O project_quota" >> $seqres.full 2>&1
+ ;;
+ esac
}
#
parent=`dirname $1`
if [ $3 = p ]; then
- echo PARENT: xfs_io -r -c "chproj $2" -c "chattr +P" $parent >>$seqres.full
+ echo PARENT: $XFS_IO_PROG -r -c "chproj $2" -c "chattr +P" $parent >>$seqres.full
$XFS_IO_PROG -r -c "chproj $2" -c "chattr +P" $parent >>$seqres.full 2>&1
magik='$>' # (irrelevent, above set projid-inherit-on-parent)
elif [ $3 = u ]; then
# exec "dd if=/dev/zero of=$1 bs=$4 count=$5 >>$seqres.full 2>&1";
if [ $3 = p ]; then
- echo PARENT: xfs_io -r -c "chproj 0" -c "chattr -P" $parent >>$seqres.full
+ echo PARENT: $XFS_IO_PROG -r -c "chproj 0" -c "chattr -P" $parent >>$seqres.full
$XFS_IO_PROG -r -c "chproj 0" -c "chattr -P" $parent >>$seqres.full 2>&1
fi
}
_qmount()
{
_scratch_unmount >/dev/null 2>&1
- _scratch_mount || _fail "qmount failed"
+ _try_scratch_mount || _fail "qmount failed"
# xfs doesn't need these setups and quotacheck even fails on xfs
# redirect the output to $seqres.full for debug purpose and ignore results
if [ "$FSTYP" != "xfs" ]; then
export MOUNT_OPTIONS=`echo $MOUNT_OPTIONS \
| sed -e 's/uquota/QUOTA/g' \
-e 's/usrquota/QUOTA/g' \
+ -e 's/usrjquota=[^, ]*/QUOTA/g' \
-e 's/gquota/QUOTA/g' \
-e 's/grpquota/QUOTA/g' \
+ -e 's/grpjquota=[^, ]*/QUOTA/g' \
-e 's/\bpquota/QUOTA/g' \
-e 's/prjquota/QUOTA/g' \
-e 's/quota/QUOTA/g' \
# ext4 doesn't _do_ "-o pquota/prjquota" because reasons
# Switch it to "quota" to enable mkfs-time pquota
- if [ "$FSTYP" == "ext4" ]; then
+ if [[ "$FSTYP" == ext[234] ]]; then
OPTS=`echo $OPTS \
| sed -e 's/\bpquota/quota/g' \
-e 's/prjquota/quota/g'`
VFS_QUOTA=0
case $FSTYP in
- ext2|ext3|ext4|ext4dev|reiserfs|gfs2)
+ ext2|ext3|ext4|ext4dev|f2fs|reiserfs|gfs2)
VFS_QUOTA=1
quotaon -f -u -g $SCRATCH_MNT 2>/dev/null
;;
+ xfs)
+ # Only way to make this reliable with cow/delalloc/speculative
+ # preallocations is to unmount and remount the whole mess...
+ _scratch_unmount
+ _scratch_mount "-o usrquota,grpquota"
+ ;;
*)
;;
esac
}
}
+# Report the block usage of root, $qa_user, and nobody
+_report_quota_blocks() {
+ repquota $1 | egrep "^($qa_user|root|nobody)" | awk '{print $1, $3, $4, $5}' | sort -r
+}
+
+# Report the inode usage of root, $qa_user, and nobody
+_report_quota_inodes() {
+ repquota $1 | egrep "^($qa_user|root|nobody)" | awk '{print $1, $6, $7, $8}' | sort -r
+}
+
# make sure this script returns success
/bin/true