From: Christoph Hellwig Date: Thu, 18 Dec 2025 07:30:03 +0000 (+0100) Subject: generic/590: split XFS RT specific bits out X-Git-Tag: v2026.01.05~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=901f00980f0e0cc28d15e9a4865d1a58d8c35af5;p=xfstests-dev.git generic/590: split XFS RT specific bits out Currently generic/590 runs a very different test on XFS that creates a lot device and so on. Split that out into a new XFS-specific test, and let generic/590 always run using the file system parameter specified in the config even for XFS. Signed-off-by: Christoph Hellwig Reviewed-by: Anand Jain Reviewed-by: Darrick J. Wong Signed-off-by: Zorro Lang --- diff --git a/tests/generic/590 b/tests/generic/590 index ba1337a8..54c26f2a 100755 --- a/tests/generic/590 +++ b/tests/generic/590 @@ -4,27 +4,15 @@ # # FS QA Test 590 # -# Test commit 0c4da70c83d4 ("xfs: fix realtime file data space leak") and -# 69ffe5960df1 ("xfs: don't check for AG deadlock for realtime files in -# bunmapi"). On XFS without the fixes, truncate will hang forever. On other -# filesystems, this just tests writing into big fallocates. +# Tests writing into big fallocates. +# +# Based on an XFS RT subvolume specific test now split into xfs/650. # . ./common/preamble _begin_fstest auto prealloc preallocrw -# Override the default cleanup function. -_cleanup() -{ - _scratch_unmount &>/dev/null - [ -n "$loop_dev" ] && _destroy_loop_device $loop_dev - cd / - rm -f $tmp.* - rm -f "$TEST_DIR/$seq" -} - . ./common/filter -_require_scratch_nocheck _require_xfs_io_command "falloc" maxextlen=$((0x1fffff)) @@ -32,54 +20,7 @@ bs=4096 rextsize=4 filesz=$(((maxextlen + 1) * bs)) -must_disable_feature() { - local feat="$1" - - # If mkfs doesn't know about the feature, we don't need to disable it - $MKFS_XFS_PROG --help 2>&1 | grep -q "${feat}=0" || return 1 - - # If turning the feature on works, we don't need to disable it - _scratch_mkfs_xfs_supported -m "${feat}=1" "${disabled_features[@]}" \ - > /dev/null 2>&1 && return 1 - - # Otherwise mkfs knows of the feature and formatting with it failed, - # so we do need to mask it. - return 0 -} - -extra_options="" -# If we're testing XFS, set up the realtime device to reproduce the bug. -if [[ $FSTYP = xfs ]]; then - # If we don't have a realtime device, set up a loop device on the test - # filesystem. - if [[ $USE_EXTERNAL != yes || -z $SCRATCH_RTDEV ]]; then - _require_test - loopsz="$((filesz + (1 << 26)))" - _require_fs_space "$TEST_DIR" $((loopsz / 1024)) - $XFS_IO_PROG -c "truncate $loopsz" -f "$TEST_DIR/$seq" - loop_dev="$(_create_loop_device "$TEST_DIR/$seq")" - USE_EXTERNAL=yes - SCRATCH_RTDEV="$loop_dev" - disabled_features=() - - # disable reflink if not supported by realtime devices - must_disable_feature reflink && - disabled_features=(-m reflink=0) - - # disable rmap if not supported by realtime devices - must_disable_feature rmapbt && - disabled_features+=(-m rmapbt=0) - fi - extra_options="$extra_options -r extsize=$((bs * rextsize))" - extra_options="$extra_options -d agsize=$(((maxextlen + 1) * bs / 2)),rtinherit=1" - - _scratch_mkfs $extra_options "${disabled_features[@]}" >>$seqres.full 2>&1 - _try_scratch_mount >>$seqres.full 2>&1 || \ - _notrun "mount failed, kernel doesn't support realtime?" - _scratch_unmount -else - _scratch_mkfs $extra_options >>$seqres.full 2>&1 -fi +_scratch_mkfs >>$seqres.full 2>&1 _scratch_mount _require_fs_space "$SCRATCH_MNT" $((filesz / 1024)) @@ -112,7 +53,6 @@ $XFS_IO_PROG -c "pwrite -b 1M -W 0 $(((maxextlen + 2 - rextsize) * bs))" \ # Truncate the extents. $XFS_IO_PROG -c "truncate 0" -c fsync "$SCRATCH_MNT/file" -# We need to do this before the loop device gets torn down. _scratch_unmount _check_scratch_fs diff --git a/tests/xfs/650 b/tests/xfs/650 new file mode 100755 index 00000000..d8f70539 --- /dev/null +++ b/tests/xfs/650 @@ -0,0 +1,117 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2019 Facebook. All Rights Reserved. +# +# FS QA Test 650 +# +# Test commit 0c4da70c83d4 ("xfs: fix realtime file data space leak") and +# 69ffe5960df1 ("xfs: don't check for AG deadlock for realtime files in +# bunmapi"). On XFS without the fixes, truncate will hang forever. +# +. ./common/preamble +_begin_fstest auto prealloc preallocrw + +# Override the default cleanup function. +_cleanup() +{ + _scratch_unmount &>/dev/null + [ -n "$loop_dev" ] && _destroy_loop_device $loop_dev + cd / + rm -f $tmp.* + rm -f "$TEST_DIR/$seq" +} + +. ./common/filter + +_require_scratch_nocheck +_require_xfs_io_command "falloc" + +maxextlen=$((0x1fffff)) +bs=4096 +rextsize=4 +filesz=$(((maxextlen + 1) * bs)) + +must_disable_feature() { + local feat="$1" + + # If mkfs doesn't know about the feature, we don't need to disable it + $MKFS_XFS_PROG --help 2>&1 | grep -q "${feat}=0" || return 1 + + # If turning the feature on works, we don't need to disable it + _scratch_mkfs_xfs_supported -m "${feat}=1" "${disabled_features[@]}" \ + > /dev/null 2>&1 && return 1 + + # Otherwise mkfs knows of the feature and formatting with it failed, + # so we do need to mask it. + return 0 +} + +extra_options="" +# Set up the realtime device to reproduce the bug. + +# If we don't have a realtime device, set up a loop device on the test +# filesystem. +if [[ $USE_EXTERNAL != yes || -z $SCRATCH_RTDEV ]]; then + _require_test + loopsz="$((filesz + (1 << 26)))" + _require_fs_space "$TEST_DIR" $((loopsz / 1024)) + $XFS_IO_PROG -c "truncate $loopsz" -f "$TEST_DIR/$seq" + loop_dev="$(_create_loop_device "$TEST_DIR/$seq")" + USE_EXTERNAL=yes + SCRATCH_RTDEV="$loop_dev" + disabled_features=() + + # disable reflink if not supported by realtime devices + must_disable_feature reflink && + disabled_features=(-m reflink=0) + + # disable rmap if not supported by realtime devices + must_disable_feature rmapbt && + disabled_features+=(-m rmapbt=0) +fi +extra_options="$extra_options -r extsize=$((bs * rextsize))" +extra_options="$extra_options -d agsize=$(((maxextlen + 1) * bs / 2)),rtinherit=1" + +_scratch_mkfs $extra_options "${disabled_features[@]}" >>$seqres.full 2>&1 +_try_scratch_mount >>$seqres.full 2>&1 || \ + _notrun "mount failed, kernel doesn't support realtime?" +_scratch_unmount +_scratch_mount +_require_fs_space "$SCRATCH_MNT" $((filesz / 1024)) + +# Allocate maxextlen + 1 blocks. As long as the allocator does something sane, +# we should end up with two extents that look something like: +# +# u3.bmx[0-1] = [startoff,startblock,blockcount,extentflag] +# 0:[0,0,2097148,1] +# 1:[2097148,2097148,4,1] +# +# Extent 0 has blockcount = ALIGN_DOWN(maxextlen, rextsize). Extent 1 is +# adjacent and has blockcount = rextsize. Both are unwritten. +$XFS_IO_PROG -c "falloc 0 $filesz" -c fsync -f "$SCRATCH_MNT/file" + +# Write extent 0 + one block of extent 1. Our extents should end up like so: +# +# u3.bmx[0-1] = [startoff,startblock,blockcount,extentflag] +# 0:[0,0,2097149,0] +# 1:[2097149,2097149,3,1] +# +# Extent 0 is written and has blockcount = ALIGN_DOWN(maxextlen, rextsize) + 1, +# Extent 1 is adjacent, unwritten, and has blockcount = rextsize - 1 and +# startblock % rextsize = 1. +# +# The -b is just to speed things up (doing GBs of I/O in 4k chunks kind of +# sucks). +$XFS_IO_PROG -c "pwrite -b 1M -W 0 $(((maxextlen + 2 - rextsize) * bs))" \ + "$SCRATCH_MNT/file" >> "$seqres.full" + +# Truncate the extents. +$XFS_IO_PROG -c "truncate 0" -c fsync "$SCRATCH_MNT/file" + +# We need to do this before the loop device gets torn down. +_scratch_unmount +_check_scratch_fs + +echo "Silence is golden" +status=0 +exit diff --git a/tests/xfs/650.out b/tests/xfs/650.out new file mode 100644 index 00000000..d7a3e4b6 --- /dev/null +++ b/tests/xfs/650.out @@ -0,0 +1,2 @@ +QA output created by 650 +Silence is golden