Files
apfstests/tests/xfs/513
T
Kaixu Xia c2dd12732f xfs/513: fix the regression caused by mount option uqnoenforce
The mount options uqnoenforce and qnoenforce no longer cause 'usrquota'
to be emitted in /proc/mounts, so there is a regression in xfs/513. Fix
it by using proper output option uqnoenforce.

You'll need kernel commit 237d7887ae72 ("xfs: show the proper user
quota options") to pass the test.

[Eryu: add kernel commit info in commit log]

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2020-12-21 00:18:08 +08:00

341 lines
9.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Red Hat, Inc. All Rights Reserved.
#
# FS QA Test No. 513
#
# XFS mount options sanity check, refer to 'man 5 xfs'.
#
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.*
$UMOUNT_PROG $LOOP_MNT 2>/dev/null
if [ -n "$LOOP_DEV" ];then
_destroy_loop_device $LOOP_DEV 2>/dev/null
fi
if [ -n "$LOOP_SPARE_DEV" ];then
_destroy_loop_device $LOOP_SPARE_DEV 2>/dev/null
fi
rm -f $LOOP_IMG
rm -f $LOOP_SPARE_IMG
rmdir $LOOP_MNT
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
_supported_fs xfs
_require_test
_require_loop
_require_xfs_io_command "falloc"
LOOP_IMG=$TEST_DIR/$seq.dev
LOOP_SPARE_IMG=$TEST_DIR/$seq.logdev
LOOP_MNT=$TEST_DIR/$seq.mnt
echo "** create loop device"
$XFS_IO_PROG -f -c "truncate 32g" $LOOP_IMG
LOOP_DEV=`_create_loop_device $LOOP_IMG`
echo "** create loop log device"
$XFS_IO_PROG -f -c "truncate 1g" $LOOP_SPARE_IMG
LOOP_SPARE_DEV=`_create_loop_device $LOOP_SPARE_IMG`
echo "** create loop mount point"
rmdir $LOOP_MNT 2>/dev/null
mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point"
filter_loop()
{
sed -e "s,\B$LOOP_MNT,LOOP_MNT,g" \
-e "s,\B$LOOP_DEV,LOOP_DEV,g" \
-e "s,\B$LOOP_SPARE_DEV,LOOP_SPARE_DEV,g"
}
filter_xfs_opt()
{
sed -e "s,allocsize=$pagesz,allocsize=PAGESIZE,g"
}
# avoid the effection from MKFS_OPTIONS
MKFS_OPTIONS=""
do_mkfs()
{
echo "FORMAT: $@" | filter_loop | tee -a $seqres.full
$MKFS_XFS_PROG -f $* $LOOP_DEV | _filter_mkfs >>$seqres.full 2>$tmp.mkfs
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
_fail "Fails on _mkfs_dev $* $LOOP_DEV"
fi
. $tmp.mkfs
}
is_dev_mounted()
{
findmnt --source $LOOP_DEV >/dev/null
return $?
}
get_mount_info()
{
findmnt --source $LOOP_DEV -o OPTIONS -n
}
force_unmount()
{
$UMOUNT_PROG $LOOP_MNT >/dev/null 2>&1
}
# _do_test <mount options> <should be mounted?> [<key string> <key should be found?>]
_do_test()
{
local opts="$1"
local mounted="$2" # pass or fail
local key="$3"
local found="$4" # true or false
local rc
local info
# mount test
_mount $LOOP_DEV $LOOP_MNT $opts 2>>$seqres.full
rc=$?
if [ $rc -eq 0 ];then
if [ "${mounted}" = "fail" ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: expect mount to fail, but it succeeded"
return 1
fi
is_dev_mounted
if [ $? -ne 0 ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: fs not mounted even mount return 0"
return 1
fi
else
if [ "${mounted}" = "pass" ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: expect mount to succeed, but it failed"
return 1
fi
is_dev_mounted
if [ $? -eq 0 ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: fs is mounted even mount return non-zero"
return 1
fi
fi
# Skip below checking if "$key" argument isn't specified
if [ -z "$key" ];then
return 0
fi
# Check the mount options after fs mounted.
info=`get_mount_info`
echo ${info} | grep -q "${key}"
rc=$?
if [ $rc -eq 0 ];then
if [ "$found" != "true" ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: expected to find \"$key\" in mount info \"$info\""
return 1
fi
else
if [ "$found" != "false" ];then
echo "[FAILED]: mount $LOOP_DEV $LOOP_MNT $opts"
echo "ERROR: did not expect to find \"$key\" in \"$info\""
return 1
fi
fi
return 0
}
do_test()
{
# Print each argument, include nil ones
echo -n "TEST:" | tee -a $seqres.full
for i in "$@";do
echo -n " \"$i\"" | filter_loop | filter_xfs_opt | tee -a $seqres.full
done
echo | tee -a $seqres.full
# force unmount before testing
force_unmount
_do_test "$@"
# force unmount after testing
force_unmount
}
echo "** start xfs mount testing ..."
# Test allocsize=size
# Valid values for this option are page size (typically 4KiB) through to 1GiB
do_mkfs
pagesz=$(get_page_size)
if [ $pagesz -ge 1024 ];then
pagesz="$((pagesz / 1024))k"
fi
do_test "" pass "allocsize" "false"
do_test "-o allocsize=$pagesz" pass "allocsize=$pagesz" "true"
do_test "-o allocsize=1048576k" pass "allocsize=1048576k" "true"
do_test "-o allocsize=$((dbsize / 2))" fail
do_test "-o allocsize=2g" fail
# Test attr2
do_mkfs -m crc=1
do_test "" pass "attr2" "true"
do_test "-o attr2" pass "attr2" "true"
do_test "-o noattr2" fail
do_mkfs -m crc=0
do_test "" pass "attr2" "true"
do_test "-o attr2" pass "attr2" "true"
do_test "-o noattr2" pass "attr2" "false"
# Test discard
do_mkfs
do_test "" pass "discard" "false"
do_test "-o discard" pass "discard" "true"
do_test "-o nodiscard" pass "discard" "false"
# Test grpid|bsdgroups|nogrpid|sysvgroups
do_test "" pass "grpid" "false"
do_test "-o grpid" pass "grpid" "true"
do_test "-o bsdgroups" pass "grpid" "true"
do_test "-o nogrpid" pass "grpid" "false"
do_test "-o sysvgroups" pass "grpid" "false"
# Test filestreams
do_test "" pass "filestreams" "false"
do_test "-o filestreams" pass "filestreams" "true"
# Test ikeep
do_test "" pass "ikeep" "false"
do_test "-o ikeep" pass "ikeep" "true"
do_test "-o noikeep" pass "ikeep" "false"
# Test inode32|inode64
do_test "" pass "inode64" "true"
do_test "-o inode32" pass "inode32" "true"
do_test "-o inode64" pass "inode64" "true"
# Test largeio
do_test "" pass "largeio" "false"
do_test "-o largeio" pass "largeio" "true"
do_test "-o nolargeio" pass "largeio" "false"
# Test logbufs=value. Valid numbers range from 28 inclusive.
# New kernel (refer to 4f62282a3696 xfs: cleanup xlog_get_iclog_buffer_size)
# prints "logbufs=N" in /proc/mounts, but old kernel not. So the default
# 'display' about logbufs can't be expected, disable this test.
#do_test "" pass "logbufs" "false"
do_test "-o logbufs=8" pass "logbufs=8" "true"
do_test "-o logbufs=2" pass "logbufs=2" "true"
do_test "-o logbufs=1" fail
do_test "-o logbufs=9" fail
do_test "-o logbufs=99999999999999" fail
# Test logbsize=value.
do_mkfs -m crc=1 -l version=2
# New kernel (refer to 4f62282a3696 xfs: cleanup xlog_get_iclog_buffer_size)
# prints "logbsize=N" in /proc/mounts, but old kernel not. So the default
# 'display' about logbsize can't be expected, disable this test.
#do_test "" pass "logbsize" "false"
do_test "-o logbsize=16384" pass "logbsize=16k" "true"
do_test "-o logbsize=16k" pass "logbsize=16k" "true"
do_test "-o logbsize=32k" pass "logbsize=32k" "true"
do_test "-o logbsize=64k" pass "logbsize=64k" "true"
do_test "-o logbsize=128k" pass "logbsize=128k" "true"
do_test "-o logbsize=256k" pass "logbsize=256k" "true"
do_test "-o logbsize=8k" fail
do_test "-o logbsize=512k" fail
do_mkfs -m crc=0 -l version=1
# New kernel (refer to 4f62282a3696 xfs: cleanup xlog_get_iclog_buffer_size)
# prints "logbsize=N" in /proc/mounts, but old kernel not. So the default
# 'display' about logbsize can't be expected, disable this test.
#do_test "" pass "logbsize" "false"
do_test "-o logbsize=16384" pass "logbsize=16k" "true"
do_test "-o logbsize=16k" pass "logbsize=16k" "true"
do_test "-o logbsize=32k" pass "logbsize=32k" "true"
do_test "-o logbsize=64k" fail
# Test logdev
do_mkfs
do_test "" pass "logdev" "false"
do_test "-o logdev=$LOOP_SPARE_DEV" fail
do_mkfs -l logdev=$LOOP_SPARE_DEV
do_test "-o logdev=$LOOP_SPARE_DEV" pass "logdev=$LOOP_SPARE_DEV" "true"
do_test "" fail
# Test noalign
do_mkfs
do_test "" pass "noalign" "false"
do_test "-o noalign" pass "noalign" "true"
# Test norecovery
do_test "" pass "norecovery" "false"
do_test "-o norecovery,ro" pass "norecovery" "true"
do_test "-o norecovery" fail
# Test nouuid
do_test "" pass "nouuid" "false"
do_test "-o nouuid" pass "nouuid" "true"
# Test noquota
do_test "" pass "noquota" "true"
do_test "-o noquota" pass "noquota" "true"
# Test uquota/usrquota/quota/uqnoenforce/qnoenforce
do_test "" pass "usrquota" "false"
do_test "-o uquota" pass "usrquota" "true"
do_test "-o usrquota" pass "usrquota" "true"
do_test "-o quota" pass "usrquota" "true"
do_test "-o uqnoenforce" pass "uqnoenforce" "true"
do_test "-o qnoenforce" pass "uqnoenforce" "true"
# Test gquota/grpquota/gqnoenforce
do_test "" pass "grpquota" "false"
do_test "-o gquota" pass "grpquota" "true"
do_test "-o grpquota" pass "grpquota" "true"
do_test "-o gqnoenforce" pass "gqnoenforce" "true"
# Test pquota/prjquota/pqnoenforce
do_test "" pass "prjquota" "false"
do_test "-o pquota" pass "prjquota" "true"
do_test "-o prjquota" pass "prjquota" "true"
do_test "-o pqnoenforce" pass "pqnoenforce" "true"
# Test sunit=value and swidth=value
do_mkfs -d sunit=128,swidth=128
do_test "-o sunit=8,swidth=8" pass "sunit=8,swidth=8" "true"
do_test "-o sunit=8,swidth=64" pass "sunit=8,swidth=64" "true"
do_test "-o sunit=128,swidth=128" pass "sunit=128,swidth=128" "true"
do_test "-o sunit=256,swidth=256" pass "sunit=256,swidth=256" "true"
do_test "-o sunit=2,swidth=2" fail
# Test swalloc
do_mkfs
do_test "" pass "swalloc" "false"
do_test "-o swalloc" pass "swalloc" "true"
# Test wsync
do_test "" pass "wsync" "false"
do_test "-o wsync" pass "wsync" "true"
echo "** end of testing"
# success, all done
status=0
exit