[PATCHSET 02/12] fstests: fix logwrites zeroing

Darrick J. Wong
2025-02-19T00:46:23Z

Hi all,

This patchset attempts to fix the behavior of the logwrites replay tests
when running on XFS. In short, the logwrites code logs every write made
to a block device and can set tags at arbitrary points in that log. The
replay tests then erase the block device and replay up to those tags,
and then invoke the filesystem to see if it can recover the filesystem.

However, the logwrites replay has long had subtle problems. XFS log
recovery won't replay a metadata block from the log if the ondisk block
has a newer log sequence number (LSNs), which rests on the assumption
that ondisk filesystem metadata do not have LSNs greater than that of
the head of the log. This is not true if we're replaying to a point in
the past, so log recovery fails to produce a consistent filesystem.

The logwrites replay code works around this issue by erasing the block
device before replaying. Unfortunately, it uses BLKDISCARD, which has
never guaranteed the results of a read after the discard completes.
Some devices return zeroes, others do nothing. This inconsistency has
been worked around by installing the one block device that guarantees
that reads after a mass discard always return zeros -- dm-thinp.

Unfortunately that leaves a subtle landmine for test authors. If their
filesystem's recovery doesn't behave like XFS's then they might not need
thinp. If it does, it's all too easy to write a broken testcase.

Fix this whole situation by adding a warning to the logwrites setup code
if the block device is not known to guarantee that reads after discard
returns zeroes; fix the replay program to use BLKZEROOUT so that the
block device is zeroed before replay begins; and then fix the logwrites
setup to tell the replay program that it can use BLKDISCARD for the
devices where we know that will work, because discard is much faster
than writing zeroes.

If you're going to start using this code, I strongly recommend pulling
from my git trees, which are linked below.

With a bit of luck, this should all go splendidly.
Comments and questions are, as always, welcome.

--D

fstests git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfstests-dev.git/log/?h=logwrites-fix-zeroing
---
Commits in this patchset:
* logwrites: warn if we don't think read after discard returns zeroes
* logwrites: use BLKZEROOUT if it's available
* logwrites: only use BLKDISCARD if we know discard zeroes data
---
src/log-writes/log-writes.h | 1 +
common/dmlogwrites | 39 ++++++++++++++++++++++++++++++++++++++-
src/log-writes/log-writes.c | 10 ++++++++++
src/log-writes/replay-log.c | 8 ++++++++
4 files changed, 57 insertions(+), 1 deletion(-)