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

Qu Wenruo <[email protected]>
Newsgroups org.kernel.vger.linux-btrfs,org.kernel.vger.fstests
Message-ID <[email protected]>
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
Reviewed-by: Anand Jain <[email protected]>
Reviewed-by: Filipe Manana <[email protected]>
Signed-off-by: Qu Wenruo <[email protected]>
---
Changelog:
v3:
- Use golden output to greatly simplify the test case

- Do not mkfs for each size, just remove the original file

v2:
- Reject "sync" and "dax" mount options
  Those mount options write back data synchronously, will screw up the
  buffered write dirtied page reporting.

- Use AWK_PROG everywhere.

- Remove the unnecessary redirection for fsync
---
 tests/generic/798     | 39 +++++++++++++++++++++++++++++++++++++++
 tests/generic/798.out | 16 ++++++++++++++++
 2 files changed, 55 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..0fe37646
--- /dev/null
+++ b/tests/generic/798
@@ -0,0 +1,39 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2026 SUSE S.A.  All Rights Reserved.
+#
+# FS QA Test 798
+#
+# Basic tests for cachestat()
+#
+. ./common/preamble
+_begin_fstest auto quick
+
+_require_xfs_io_command "cachestat"
+_require_scratch
+# Any mount option that writes data back synchronously should be rejected.
+# Or it will screw up the dirtied page reporting for buffered writes.
+_exclude_scratch_mount_option "dax"
+_exclude_scratch_mount_option "sync"
+
+pagesize=$(_get_page_size)
+
+_scratch_mkfs > /dev/null
+_scratch_mount
+
+for num_page in 1 2 4 8 16; do
+	size=$(($pagesize * $num_page))
+
+	echo "=== Test with $num_page pages ==="
+
+	rm -f $SCRATCH_MNT/foobar
+	$XFS_IO_PROG -f -c "pwrite -b $pagesize 0 $size" $SCRATCH_MNT/foobar > /dev/null
+	# Basic cached number reporting
+	$XFS_IO_PROG -c "cachestat 0 $size" $SCRATCH_MNT/foobar
+
+	# Test dirty page number reporting after a fsync.
+	$XFS_IO_PROG -c "fsync" -c "cachestat 0 $size" $SCRATCH_MNT/foobar
+done
+
+_scratch_unmount
+_exit 0
diff --git a/tests/generic/798.out b/tests/generic/798.out
new file mode 100644
index 00000000..ca6ead3c
--- /dev/null
+++ b/tests/generic/798.out
@@ -0,0 +1,16 @@
+QA output created by 798
+=== Test with 1 pages ===
+Cached: 1, Dirty: 1, Writeback: 0, Evicted: 0, Recently Evicted: 0
+Cached: 1, Dirty: 0, Writeback: 0, Evicted: 0, Recently Evicted: 0
+=== Test with 2 pages ===
+Cached: 2, Dirty: 2, Writeback: 0, Evicted: 0, Recently Evicted: 0
+Cached: 2, Dirty: 0, Writeback: 0, Evicted: 0, Recently Evicted: 0
+=== Test with 4 pages ===
+Cached: 4, Dirty: 4, Writeback: 0, Evicted: 0, Recently Evicted: 0
+Cached: 4, Dirty: 0, Writeback: 0, Evicted: 0, Recently Evicted: 0
+=== Test with 8 pages ===
+Cached: 8, Dirty: 8, Writeback: 0, Evicted: 0, Recently Evicted: 0
+Cached: 8, Dirty: 0, Writeback: 0, Evicted: 0, Recently Evicted: 0
+=== Test with 16 pages ===
+Cached: 16, Dirty: 16, Writeback: 0, Evicted: 0, Recently Evicted: 0
+Cached: 16, Dirty: 0, Writeback: 0, Evicted: 0, Recently Evicted: 0
-- 
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.