From: Hans Holmberg Date: Fri, 27 Mar 2026 12:34:29 +0000 (+0100) Subject: xfs: test that zone_gc_low_space writes start gc for rw fses X-Git-Tag: v2026.04.20~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8deafb5c487e73c9384df2fcbab523b12007875b;p=xfstests-dev.git xfs: test that zone_gc_low_space writes start gc for rw fses Test that writes to the sysfs attribute zone_gc_low_space triggers garbage collection for rw (but not ro) file systems. Signed-off-by: Hans Holmberg Reviewed-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Zorro Lang --- diff --git a/common/xfs b/common/xfs index a41d8880..d76a1474 100644 --- a/common/xfs +++ b/common/xfs @@ -748,6 +748,23 @@ _xfs_get_scratch_rtdev_bdev() fi } +# Get a stat from /proc/self/mountstats for a specific mount point +_xfs_get_mountstat() { + awk -v mount="$1" -v stat="$2" \ + '$0~"mounted on "mount" with fstype xfs"{f=1} f&&index($0,stat){print $NF;exit}' \ + /proc/self/mountstats +} + +# Get the user available blocks for a rt mount +_xfs_get_user_available_rt_blocks() { + _xfs_get_mountstat "$1" "user available RT blocks:" +} + +# Check if gc is required for a rt mount +_xfs_get_rt_gc_required () { + _xfs_get_mountstat "$1" "RT GC required:" +} + # Snapshot the metadata on the scratch device _scratch_xfs_metadump() { diff --git a/tests/xfs/668 b/tests/xfs/668 new file mode 100755 index 00000000..940a6a38 --- /dev/null +++ b/tests/xfs/668 @@ -0,0 +1,72 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2026 Western Digital Corporation +# +# FS QA Test No. 668 +# +# Tests that writes to zonegc_low_space will trigger start of garbage +# collection for rw (but not ro) file systems +# +. ./common/preamble +_begin_fstest auto rw zone quick + +. ./common/zoned + +_require_scratch +_require_odirect + +zdev="$(_xfs_get_scratch_rtdev_bdev)" +_require_zoned_device "$zdev" +capacity=$(_zone_capacity 0 $zdev) +_scratch_mkfs_sized $(($capacity * 6)) > $seqres.full 2>&1 + +# limit max open zones to avoid gc to trigger before we want it to +export MOUNT_OPTIONS="$MOUNT_OPTIONS -o max_open_zones=2" +_try_scratch_mount || _notrun "mount option not supported" +_require_xfs_scratch_zoned + +# create three zone-sized files and invalidate 95% of the data +for i in $(seq 1 3); do + filename=$SCRATCH_MNT/data_$i + dd if=/dev/zero of=$filename bs=1M oflag=direct\ + count=$(($capacity / (1024 * 1024))) >> $seqres.full 2>&1 + truncate -s $(($capacity / 20)) $filename +done + +# remount read-only and set the gc limit to free up unused space +_scratch_remount ro +rt_available_pre="$(_xfs_get_user_available_rt_blocks "$SCRATCH_MNT")" +_set_fs_sysfs_attr $SCRATCH_DEV "zoned/zonegc_low_space" 100 + +# reclaiming a zone with 5% used blocks should take way less than 1 second +sleep 1 + +# gc should not run for read only file systems +rt_available_post="$(_xfs_get_user_available_rt_blocks "$SCRATCH_MNT")" +[ "$rt_available_post" -gt "$rt_available_pre" ] && \ + _fail "gc should not run while read only" + +_set_fs_sysfs_attr $SCRATCH_DEV "zoned/zonegc_low_space" 0 + +# remount rw and check that gc starts, frees up blocks and stops after +# the threshold is set to reclaim the unused blocks +_scratch_remount rw + +rt_available_pre="$(_xfs_get_user_available_rt_blocks "$SCRATCH_MNT")" +_set_fs_sysfs_attr $SCRATCH_DEV "zoned/zonegc_low_space" 100 + +i=0 +while [ $(_xfs_get_rt_gc_required "$SCRATCH_MNT") -eq "1" ]; do + sleep 1 + let i=$i+1 + [ $i -gt 3 ] && _fail "gc did not complete within a reasonable time" +done + +rt_available_post="$(_xfs_get_user_available_rt_blocks "$SCRATCH_MNT")" +[ "$rt_available_pre" -ge "$rt_available_post" ] && \ + _fail "gc did not free up space" + +echo "Silence is golden" +status=0 + +exit diff --git a/tests/xfs/668.out b/tests/xfs/668.out new file mode 100644 index 00000000..00edcdbd --- /dev/null +++ b/tests/xfs/668.out @@ -0,0 +1,2 @@ +QA output created by 668 +Silence is golden