Re: [xfstests PATCH v3] generic: add a partial pages zeroing out test

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

 



On 2025/1/10 2:19, Zorro Lang wrote:
> On Wed, Jan 08, 2025 at 04:44:07PM +0800, Zhang Yi wrote:
>> From: Zhang Yi <yi.zhang@xxxxxxxxxx>
>>
>> This addresses a data corruption issue encountered during partial page
>> zeroing in ext4 which the block size is smaller than the page size [1].
>> Add a new test which is expanded upon generic/567, this test performs a
>> zeroing range test that spans two partial pages to cover this case, and
>> also generalize it to work for non-4k page sizes.
>>
>> Link: https://lore.kernel.org/linux-ext4/20241220011637.1157197-2-yi.zhang@xxxxxxxxxxxxxxx/ [1]
>> Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx>
>> ---
>> v2->v3:
>>  - Put the verifyfile in $SCRATCH_MNT and remove the overriding
>>    _cleanup.
>>  - Correct the test name.
>> v1->v2:
>>  - Add a new test instead of modifying generic/567.
>>  - Generalize the test to work for non-4k page sizes.
>> v2: https://lore.kernel.org/fstests/20241225125120.1952219-1-yi.zhang@xxxxxxxxxxxxxxx/
>> v1: https://lore.kernel.org/fstests/20241223023930.2328634-1-yi.zhang@xxxxxxxxxxxxxxx/
>>
>>  tests/generic/758     | 68 +++++++++++++++++++++++++++++++++++++++++++
>>  tests/generic/758.out |  3 ++
>>  2 files changed, 71 insertions(+)
>>  create mode 100755 tests/generic/758
>>  create mode 100644 tests/generic/758.out
>>
>> diff --git a/tests/generic/758 b/tests/generic/758
>> new file mode 100755
>> index 00000000..bf0a342b
>> --- /dev/null
>> +++ b/tests/generic/758
>> @@ -0,0 +1,68 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2024 Huawei.  All Rights Reserved.
>> +#
>> +# FS QA Test No. 758
>> +#
>> +# Test mapped writes against zero-range to ensure we get the data
>> +# correctly written. This can expose data corruption bugs on filesystems
>> +# where the block size is smaller than the page size.
>> +#
>> +# (generic/567 is a similar test but for punch hole.)
>> +#
>> +. ./common/preamble
>> +_begin_fstest auto quick rw zero
>> +
>> +# Import common functions.
>> +. ./common/filter
>> +
>> +_require_scratch
>> +_require_xfs_io_command "fzero"
>> +
>> +verifyfile=$SCRATCH_MNT/verifyfile
>> +testfile=$SCRATCH_MNT/testfile
>> +
>> +pagesz=$(getconf PAGE_SIZE)
> 
> There's a common helper "_get_page_size" to do this.
> 

Ha, I missed this, thanks for point this out.

>> +
>> +_scratch_mkfs > /dev/null 2>&1
>> +_scratch_mount
>> +
>> +_dump_files()
>> +{
>> +	echo "---- testfile ----"
>> +	_hexdump $testfile
>> +	echo "---- verifyfile --"
>> +	_hexdump $verifyfile
>> +}
>> +
>> +# Build verify file, the data in this file should be consistent with
>> +# that in the test file.
>> +$XFS_IO_PROG -f -c "pwrite -S 0x58 0 $((pagesz * 3))" \
>> +		-c "pwrite -S 0x59 $((pagesz / 2)) $((pagesz * 2))" \
>> +		$verifyfile | _filter_xfs_io >> /dev/null
>                                              ????????
>                                              >> $seqres.full ?

I think both of these are okay, write to $seqres.full also looks fine
to me.

> 
>> +
>> +# Zero out straddling two pages to check that the mapped write after the
>> +# range-zeroing are correctly handled.
>> +$XFS_IO_PROG -t -f \
>> +	-c "pwrite -S 0x58 0 $((pagesz * 3))" \
>> +	-c "mmap -rw 0 $((pagesz * 3))" \
>> +	-c "mwrite -S 0x5a $((pagesz / 2)) $((pagesz * 2))" \
>> +	-c "fzero $((pagesz / 2)) $((pagesz * 2))" \
>> +	-c "mwrite -S 0x59 $((pagesz / 2)) $((pagesz * 2))" \
>> +	-c "close"      \
>> +$testfile | _filter_xfs_io > $seqres.full
>                               ^^
>                               >> $seqres.full
> 
> I'll help to make above tiny changes when I merge it, others looks good
> to me.
> 
> Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx>

Thanks.
Yi.

> 
>> +
>> +echo "==== Pre-Remount ==="
>> +if ! cmp -s $testfile $verifyfile; then
>> +	echo "Data does not match pre-remount."
>> +	_dump_files
>> +fi
>> +_scratch_cycle_mount
>> +echo "==== Post-Remount =="
>> +if ! cmp -s $testfile $verifyfile; then
>> +	echo "Data does not match post-remount."
>> +	_dump_files
>> +fi
>> +
>> +status=0
>> +exit
>> diff --git a/tests/generic/758.out b/tests/generic/758.out
>> new file mode 100644
>> index 00000000..d01c1959
>> --- /dev/null
>> +++ b/tests/generic/758.out
>> @@ -0,0 +1,3 @@
>> +QA output created by 758
>> +==== Pre-Remount ===
>> +==== Post-Remount ==
>> -- 
>> 2.39.2
>>





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux