Re: [PATCH] fstests: generic: add a basic cachestat test case

Filipe Manana <[email protected]>
Newsgroups org.kernel.vger.linux-btrfs,org.kernel.vger.fstests
Message-ID <CAL3q7H4FtJAQ88VfgWsh11DGV1V7gFN1cAvfqoLxTEmg+d2FJg@mail.gmail.com>
On Tue, Jul 7, 2026 at 1:20 AM Qu Wenruo <[email protected]> wrote:
>
> The test case is inspired by LTP, where there is a regression on 64K
> page size systems with btrfs, that after a fsync, cachestat() still
> report dirty pages.
>
> The test case itself is pretty simple, fill the file with a buffered write that is
> 1/2/4/8/16 page sized, call cachestat() to make sure the cached/dirtied
> number match the page number.
>
> Then do a fsync(), and make sure the dirty page number reduced to 0
> meanwhile cached is still the same.
>
> Link: https://bugzilla.suse.com/show_bug.cgi?id=1270397
> Signed-off-by: Qu Wenruo <[email protected]>
> ---
>  tests/generic/798     | 57 +++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/798.out |  2 ++
>  2 files changed, 59 insertions(+)
>  create mode 100755 tests/generic/798
>  create mode 100644 tests/generic/798.out
>
> diff --git a/tests/generic/798 b/tests/generic/798
> new file mode 100755
> index 00000000..4328475e
> --- /dev/null
> +++ b/tests/generic/798
> @@ -0,0 +1,57 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2026 SUSE S.A.  All Rights Reserved.
> +#
> +# FS QA Test 798
> +#
> +# Basic tests for cachestate()
> +#
> +. ./common/preamble
> +_begin_fstest auto quick
> +
> +_require_xfs_io_command "cachestat"
> +_require_scratch
> +
> +pagesize=$(_get_page_size)
> +
> +for num_page in 1 2 4 8 16; do
> +       size=$(($pagesize * $num_page))
> +
> +       echo "=== Test with $num_page pages ===" >> $seqres.full
> +       _scratch_mkfs > /dev/null
> +       _scratch_mount
> +
> +       # Basic cached number reporting
> +       $XFS_IO_PROG -f -c "pwrite -b $pagesize 0 $size" \
> +               $SCRATCH_MNT/foobar >> $seqres.full
> +       $XFS_IO_PROG -c "cachestat 0 $size" $SCRATCH_MNT/foobar > $tmp.output
> +       cat $tmp.output >> $seqres.full
> +       cached=$(cat $tmp.output | cut -f1 -d, | awk '{print $2}')

Use $AWK_PROG everywhere.

> +       dirtied=$(cat $tmp.output | cut -f2 -d, | awk '{print $2}')
> +
> +       if [ "$cached" -ne "$num_page" ]; then
> +               _fail "cached not matching the page number"
> +       fi
> +
> +       if [ "$cached" -ne "$dirtied" ]; then
> +               _fail "dirited not matching the page number"
> +       fi
> +       $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foobar >> $seqres.full

The redirection isn't needed; on success the fsync command sends
nothing to stdout.

Thanks.

> +
> +       # Test dirty page number reporting after a fsync.
> +       $XFS_IO_PROG -c "cachestat 0 $size" $SCRATCH_MNT/foobar > $tmp.output
> +       cat $tmp.output >> $seqres.full
> +       _scratch_unmount
> +       cached=$(cat $tmp.output | cut -f1 -d, | awk '{print $2}')
> +       dirtied=$(cat $tmp.output | cut -f2 -d, | awk '{print $2}')
> +
> +       if [ "$cached" -ne "$num_page" ]; then
> +               _fail "cached not matching the page number"
> +       fi
> +       if [ "$dirtied" -ne 0 ]; then
> +               _fail "dirtied pages not zero"
> +       fi
> +done
> +
> +echo "Silence is golden"
> +_exit 0
> diff --git a/tests/generic/798.out b/tests/generic/798.out
> new file mode 100644
> index 00000000..216d6e93
> --- /dev/null
> +++ b/tests/generic/798.out
> @@ -0,0 +1,2 @@
> +QA output created by 798
> +Silence is golden
> --
> 2.51.2
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.