]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
xfs: test that zone_gc_low_space writes start gc for rw fses
authorHans Holmberg <hans.holmberg@wdc.com>
Fri, 27 Mar 2026 12:34:29 +0000 (13:34 +0100)
committerZorro Lang <zlang@kernel.org>
Wed, 1 Apr 2026 15:07:08 +0000 (23:07 +0800)
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 <hans.holmberg@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Zorro Lang <zlang@kernel.org>
common/xfs
tests/xfs/668 [new file with mode: 0755]
tests/xfs/668.out [new file with mode: 0644]

index a41d8880d0274e651ed1421f1926893817a273bc..d76a14749b62027f2be6991258a34570c6bfa346 100644 (file)
@@ -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 (executable)
index 0000000..940a6a3
--- /dev/null
@@ -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 (file)
index 0000000..00edcdb
--- /dev/null
@@ -0,0 +1,2 @@
+QA output created by 668
+Silence is golden