Re: [PATCH] generic: add a test case for writes with prealloc extents beyond i_size

Zorro Lang <[email protected]>
Newsgroups org.kernel.vger.fstests,org.kernel.vger.linux-btrfs
Message-ID <ai7Fm0OzuKXV1zHw@zlang-mailbox>
On Sun, Jun 14, 2026 at 11:57:39AM +0100, Filipe Manana wrote:
> On Thu, May 28, 2026 at 11:27 AM <[email protected]> wrote:
> >
> > From: Filipe Manana <[email protected]>
> >
> > Test writing into a file range containing prealloc extents beyond the current
> > i_size, with an unmount and mount after fallocate and the write, to verify
> > that the file data, size and extent layout were not lost.
> >
> > This used to fail on btrfs when not using the no-holes feature (which is
> > a default since btrfs-progs 5.15) before this recent kernel fix:
> >
> >    080ecbd05432 ("btrfs: mark file extent range dirty after converting prealloc extents")
> >
> > So in order to reproduce the failure when using an unpatched kernel and
> > a btrfs-progs >= 5.15, one must run the test with:
> >
> >    MKFS_OPTIONS="-O ^no-holes"
> >
> > Signed-off-by: Filipe Manana <[email protected]>
> 
> Zorro, this is missing in the patches-in-queue branch (and for-next).
> Did you miss this?

Hi Filipe,

Sorry, I got this patch mixed up with another one -- 32b4dfff ("generic: add a
test case for fallocate i_size extension"). They have the same author, reviewer,
and case number, and even their commit logs look very similar. At first glance,
I mistakenly thought it was a patch I had already merged :-P

Thank you for pointing this out. I will test it and merge it into the
patches-in-queue branch right away, and it will be released next week
along with the others.

Thanks,
Zorro

> 
> Thanks.
> 
> > ---
> >  tests/generic/796     | 54 +++++++++++++++++++++++++++++++++++++++++++
> >  tests/generic/796.out | 10 ++++++++
> >  2 files changed, 64 insertions(+)
> >  create mode 100755 tests/generic/796
> >  create mode 100644 tests/generic/796.out
> >
> > diff --git a/tests/generic/796 b/tests/generic/796
> > new file mode 100755
> > index 00000000..c42a4722
> > --- /dev/null
> > +++ b/tests/generic/796
> > @@ -0,0 +1,54 @@
> > +#! /bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright (c) 2026 SUSE S.A.  All Rights Reserved.
> > +#
> > +# FS QA Test 796
> > +#
> > +# Test writing into a file range containing prealloc extents beyond the current
> > +# i_size, with an unmount and mount after fallocate and the write, to verify
> > +# that the file data, size and extent layout were not lost.
> > +#
> > +. ./common/preamble
> > +_begin_fstest auto quick prealloc preallocrw fiemap
> > +
> > +. ./common/filter
> > +. ./common/punch # for _filter_fiemap
> > +
> > +_require_scratch
> > +_require_xfs_io_command "falloc" "-k"
> > +_require_xfs_io_command "fiemap"
> > +
> > +_fixed_by_fs_commit btrfs 080ecbd05432 \
> > +       "btrfs: mark file extent range dirty after converting prealloc extents"
> > +
> > +_scratch_mkfs >>$seqres.full 2>&1
> > +_scratch_mount
> > +
> > +# The fiemap results in the golden output requires file allocations to align to
> > +# 1M boundaries.
> > +_require_congruent_file_oplen $SCRATCH_MNT 1048576
> > +
> > +# Create our file with a size of 0 and a prealloc extent in the range [0, 2M].
> > +$XFS_IO_PROG -f -c "falloc -k 0 2M" $SCRATCH_MNT/foo
> > +
> > +# Unmount and mount again to remove any in memory state of the inode. We will
> > +# verify later that neither metadata nor extents were lost during unmount.
> > +_scratch_cycle_mount
> > +
> > +# Write into the [0, 1M] range, which increases the inode's i_size.
> > +$XFS_IO_PROG -c "pwrite -S 0xab -b 1M 0 1M" $SCRATCH_MNT/foo | _filter_xfs_io
> > +
> > +# Unmount and mount again to remove any in memory state of the inode. We will
> > +# verify later that neither metadata nor extents were lost during unmount.
> > +_scratch_cycle_mount
> > +
> > +# Check file data (and size).
> > +echo "File data:"
> > +_hexdump $SCRATCH_MNT/foo
> > +
> > +# Check we have unwritten extents in range [1M, 2M].
> > +echo "Fiemap output:"
> > +$XFS_IO_PROG -c "fiemap -v" $SCRATCH_MNT/foo | _filter_fiemap
> > +
> > +# Success, all done.
> > +_exit 0
> > diff --git a/tests/generic/796.out b/tests/generic/796.out
> > new file mode 100644
> > index 00000000..c6c6e6a8
> > --- /dev/null
> > +++ b/tests/generic/796.out
> > @@ -0,0 +1,10 @@
> > +QA output created by 796
> > +wrote 1048576/1048576 bytes at offset 0
> > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > +File data:
> > +000000 ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab  >................<
> > +*
> > +100000
> > +Fiemap output:
> > +0: [0..2047]: data
> > +1: [2048..4095]: unwritten
> > --
> > 2.47.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.