]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
xfs/157: don't override SCRATCH_{,LOG,RT}DEV
authorChristoph Hellwig <hch@lst.de>
Thu, 18 Dec 2025 07:30:04 +0000 (08:30 +0100)
committerZorro Lang <zlang@kernel.org>
Wed, 31 Dec 2025 21:02:23 +0000 (05:02 +0800)
This tests wants to test various difference device configurations,
and does so by overriding SCRATCH_{,LOG,RT}DEV.  This has two downside:

 1) the actual SCRATCH_{,LOG,RT}DEV configuration is still injected by
    default, thus making the test dependent on that configuration
 2) the MKFS_OPTIONS might not actually be compatible with the
    configuration created

Fix this by open coding the mkfs, db, admin and repair calls and always
run them on the specific configuration.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Zorro Lang <zlang@kernel.org>
tests/xfs/157

index e102a5a10abe4b556bc0eaa11ca1f6c2a0c96ea0..31f05db2572443a25a6c0734a7b688572e4308d4 100755 (executable)
@@ -50,53 +50,105 @@ fake_rtfile=$TEST_DIR/$seq.scratch.rt
 rm -f $fake_rtfile
 truncate -s $fs_size $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
+       dev=$SCRATCH_DEV
+       logdev=
+       rtdev=
+}
+
+_fake_mkfs()
+{
+       OPTIONS="$*"
+       if [ -n "$logdev" ]; then
+               OPTIONS="$OPTIONS -l logdev=$logdev"
+       fi
+       if [ -n "$rtdev" ]; then
+               OPTIONS="$OPTIONS -r rtdev=$rtdev"
+       fi
+       $MKFS_XFS_PROG -f $OPTIONS $dev || _fail "mkfs failed"
+}
+
+_fake_xfs_db_options()
+{
+       OPTIONS=""
+       if [ ! -z "$logdev" ]; then
+               OPTIONS="-l $logdev"
+       fi
+       if [ ! -z "$rtdev" ]; then
+               if [ $XFS_DB_PROG --help 2>&1 | grep -q -- '-R rtdev']; then
+                       OPTIONS="$OPTIONS -R $rtdev"
+               fi
+       fi
+       echo $OPTIONS $* $dev
+}
+
+_fake_xfs_db()
+{
+       $XFS_DB_PROG "$@" $(_fake_xfs_db_options)
+}
+
+_fake_xfs_admin()
+{
+       local options=("$dev")
+       local rt_opts=()
+       if [ -n "$logdev" ]; then
+               options+=("$logdev")
+       fi
+       if [ -n "$rtdev" ]; then
+               $XFS_ADMIN_PROG --help 2>&1 | grep -q 'rtdev' || \
+                       _notrun 'xfs_admin does not support rt devices'
+               rt_opts+=(-r "$rtdev")
+       fi
+
+       # xfs_admin in xfsprogs 5.11 has a bug where an external log device
+       # forces xfs_db to be invoked, potentially with zero command arguments.
+       # When this happens, xfs_db will wait for input on stdin, which causes
+       # fstests to hang.  Since xfs_admin is not an interactive tool, we
+       # can redirect stdin from /dev/null to prevent this issue.
+       $XFS_ADMIN_PROG "${rt_opts[@]}" "$@" "${options[@]}" < /dev/null
+}
+
+
+_fake_xfs_repair()
+{
+       OPTIONS=""
+       if [ -n "$logdev" ]; then
+               OPTIONS="-l $logdev"
+       fi
+       if [ -n "$rtdev" ]; then
+               OPTIONS="$OPTIONS -r $rtdev"
+       fi
+       $XFS_REPAIR_PROG $OPTIONS $* $dev
 }
 
 check_label() {
-       _scratch_mkfs_sized "$fs_size" "" -L oldlabel >> $seqres.full 2>&1
-       _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?"
+       _fake_mkfs -L oldlabel >> $seqres.full 2>&1
+       _fake_xfs_db -c label
+       _fake_xfs_admin -L newlabel "$@" >> $seqres.full
+       _fake_xfs_db -c label
+       _fake_xfs_repair -n &>> $seqres.full || echo "Check failed?"
 }
 
 scenario "S1: Check that label setting with file image"
-SCRATCH_DEV=$fake_datafile
+dev=$fake_datafile
 check_label -f
 
 scenario "S2: Check that setting with logdev works"
-USE_EXTERNAL=yes
-SCRATCH_LOGDEV=$fake_logfile
+logdev=$fake_logfile
 check_label
 
 scenario "S3: Check that setting with rtdev works"
-USE_EXTERNAL=yes
-SCRATCH_RTDEV=$fake_rtfile
+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
+logdev=$fake_logfile
+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"