From: "Darrick J. Wong" <djwong@kernel.org>
To: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Cc: Zorro Lang <zlang@redhat.com>,
fstests@vger.kernel.org, Ritesh Harjani <ritesh.list@gmail.com>,
john.g.garry@oracle.com, tytso@mit.edu,
linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-ext4@vger.kernel.org
Subject: Re: [PATCH v4 11/11] ext4: Atomic write test for extent split across leaf nodes
Date: Tue, 12 Aug 2025 10:19:35 -0700 [thread overview]
Message-ID: <20250812171935.GD7938@frogsfrogsfrogs> (raw)
In-Reply-To: <2c241ea2ede39914d29aa59cd06acfc951aed160.1754833177.git.ojaswin@linux.ibm.com>
On Sun, Aug 10, 2025 at 07:12:02PM +0530, Ojaswin Mujoo wrote:
> In ext4, even if an allocated range is physically and logically
> contiguous, it can still be split into 2 extents. This is because ext4
> does not merge extents across leaf nodes. This is an issue for atomic
> writes since even for a continuous extent the map block could (in rare
> cases) return a shorter map, hence tearning the write. This test creates
> such a file and ensures that the atomic write handles this case
> correctly
>
> Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> ---
> tests/ext4/063 | 129 +++++++++++++++++++++++++++++++++++++++++++++
> tests/ext4/063.out | 2 +
> 2 files changed, 131 insertions(+)
> create mode 100755 tests/ext4/063
> create mode 100644 tests/ext4/063.out
>
> diff --git a/tests/ext4/063 b/tests/ext4/063
> new file mode 100755
> index 00000000..40867acb
> --- /dev/null
> +++ b/tests/ext4/063
> @@ -0,0 +1,129 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2025 IBM Corporation. All Rights Reserved.
> +#
> +# In ext4, even if an allocated range is physically and logically contiguous,
> +# it can still be split into 2 extents. This is because ext4 does not merge
> +# extents across leaf nodes. This is an issue for atomic writes since even for
> +# a continuous extent the map block could (in rare cases) return a shorter map,
> +# hence tearning the write. This test creates such a file and ensures that the
> +# atomic write handles this case correctly
> +#
> +. ./common/preamble
> +. ./common/atomicwrites
> +_begin_fstest auto atomicwrites
> +
> +_require_scratch_write_atomic_multi_fsblock
> +_require_atomic_write_test_commands
> +_require_command "$DEBUGFS_PROG" debugfs
> +
> +prep() {
> + local bs=`_get_block_size $SCRATCH_MNT`
> + local ex_hdr_bytes=12
> + local ex_entry_bytes=12
> + local entries_per_blk=$(( (bs - ex_hdr_bytes) / ex_entry_bytes ))
> +
> + # fill the extent tree leaf with bs len extents at alternate offsets.
> + # The tree should look as follows
> + #
> + # +---------+---------+
> + # | index 1 | index 2 |
> + # +-----+---+-----+---+
> + # +------+ +-----------+
> + # | |
> + # +-------+-------+---+---------+ +-----+----+
> + # | ex 1 | ex 2 | | ex n | | ex n+1 |
> + # | off:0 | off:2 |...| off:678 | | off:680 |
> + # | len:1 | len:1 | | len:1 | | len:1 |
> + # +-------+-------+---+---------+ +----------+
> + #
> + for i in $(seq 0 $entries_per_blk)
> + do
> + $XFS_IO_PROG -fc "pwrite -b $bs $((i * 2 * bs)) $bs" $testfile > /dev/null
> + done
> + sync $testfile
> +
> + echo >> $seqres.full
> + echo "Create file with extents spanning 2 leaves. Extents:">> $seqres.full
> + echo "...">> $seqres.full
> + $DEBUGFS_PROG -R "ex `basename $testfile`" $SCRATCH_DEV |& tail >> $seqres.full
> +
> + # Now try to insert a new extent ex(new) between ex(n) and ex(n+1).
> + # Since this is a new FS the allocator would find continuous blocks
> + # such that ex(n) ex(new) ex(n+1) are physically(and logically)
> + # contiguous. However, since we dont merge extents across leaf we will
> + # end up with a tree as:
> + #
> + # +---------+---------+
> + # | index 1 | index 2 |
> + # +-----+---+-----+---+
> + # +------+ +------------+
> + # | |
> + # +-------+-------+---+---------+ +------+-----------+
> + # | ex 1 | ex 2 | | ex n | | ex n+1 (merged) |
> + # | off:0 | off:2 |...| off:678 | | off:679 |
> + # | len:1 | len:1 | | len:1 | | len:2 |
> + # +-------+-------+---+---------+ +------------------+
> + #
Thanks for the nice picture demonstrating what you're trying to test!
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> + echo >> $seqres.full
> + torn_ex_offset=$((((entries_per_blk * 2) - 1) * bs))
> + $XFS_IO_PROG -c "pwrite $torn_ex_offset $bs" $testfile >> /dev/null
> + sync $testfile
> +
> + echo >> $seqres.full
> + echo "Perform 1 block write at $torn_ex_offset to create torn extent. Extents:">> $seqres.full
> + echo "...">> $seqres.full
> + $DEBUGFS_PROG -R "ex `basename $testfile`" $SCRATCH_DEV |& tail >> $seqres.full
> +
> + _scratch_cycle_mount
> +}
> +
> +_scratch_mkfs >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +testfile=$SCRATCH_MNT/testfile
> +touch $testfile
> +awu_max=$(_get_atomic_write_unit_max $testfile)
> +
> +echo >> $seqres.full
> +echo "# Prepping the file" >> $seqres.full
> +prep
> +
> +torn_aw_offset=$((torn_ex_offset - (torn_ex_offset % awu_max)))
> +
> +echo >> $seqres.full
> +echo "# Performing atomic IO on the torn extent range. Command: " >> $seqres.full
> +echo $XFS_IO_PROG -c "open -fsd $testfile" -c "pwrite -S 0x61 -DA -V1 -b $awu_max $torn_aw_offset $awu_max" >> $seqres.full
> +$XFS_IO_PROG -c "open -fsd $testfile" -c "pwrite -S 0x61 -DA -V1 -b $awu_max $torn_aw_offset $awu_max" >> $seqres.full
> +
> +echo >> $seqres.full
> +echo "Extent state after atomic write:">> $seqres.full
> +echo "...">> $seqres.full
> +$DEBUGFS_PROG -R "ex `basename $testfile`" $SCRATCH_DEV |& tail >> $seqres.full
> +
> +echo >> $seqres.full
> +echo "# Checking data integrity" >> $seqres.full
> +
> +# create a dummy file with expected data
> +$XFS_IO_PROG -fc "pwrite -S 0x61 -b $awu_max 0 $awu_max" $testfile.exp >> /dev/null
> +expected_data=$(od -An -t x1 -j 0 -N $awu_max $testfile.exp)
> +
> +# We ensure that the data after atomic writes should match the expected data
> +actual_data=$(od -An -t x1 -j $torn_aw_offset -N $awu_max $testfile)
> +if [[ "$actual_data" != "$expected_data" ]]
> +then
> + echo "Checksum match failed at off: $torn_aw_offset size: $awu_max"
> + echo
> + echo "Expected: "
> + echo "$expected_data"
> + echo
> + echo "Actual contents: "
> + echo "$actual_data"
> +
> + _fail
> +fi
> +
> +echo -n "Data verification at offset $torn_aw_offset suceeded!" >> $seqres.full
> +echo "Silence is golden"
> +status=0
> +exit
> diff --git a/tests/ext4/063.out b/tests/ext4/063.out
> new file mode 100644
> index 00000000..de35fc52
> --- /dev/null
> +++ b/tests/ext4/063.out
> @@ -0,0 +1,2 @@
> +QA output created by 063
> +Silence is golden
> --
> 2.49.0
>
>
next prev parent reply other threads:[~2025-08-12 17:19 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-10 13:41 [PATCH v4 00/11] Add more tests for multi fs block atomic writes Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 01/11] common/rc: Add _min() and _max() helpers Ojaswin Mujoo
2025-08-13 12:20 ` David Laight
2025-08-21 10:35 ` Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 02/11] common/rc: Add a helper to run fsx on a given file Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 03/11] ltp/fsx.c: Add atomic writes support to fsx Ojaswin Mujoo
2025-08-13 13:42 ` John Garry
2025-08-21 9:45 ` Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 04/11] generic: Add atomic write test using fio crc check verifier Ojaswin Mujoo
2025-08-12 17:16 ` Darrick J. Wong
2025-08-13 13:39 ` John Garry
2025-08-21 8:42 ` Ojaswin Mujoo
2025-08-21 9:24 ` John Garry
2025-08-21 12:18 ` Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 05/11] generic: Add atomic write test using fio verify on file mixed mappings Ojaswin Mujoo
2025-08-12 17:16 ` Darrick J. Wong
2025-08-10 13:41 ` [PATCH v4 06/11] generic: Add atomic write multi-fsblock O_[D]SYNC tests Ojaswin Mujoo
2025-08-11 15:29 ` Darrick J. Wong
2025-08-10 13:41 ` [PATCH v4 07/11] generic: Stress fsx with atomic writes enabled Ojaswin Mujoo
2025-08-12 17:18 ` Darrick J. Wong
2025-08-13 5:45 ` Ojaswin Mujoo
2025-08-10 13:41 ` [PATCH v4 08/11] generic: Add sudden shutdown tests for multi block atomic writes Ojaswin Mujoo
2025-08-10 13:42 ` [PATCH v4 09/11] ext4: Atomic writes stress test for bigalloc using fio crc verifier Ojaswin Mujoo
2025-08-12 8:08 ` John Garry
2025-08-13 7:08 ` Ojaswin Mujoo
2025-08-13 7:33 ` John Garry
2025-08-21 8:29 ` Ojaswin Mujoo
2025-08-10 13:42 ` [PATCH v4 10/11] ext4: Atomic writes test for bigalloc using fio crc verifier on multiple files Ojaswin Mujoo
2025-08-13 13:45 ` John Garry
2025-08-21 8:28 ` Ojaswin Mujoo
2025-08-21 9:28 ` John Garry
2025-08-21 12:19 ` Ojaswin Mujoo
2025-08-10 13:42 ` [PATCH v4 11/11] ext4: Atomic write test for extent split across leaf nodes Ojaswin Mujoo
2025-08-12 17:19 ` Darrick J. Wong [this message]
2025-08-13 5:45 ` Ojaswin Mujoo
2025-08-13 13:54 ` John Garry
2025-08-21 8:25 ` Ojaswin Mujoo
2025-08-21 9:23 ` John Garry
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=20250812171935.GD7938@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=john.g.garry@oracle.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=ojaswin@linux.ibm.com \
--cc=ritesh.list@gmail.com \
--cc=tytso@mit.edu \
--cc=zlang@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.