From: "Darrick J. Wong" <djwong@kernel.org>
To: Hans Holmberg <hans.holmberg@wdc.com>
Cc: zlang@kernel.org, fstests@vger.kernel.org,
Christoph Hellwig <hch@lst.de>,
Damien Le Moal <dlemoal@kernel.org>,
linux-xfs@vger.kernel.org
Subject: Re: [PATCH v2 2/2] xfs: test that zone_gc_low_space writes start gc for rw fses
Date: Fri, 27 Mar 2026 08:22:18 -0700 [thread overview]
Message-ID: <20260327152218.GC6223@frogsfrogsfrogs> (raw)
In-Reply-To: <20260327123429.39330-3-hans.holmberg@wdc.com>
On Fri, Mar 27, 2026 at 01:34:29PM +0100, Hans Holmberg wrote:
> 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>
Looks good to me, given what I saw of the kernel patch. It probably
needs a _fixed_by_kernel_commit tag once the patch goes upstream.
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> ---
> common/xfs | 17 +++++++++++
> tests/xfs/999 | 72 +++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/999.out | 2 ++
> 3 files changed, 91 insertions(+)
> create mode 100755 tests/xfs/999
> create mode 100644 tests/xfs/999.out
>
> diff --git a/common/xfs b/common/xfs
> index c81f939e68d2..45d7f75d2064 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/999 b/tests/xfs/999
> new file mode 100755
> index 000000000000..2c5b54368b6d
> --- /dev/null
> +++ b/tests/xfs/999
> @@ -0,0 +1,72 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2026 Western Digital Corporation
> +#
> +# FS QA Test No. 999
> +#
> +# 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/999.out b/tests/xfs/999.out
> new file mode 100644
> index 000000000000..3b276ca804fc
> --- /dev/null
> +++ b/tests/xfs/999.out
> @@ -0,0 +1,2 @@
> +QA output created by 999
> +Silence is golden
> --
> 2.34.1
>
>
next prev parent reply other threads:[~2026-03-27 15:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-27 12:34 [PATCH v2 0/2] add test for zone_gc_low_space attribute writes Hans Holmberg
2026-03-27 12:34 ` [PATCH v2 1/2] xfs/647: turn rt dev block device lookup into a common helper Hans Holmberg
2026-03-27 15:19 ` Darrick J. Wong
2026-03-30 5:33 ` Christoph Hellwig
2026-03-27 12:34 ` [PATCH v2 2/2] xfs: test that zone_gc_low_space writes start gc for rw fses Hans Holmberg
2026-03-27 15:22 ` Darrick J. Wong [this message]
2026-03-30 5:34 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260327152218.GC6223@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=dlemoal@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=hans.holmberg@wdc.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
--cc=zlang@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox