> On Jun 21, 2025, at 5:20 AM, Zorro Lang <zlang@xxxxxxxxxx> wrote: > > On Fri, Jun 20, 2025 at 11:02:05PM +0000, Catherine Hoang wrote: >> >>> On Jun 18, 2025, at 11:09 AM, Zorro Lang <zlang@xxxxxxxxxx> wrote: >>> >>> On Mon, Jun 16, 2025 at 02:52:12PM -0700, Catherine Hoang wrote: >>>> From: "Darrick J. Wong" <djwong@xxxxxxxxxx> >>>> >>>> Simple tests of various atomic write requests and a (simulated) hardware >>>> device. >>>> >>>> The first test performs basic multi-block atomic writes on a scsi_debug device >>>> with atomic writes enabled. We test all advertised sizes between the atomic >>>> write unit min and max. We also ensure that the write fails when expected, such >>>> as when attempting buffered io or unaligned directio. >>>> >>>> The second test is similar to the one above, except that it verifies multi-block >>>> atomic writes on actual hardware instead of simulated hardware. The device used >>>> in this test is not required to support atomic writes. >>>> >>>> The final two tests ensure multi-block atomic writes can be performed on various >>>> interweaved mappings, including written, mapped, hole, and unwritten. We also >>>> test large atomic writes on a heavily fragmented filesystem. These tests are >>>> separated into reflink (shared) and non-reflink tests. >>>> >>>> Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> >>>> Signed-off-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx> >>>> --- >>>> common/atomicwrites | 10 ++++ >>>> tests/generic/1222 | 88 ++++++++++++++++++++++++++++ >>>> tests/generic/1222.out | 10 ++++ >>>> tests/generic/1223 | 66 +++++++++++++++++++++ >>>> tests/generic/1223.out | 9 +++ >>>> tests/generic/1224 | 86 ++++++++++++++++++++++++++++ >>>> tests/generic/1224.out | 16 ++++++ >>>> tests/generic/1225 | 127 +++++++++++++++++++++++++++++++++++++++++ >>>> tests/generic/1225.out | 21 +++++++ >>>> 9 files changed, 433 insertions(+) >>>> create mode 100755 tests/generic/1222 >>>> create mode 100644 tests/generic/1222.out >>>> create mode 100755 tests/generic/1223 >>>> create mode 100644 tests/generic/1223.out >>>> create mode 100755 tests/generic/1224 >>>> create mode 100644 tests/generic/1224.out >>>> create mode 100755 tests/generic/1225 >>>> create mode 100644 tests/generic/1225.out >>>> >>>> diff --git a/common/atomicwrites b/common/atomicwrites >>>> index ac4facc3..95d545a6 100644 >>>> --- a/common/atomicwrites >>>> +++ b/common/atomicwrites >>>> @@ -136,3 +136,13 @@ _test_atomic_file_writes() >>>> $XFS_IO_PROG -dc "pwrite -A -D -V1 -b $bsize 1 $bsize" $testfile 2>> $seqres.full && \ >>>> echo "atomic write requires offset to be aligned to bsize" >>>> } >>>> + >>>> +_simple_atomic_write() { >>>> + local pos=$1 >>>> + local count=$2 >>>> + local file=$3 >>>> + local directio=$4 >>>> + >>>> + echo "testing pos=$pos count=$count file=$file directio=$directio" >> $seqres.full >>>> + $XFS_IO_PROG $directio -c "pwrite -b $count -V 1 -A -D $pos $count" $file >> $seqres.full >>>> +} >>>> diff --git a/tests/generic/1222 b/tests/generic/1222 >>>> new file mode 100755 >>>> index 00000000..c718b244 >>>> --- /dev/null >>>> +++ b/tests/generic/1222 >>>> @@ -0,0 +1,88 @@ >>>> +#! /bin/bash >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +# Copyright (c) 2025 Oracle. All Rights Reserved. >>>> +# >>>> +# FS QA Test 1222 >>>> +# >>>> +# Validate multi-fsblock atomic write support with simulated hardware support >>>> +# >>>> +. ./common/preamble >>>> +_begin_fstest auto quick rw atomicwrites >>>> + >>>> +. ./common/scsi_debug >>>> +. ./common/atomicwrites >>>> + >>>> +_cleanup() >>>> +{ >>>> + _scratch_unmount &>/dev/null >>>> + _put_scsi_debug_dev &>/dev/null >>>> + cd / >>>> + rm -r -f $tmp.* >>>> +} >>>> + >>>> +_require_scsi_debug >>>> +_require_scratch_nocheck > ^^^^^^^ > >>>> +# Format something so that ./check doesn't freak out >>>> +_scratch_mkfs >> $seqres.full >>>> + >>>> +# 512b logical/physical sectors, 512M size, atomic writes enabled >>>> +dev=$(_get_scsi_debug_dev 512 512 0 512 "atomic_wr=1") >>>> +test -b "$dev" || _notrun "could not create atomic writes scsi_debug device" >>>> + >>>> +export SCRATCH_DEV=$dev >>> >>> These's a generic test case. As you use scsi_debug device. I'm wondering do we >>> need _require_block_device? Can this case works with FSTYP=nfs, cifs, tmpfs, overlayfs >>> and so on? > > Did you make sure that this generic test case will _notrun on other fs, won't break > their fs testing? I’m not familiar with those filesystems, but I will add _require_block_device to the generic tests so that they won’t run on these filesystems. > >>> >>>> +unset USE_EXTERNAL >>>> + >>>> +_require_scratch_write_atomic > > This function calls _require_scratch, that means the $SCRATCH_DEV still need to be > checked at the end of this test. So your above _require_scratch_nocheck isn't > real "nocheck". Ok, looks like we can change this to just _require_scratch. Thanks! > >>>> +_require_scratch_write_atomic_multi_fsblock >>>> + >>>> +xfs_io -c 'help pwrite' | grep -q RWF_ATOMIC || _notrun "xfs_io pwrite -A failed" >>>> +xfs_io -c 'help falloc' | grep -q 'not found' && _notrun "xfs_io falloc failed" >>> >>> Can't these two lines be replaced by _require_xfs_io? e.g. >>> _require_xfs_io_command pwrite -A >>> _require_xfs_io_command falloc >> >> We can't use _require_xfs_io here because this checks $TEST_DIR, but we are >> running these tests on a scsi_debug device located at $SCRATCH_MNT. Even >> if $TEST_DIR doesn't support atomic writes, we still want to run this test as long >> as the scsi_debug device has atomic writes enabled. So we need to manually >> check that the scsi_debug device supports the commands we need. > > Oh, makes sense :) But that means you only check the command is supported by xfs_io, > not by the fs. > > Please add a comment to explain that, and replace "xfs_io" with "$XFS_IO_PROG" at least. > >> >> I will address the other review comments in the next version. Thanks! >>> >>>> + >>>> +echo "scsi_debug atomic write properties" >> $seqres.full >>>> +$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $SCRATCH_DEV >> $seqres.full >>> >>> _require_xfs_io_command statx -r ? >>> >>>> + >>>> +_scratch_mkfs >> $seqres.full >>>> +_scratch_mount >>>> +test "$FSTYP" = "xfs" && _xfs_force_bdev data $SCRATCH_MNT >>>> + >>>> +testfile=$SCRATCH_MNT/testfile >>>> +touch $testfile >>>> + >>>> +echo "filesystem atomic write properties" >> $seqres.full >>>> +$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $testfile >> $seqres.full >>>> + >>>> +sector_size=$(blockdev --getss $SCRATCH_DEV) >>>> +min_awu=$(_get_atomic_write_unit_min $testfile) >>>> +max_awu=$(_get_atomic_write_unit_max $testfile) >>>> + >>>> +$XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile >>>> + >>>> +# try outside the advertised sizes >>>> +echo "two EINVAL for unsupported sizes" >>>> +min_i=$((min_awu / 2)) >>>> +_simple_atomic_write $min_i $min_i $testfile -d >>>> +max_i=$((max_awu * 2)) >>>> +_simple_atomic_write $max_i $max_i $testfile -d >>>> + >>>> +# try all of the advertised sizes >>>> +echo "all should work" >>>> +for ((i = min_awu; i <= max_awu; i *= 2)); do >>>> + $XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile >>>> + _test_atomic_file_writes $i $testfile >>>> +done >>>> + >>>> +# does not support buffered io >>>> +echo "one EOPNOTSUPP for buffered atomic" >>>> +_simple_atomic_write 0 $min_awu $testfile >>>> + >>>> +# does not support unaligned directio >>>> +echo "one EINVAL for unaligned directio" >>>> +_simple_atomic_write $sector_size $min_awu $testfile -d >>>> + >>>> +_scratch_unmount >>>> +_put_scsi_debug_dev >>>> + >>>> +# success, all done >>>> +echo Silence is golden >>>> +status=0 >>>> +exit >>>> diff --git a/tests/generic/1222.out b/tests/generic/1222.out >>>> new file mode 100644 >>>> index 00000000..158b52fa >>>> --- /dev/null >>>> +++ b/tests/generic/1222.out >>>> @@ -0,0 +1,10 @@ >>>> +QA output created by 1222 >>>> +two EINVAL for unsupported sizes >>>> +pwrite: Invalid argument >>>> +pwrite: Invalid argument >>>> +all should work >>>> +one EOPNOTSUPP for buffered atomic >>>> +pwrite: Operation not supported >>>> +one EINVAL for unaligned directio >>>> +pwrite: Invalid argument >>>> +Silence is golden >>>> diff --git a/tests/generic/1223 b/tests/generic/1223 >>>> new file mode 100755 >>>> index 00000000..db242e7f >>>> --- /dev/null >>>> +++ b/tests/generic/1223 >>>> @@ -0,0 +1,66 @@ >>>> +#! /bin/bash >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +# Copyright (c) 2025 Oracle. All Rights Reserved. >>>> +# >>>> +# FS QA Test 1223 >>>> +# >>>> +# Validate multi-fsblock atomic write support with or without hw support >>>> +# >>> >>> Same review points with above case. >>> >>>> +. ./common/preamble >>>> +_begin_fstest auto quick rw atomicwrites >>>> + >>>> +. ./common/atomicwrites >>>> + >>>> +_require_scratch >>>> +_require_atomic_write_test_commands >>>> +_require_scratch_write_atomic_multi_fsblock >>>> + >>>> +echo "scratch device atomic write properties" >> $seqres.full >>>> +$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $SCRATCH_DEV >> $seqres.full >>>> + >>>> +_scratch_mkfs >> $seqres.full >>>> +_scratch_mount >>>> +test "$FSTYP" = "xfs" && _xfs_force_bdev data $SCRATCH_MNT >>>> + >>>> +testfile=$SCRATCH_MNT/testfile >>>> +touch $testfile >>>> + >>>> +echo "filesystem atomic write properties" >> $seqres.full >>>> +$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $testfile >> $seqres.full >>>> + >>>> +sector_size=$(blockdev --getss $SCRATCH_DEV) >>>> +min_awu=$(_get_atomic_write_unit_min $testfile) >>>> +max_awu=$(_get_atomic_write_unit_max $testfile) >>>> + >>>> +$XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile >>>> + >>>> +# try outside the advertised sizes >>>> +echo "two EINVAL for unsupported sizes" >>>> +min_i=$((min_awu / 2)) >>>> +_simple_atomic_write $min_i $min_i $testfile -d >>>> +max_i=$((max_awu * 2)) >>>> +_simple_atomic_write $max_i $max_i $testfile -d >>>> + >>>> +# try all of the advertised sizes >>>> +for ((i = min_awu; i <= max_awu; i *= 2)); do >>>> + $XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile >>>> + _test_atomic_file_writes $i $testfile >>>> +done >>>> + >>>> +# does not support buffered io >>>> +echo "one EOPNOTSUPP for buffered atomic" >>>> +_simple_atomic_write 0 $min_awu $testfile >>>> + >>>> +# does not support unaligned directio >>>> +echo "one EINVAL for unaligned directio" >>>> +if [ $sector_size -lt $min_awu ]; then >>>> + _simple_atomic_write $sector_size $min_awu $testfile -d >>>> +else >>>> + # not supported, so fake the output >>>> + echo "pwrite: Invalid argument" >>>> +fi >>>> + >>>> +# success, all done >>>> +echo Silence is golden >>>> +status=0 >>>> +exit >>>> diff --git a/tests/generic/1223.out b/tests/generic/1223.out >>>> new file mode 100644 >>>> index 00000000..edf5bd71 >>>> --- /dev/null >>>> +++ b/tests/generic/1223.out >>>> @@ -0,0 +1,9 @@ >>>> +QA output created by 1223 >>>> +two EINVAL for unsupported sizes >>>> +pwrite: Invalid argument >>>> +pwrite: Invalid argument >>>> +one EOPNOTSUPP for buffered atomic >>>> +pwrite: Operation not supported >>>> +one EINVAL for unaligned directio >>>> +pwrite: Invalid argument >>>> +Silence is golden >>>> diff --git a/tests/generic/1224 b/tests/generic/1224 >>>> new file mode 100755 >>>> index 00000000..3f83eebc >>>> --- /dev/null >>>> +++ b/tests/generic/1224 >>>> @@ -0,0 +1,86 @@ >>>> +#! /bin/bash >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +# Copyright (c) 2025 Oracle. All Rights Reserved. >>>> +# >>>> +# FS QA Test 1224 >>>> +# >>>> +# reflink tests for large atomic writes with mixed mappings >>>> +# >>> >>> Same review points as above case. >>> >>>> +. ./common/preamble >>>> +_begin_fstest auto quick rw atomicwrites >>>> + >>>> +. ./common/atomicwrites >>>> +. ./common/filter >>>> +. ./common/reflink >>>> + >>>> +_require_scratch >>>> +_require_atomic_write_test_commands >>>> +_require_scratch_write_atomic_multi_fsblock >>>> +_require_xfs_io_command pwrite -A >>>> +_require_cp_reflink >>> >>> Do you just need _require_cp_reflink, or need _require_scratch_reflink too? >>> >>> Thanks, >>> Zorro >>> >>>> + >>>> +_scratch_mkfs_sized $((500 * 1048576)) >> $seqres.full 2>&1 >>>> +_scratch_mount >>>> + >>>> +file1=$SCRATCH_MNT/file1 >>>> +file2=$SCRATCH_MNT/file2 >>>> +file3=$SCRATCH_MNT/file3 >>>> + >>>> +touch $file1 >>>> + >>>> +max_awu=$(_get_atomic_write_unit_max $file1) >>>> +test $max_awu -ge 262144 || _notrun "test requires atomic writes up to 256k" >>>> + >>>> +min_awu=$(_get_atomic_write_unit_min $file1) >>>> +test $min_awu -le 4096 || _notrun "test requires atomic writes down to 4k" >>>> + >>>> +bsize=$(_get_file_block_size $SCRATCH_MNT) >>>> +test $max_awu -gt $((bsize * 2)) || \ >>>> + _notrun "max atomic write $max_awu less than 2 fsblocks $bsize" >>>> + >>>> +# reflink tests (files with shared extents) >>>> + >>>> +echo "atomic write shared data and unshared+shared data" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +cp --reflink=always $file1 $file2 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 32768" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> +md5sum $file2 | _filter_scratch >>>> + >>>> +echo "atomic write shared data and shared+unshared data" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +cp --reflink=always $file1 $file2 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 32768 32768" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> +md5sum $file2 | _filter_scratch >>>> + >>>> +echo "atomic overwrite unshared data" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +cp --reflink=always $file1 $file2 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> +md5sum $file2 | _filter_scratch >>>> + >>>> +echo "atomic write shared+unshared+shared data" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +cp --reflink=always $file1 $file2 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> +md5sum $file2 | _filter_scratch >>>> + >>>> +echo "atomic write interweaved hole+unwritten+written+reflinked" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +blksz=4096 >>>> +nr=32 >>>> +_weave_reflink_rainbow $blksz $nr $file1 $file2 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> +md5sum $file2 | _filter_scratch >>>> + >>>> +# success, all done >>>> +status=0 >>>> +exit >>>> diff --git a/tests/generic/1224.out b/tests/generic/1224.out >>>> new file mode 100644 >>>> index 00000000..89e5cd5a >>>> --- /dev/null >>>> +++ b/tests/generic/1224.out >>>> @@ -0,0 +1,16 @@ >>>> +QA output created by 1224 >>>> +atomic write shared data and unshared+shared data >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +f1c9645dbc14efddc7d8a322685f26eb SCRATCH_MNT/file2 >>>> +atomic write shared data and shared+unshared data >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +f1c9645dbc14efddc7d8a322685f26eb SCRATCH_MNT/file2 >>>> +atomic overwrite unshared data >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +f1c9645dbc14efddc7d8a322685f26eb SCRATCH_MNT/file2 >>>> +atomic write shared+unshared+shared data >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +f1c9645dbc14efddc7d8a322685f26eb SCRATCH_MNT/file2 >>>> +atomic write interweaved hole+unwritten+written+reflinked >>>> +4edfbc469bed9965219ea80c9ae54626 SCRATCH_MNT/file1 >>>> +93243a293a9f568903485b0b2a895815 SCRATCH_MNT/file2 >>>> diff --git a/tests/generic/1225 b/tests/generic/1225 >>>> new file mode 100755 >>>> index 00000000..b940afd3 >>>> --- /dev/null >>>> +++ b/tests/generic/1225 >>>> @@ -0,0 +1,127 @@ >>>> +#! /bin/bash >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +# Copyright (c) 2025 Oracle. All Rights Reserved. >>>> +# >>>> +# FS QA Test 1225 >>>> +# >>>> +# basic tests for large atomic writes with mixed mappings >>>> +# >>>> +. ./common/preamble >>>> +_begin_fstest auto quick rw atomicwrites >>>> + >>>> +. ./common/atomicwrites >>>> +. ./common/filter >>>> +. ./common/reflink >>>> + >>>> +_require_scratch >>>> +_require_atomic_write_test_commands >>>> +_require_scratch_write_atomic_multi_fsblock >>>> + >>>> +_scratch_mkfs_sized $((500 * 1048576)) >> $seqres.full 2>&1 >>>> +_scratch_mount >>>> + >>>> +file1=$SCRATCH_MNT/file1 >>>> +file2=$SCRATCH_MNT/file2 >>>> +file3=$SCRATCH_MNT/file3 >>>> + >>>> +touch $file1 >>>> + >>>> +max_awu=$(_get_atomic_write_unit_max $file1) >>>> +test $max_awu -ge 65536 || _notrun "test requires atomic writes up to 64k" >>>> + >>>> +min_awu=$(_get_atomic_write_unit_min $file1) >>>> +test $min_awu -le 4096 || _notrun "test requires atomic writes down to 4k" >>>> + >>>> +bsize=$(_get_file_block_size $SCRATCH_MNT) >>>> +test $max_awu -gt $((bsize * 2)) || \ >>>> + _notrun "max atomic write $max_awu less than 2 fsblocks $bsize" >>>> + >>>> +# non-reflink tests >>>> + >>>> +echo "atomic write hole+mapped+hole" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096000 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write adjacent mapped+hole and hole+mapped" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096000 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 0 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 61440 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 32768" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 32768 32768" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write mapped+hole+mapped" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096000 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 0 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 61440 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write unwritten+mapped+unwritten" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -fc "falloc 0 4096000" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 4096 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write adjacent mapped+unwritten and unwritten+mapped" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -fc "falloc 0 4096000" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 0 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 61440 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 32768" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 32768 32768" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write mapped+unwritten+mapped" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -fc "falloc 0 4096000" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 0 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -D -V1 61440 4096" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write interweaved hole+unwritten+written" >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +blksz=4096 >>>> +nr=32 >>>> +_weave_file_rainbow $blksz $nr $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write at EOF" >>>> +dd if=/dev/zero of=$file1 bs=32K count=12 conv=fsync >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 360448 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +echo "atomic write preallocated region" >>>> +fallocate -l 10M $file1 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file1 >>$seqres.full 2>&1 >>>> +md5sum $file1 | _filter_scratch >>>> + >>>> +# atomic write max size >>>> +dd if=/dev/zero of=$file1 bs=1M count=10 conv=fsync >>$seqres.full 2>&1 >>>> +aw_max=$(_get_atomic_write_unit_max $file1) >>>> +cp $file1 $file1.chk >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 $aw_max" $file1 >>$seqres.full 2>&1 >>>> +$XFS_IO_PROG -c "pwrite 0 $aw_max" $file1.chk >>$seqres.full 2>&1 >>>> +cmp -s $file1 $file1.chk || echo "file1 doesnt match file1.chk" >>>> + >>>> +echo "atomic write max size on fragmented fs" >>>> +avail=`_get_available_space $SCRATCH_MNT` >>>> +filesizemb=$((avail / 1024 / 1024 - 1)) >>>> +fragmentedfile=$SCRATCH_MNT/fragmentedfile >>>> +$XFS_IO_PROG -fc "falloc 0 ${filesizemb}m" $fragmentedfile >>>> +$here/src/punch-alternating $fragmentedfile >>>> +touch $file3 >>>> +$XFS_IO_PROG -dc "pwrite -A -D -V1 0 65536" $file3 >>$seqres.full 2>&1 >>>> +md5sum $file3 | _filter_scratch >>>> + >>>> +# success, all done >>>> +status=0 >>>> +exit >>>> diff --git a/tests/generic/1225.out b/tests/generic/1225.out >>>> new file mode 100644 >>>> index 00000000..c5a6de04 >>>> --- /dev/null >>>> +++ b/tests/generic/1225.out >>>> @@ -0,0 +1,21 @@ >>>> +QA output created by 1225 >>>> +atomic write hole+mapped+hole >>>> +9464b66461bc1d20229e1b71733539d0 SCRATCH_MNT/file1 >>>> +atomic write adjacent mapped+hole and hole+mapped >>>> +9464b66461bc1d20229e1b71733539d0 SCRATCH_MNT/file1 >>>> +atomic write mapped+hole+mapped >>>> +9464b66461bc1d20229e1b71733539d0 SCRATCH_MNT/file1 >>>> +atomic write unwritten+mapped+unwritten >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +atomic write adjacent mapped+unwritten and unwritten+mapped >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +atomic write mapped+unwritten+mapped >>>> +111ce6bf29d5b1dbfb0e846c42719ece SCRATCH_MNT/file1 >>>> +atomic write interweaved hole+unwritten+written >>>> +5577e46f20631d76bbac73ab1b4ed208 SCRATCH_MNT/file1 >>>> +atomic write at EOF >>>> +0e44615ab08f3e8585a374fca9a6f5eb SCRATCH_MNT/file1 >>>> +atomic write preallocated region >>>> +3acf1ace00273bc4e2bf4a8d016611ea SCRATCH_MNT/file1 >>>> +atomic write max size on fragmented fs >>>> +27c9068d1b51da575a53ad34c57ca5cc SCRATCH_MNT/file3 >>>> -- >>>> 2.34.1 >>>> >>>> >>> >> >