Re: [PATCH v5 2/3] generic: various atomic write tests with hardware and scsi_debug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> 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
>>>> 
>>>> 
>>> 
>> 
> 





[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux