blob: 00b3658d449f956f999906ef0ff4609366cb145f [file] [log] [blame]
#! /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 mmap
# Import common functions.
. ./common/filter
_require_scratch
_require_xfs_io_command "fzero"
verifyfile=$SCRATCH_MNT/verifyfile
testfile=$SCRATCH_MNT/testfile
pagesz=$(_get_page_size)
_scratch_mkfs >> $seqres.full 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 >> $seqres.full
# 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
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