xfs: functional testing of V5-relevant options

Currently, the only functional testing for xfs_admin is xfs/287, which
checks that one can add 32-bit project ids to a V4 filesystem.  This
obviously isn't an exhaustive test of all the CLI arguments, and
historically there have been xfs configurations that don't even work.

Therefore, introduce a couple of new tests -- one that will test the
simple options with the default configuration, and a second test that
steps a bit outside of the test run configuration to make sure that we
do the right thing for external devices.  The second test already caught
a nasty bug in xfsprogs 5.11.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Darrick J. Wong
2021-04-21 17:51:27 -07:00
committed by Eryu Guan
parent af7ac9448f
commit 8fb042e54e
6 changed files with 255 additions and 0 deletions
+10
View File
@@ -1143,3 +1143,13 @@ _check_scratch_xfs_features()
echo "${output[@]}"
test "${found}" -eq "$#"
}
# Decide if xfs_repair knows how to set (or clear) a filesystem feature.
_require_xfs_repair_upgrade()
{
local type="$1"
$XFS_REPAIR_PROG -c "$type=garbagevalue" 2>&1 | \
grep -q 'unknown option' && \
_notrun "xfs_repair does not support upgrading fs with $type"
}
Executable
+93
View File
@@ -0,0 +1,93 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 156
#
# Functional testing for xfs_admin to make sure that it handles option parsing
# correctly for functionality that's relevant to V5 filesystems. It doesn't
# test the options that apply only to V4 filesystems because that disk format
# is deprecated.
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
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_command "$XFS_ADMIN_PROG" "xfs_admin"
rm -f $seqres.full
note() {
echo "$@" | tee -a $seqres.full
}
note "S0: Initialize filesystem"
_scratch_mkfs -L origlabel -m uuid=babababa-baba-baba-baba-babababababa >> $seqres.full
_scratch_xfs_db -c label -c uuid
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S1: Set a filesystem label"
_scratch_xfs_admin -L newlabel >> $seqres.full
_scratch_xfs_db -c label
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S2: Clear filesystem label"
_scratch_xfs_admin -L -- >> $seqres.full
_scratch_xfs_db -c label
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S3: Try to set oversized label"
_scratch_xfs_admin -L thisismuchtoolongforxfstohandle >> $seqres.full
_scratch_xfs_db -c label
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S4: Set filesystem UUID"
_scratch_xfs_admin -U deaddead-dead-dead-dead-deaddeaddead >> $seqres.full
_scratch_xfs_db -c uuid
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S5: Zero out filesystem UUID"
_scratch_xfs_admin -U nil >> $seqres.full
_scratch_xfs_db -c uuid
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S6: Randomize filesystem UUID"
old_uuid="$(_scratch_xfs_db -c uuid)"
_scratch_xfs_admin -U generate >> $seqres.full
new_uuid="$(_scratch_xfs_db -c uuid)"
if [ "$new_uuid" = "$old_uuid" ]; then
echo "UUID randomization failed? $old_uuid == $new_uuid"
fi
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
note "S7: Restore original filesystem UUID"
if _check_scratch_xfs_features V5 >/dev/null; then
# Only V5 supports the metauuid feature that enables us to restore the
# original UUID after a change.
_scratch_xfs_admin -U restore >> $seqres.full
_scratch_xfs_db -c uuid
else
echo "UUID = babababa-baba-baba-baba-babababababa"
fi
# success, all done
status=0
exit
+17
View File
@@ -0,0 +1,17 @@
QA output created by 156
S0: Initialize filesystem
label = "origlabel"
UUID = babababa-baba-baba-baba-babababababa
S1: Set a filesystem label
label = "newlabel"
S2: Clear filesystem label
label = ""
S3: Try to set oversized label
label = "thisismuchto"
S4: Set filesystem UUID
UUID = deaddead-dead-dead-dead-deaddeaddead
S5: Zero out filesystem UUID
UUID = 00000000-0000-0000-0000-000000000000
S6: Randomize filesystem UUID
S7: Restore original filesystem UUID
UUID = babababa-baba-baba-baba-babababababa
Executable
+114
View File
@@ -0,0 +1,114 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 157
#
# Functional testing for xfs_admin to ensure that it parses arguments correctly
# with regards to data devices that are files, external logs, and realtime
# devices.
#
# Because this test synthesizes log and rt devices (by modifying the test run
# configuration), it does /not/ require the ability to mount the scratch
# filesystem. This increases test coverage while isolating the weird bits to a
# single test.
#
# This is partially a regression test for "xfs_admin: pick up log arguments
# correctly", insofar as the issue fixed by that patch was discovered with an
# earlier revision of this test.
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.* $fake_logfile $fake_rtfile $fake_datafile
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs xfs
_require_test
_require_scratch_nocheck
_require_command "$XFS_ADMIN_PROG" "xfs_admin"
rm -f $seqres.full
# Create some fake sparse files for testing external devices and whatnot
fake_datafile=$TEST_DIR/$seq.scratch.data
rm -f $fake_datafile
truncate -s 500m $fake_datafile
fake_logfile=$TEST_DIR/$seq.scratch.log
rm -f $fake_logfile
truncate -s 500m $fake_logfile
fake_rtfile=$TEST_DIR/$seq.scratch.rt
rm -f $fake_rtfile
truncate -s 500m $fake_rtfile
# Save the original variables
orig_ddev=$SCRATCH_DEV
orig_external=$USE_EXTERNAL
orig_logdev=$SCRATCH_LOGDEV
orig_rtdev=$SCRATCH_RTDEV
scenario() {
echo "$@" | tee -a $seqres.full
SCRATCH_DEV=$orig_ddev
USE_EXTERNAL=$orig_external
SCRATCH_LOGDEV=$orig_logdev
SCRATCH_RTDEV=$orig_rtdev
}
check_label() {
_scratch_mkfs -L oldlabel >> $seqres.full
_scratch_xfs_db -c label
_scratch_xfs_admin -L newlabel "$@" >> $seqres.full
_scratch_xfs_db -c label
_scratch_xfs_repair -n &>> $seqres.full || echo "Check failed?"
}
scenario "S1: Check that label setting with file image"
SCRATCH_DEV=$fake_datafile
check_label -f
scenario "S2: Check that setting with logdev works"
USE_EXTERNAL=yes
SCRATCH_LOGDEV=$fake_logfile
check_label
scenario "S3: Check that setting with rtdev works"
USE_EXTERNAL=yes
SCRATCH_RTDEV=$fake_rtfile
check_label
scenario "S4: Check that setting with rtdev + logdev works"
USE_EXTERNAL=yes
SCRATCH_LOGDEV=$fake_logfile
SCRATCH_RTDEV=$fake_rtfile
check_label
scenario "S5: Check that setting with nortdev + nologdev works"
USE_EXTERNAL=
SCRATCH_LOGDEV=
SCRATCH_RTDEV=
check_label
scenario "S6: Check that setting with bdev incorrectly flagged as file works"
check_label -f
# success, all done
status=0
exit
+19
View File
@@ -0,0 +1,19 @@
QA output created by 157
S1: Check that label setting with file image
label = "oldlabel"
label = "newlabel"
S2: Check that setting with logdev works
label = "oldlabel"
label = "newlabel"
S3: Check that setting with rtdev works
label = "oldlabel"
label = "newlabel"
S4: Check that setting with rtdev + logdev works
label = "oldlabel"
label = "newlabel"
S5: Check that setting with nortdev + nologdev works
label = "oldlabel"
label = "newlabel"
S6: Check that setting with bdev incorrectly flagged as file works
label = "oldlabel"
label = "newlabel"
+2
View File
@@ -153,6 +153,8 @@
153 auto quick quota idmapped
154 auto quick repair
155 auto repair
156 auto quick admin
157 auto quick admin
164 rw pattern auto prealloc quick
165 rw pattern auto prealloc quick
166 rw metadata auto quick