common/quota: Fix _qmount_options
[xfstests-dev.git] / common / quota
index f01bd068383bcad7aaf12e0dd823eabc3c45cfc3..4e07fef1569794ab29c301ed759ec8b41c3ef4d1 100644 (file)
@@ -1,26 +1,9 @@
 ##/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.
 #
@@ -29,7 +12,7 @@ _require_quota()
     [ -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
@@ -59,7 +42,7 @@ _require_quota()
 #
 _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"
@@ -85,7 +68,8 @@ _require_xfs_quota_foreign()
 }
 
 #
-# 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()
 {
@@ -94,10 +78,21 @@ _require_prjquota()
        dumpe2fs -h $_dev 2>&1 | grep -qw project || \
                _notrun "Project quota not available on this $FSTYP"
     fi
-    src/feature -P $_dev
+    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
+    $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
 }
 
@@ -116,12 +111,17 @@ _require_getnextquota()
 # prior to mount.  This is a relatively new feature ...
 _scratch_enable_pquota()
 {
-       [[ "$FSTYP" != ext[234] ]] && return
-
-       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
+       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
 }
 
 #
@@ -229,10 +229,10 @@ _qmount_option()
        export MOUNT_OPTIONS=`echo $MOUNT_OPTIONS \
        | sed   -e 's/uquota/QUOTA/g'      \
                -e 's/usrquota/QUOTA/g'    \
-               -e 's/usrjquota=[^, ]/QUOTA/g' \
+               -e 's/usrjquota=[^, ]*/QUOTA/g' \
                -e 's/gquota/QUOTA/g'      \
                -e 's/grpquota/QUOTA/g'    \
-               -e 's/grpjquota=[^, ]/QUOTA/g' \
+               -e 's/grpjquota=[^, ]*/QUOTA/g' \
                -e 's/\bpquota/QUOTA/g'    \
                -e 's/prjquota/QUOTA/g'    \
                -e 's/quota/QUOTA/g'       \
@@ -265,15 +265,15 @@ _check_quota_usage()
 
        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)
-               # Clear out speculative preallocations to eliminate them
-               # as a source of intermittent orig/checked differences.
-               test -x "$XFS_SPACEMAN_PROG" && \
-                       "$XFS_SPACEMAN_PROG" -c 'prealloc -s' $SCRATCH_MNT
+               # 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"
                ;;
        *)
                ;;
@@ -308,12 +308,12 @@ _check_quota_usage()
 
 # 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}'
+       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}'
+       repquota $1 | egrep "^($qa_user|root|nobody)" | awk '{print $1, $6, $7, $8}' | sort -r
 }
 
 # make sure this script returns success