There was an issue where with with filesize > 4G, map.m_lblk was getting overflow in buff-IO path while converting unwritten to written extent with dioread_nolock mount option with bs < ps. Adding a testcase for the same. This test doesn't force any explicit mount option within the test, as it will be set anyway along with test config, although it does force for blocksize < pagesize config (as this test is specific to that). Patch at [1] fixes the issue. [1]: https://patchwork.ozlabs.org/patch/1378632 Signed-off-by: Ritesh Harjani <riteshh@xxxxxxxxxxxxx> --- tests/ext4/046 | 101 +++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/046.out | 2 + tests/ext4/group | 1 + 3 files changed, 104 insertions(+) create mode 100755 tests/ext4/046 create mode 100644 tests/ext4/046.out diff --git a/tests/ext4/046 b/tests/ext4/046 new file mode 100755 index 000000000000..49de6bbb2c89 --- /dev/null +++ b/tests/ext4/046 @@ -0,0 +1,101 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2020 IBM Corporation. All Rights Reserved. +# +# FS QA Test No. generic/046 +# +# Test writes to falloc file with filesize > 4GB and make sure to verify +# the file checksum both before and after mount. +# This test is to check whether unwritten extents gets properly converted +# to written extent on a filesystem with bs < ps. +# +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# Modify as appropriate. +_supported_fs ext4 +_supported_os Linux +_require_scratch +_require_xfs_io_command "falloc" + +# keep 4k as a blksz for 64k pagesz +pagesz=$(getconf PAGE_SIZE) +if [ $pagesz -eq 65536 ]; then + blksz=4096 +else + blksz=$(($pagesz/4)) +fi + +devsize=`blockdev --getsize64 $SCRATCH_DEV` +if [ $devsize -lt 6442450944 ]; then + _notrun "Too small scratch device, need at least 6G" +fi + +# Test for bs < ps +export MKFS_OPTIONS="-F -b $blksz" +_scratch_mkfs >> $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +# check blksz +real_blksz=$(_get_file_block_size $SCRATCH_MNT) +test $real_blksz != $blksz && _notrun "Failed to format with small blocksize." + +testfile=$SCRATCH_MNT/testfile-$seq + +# Fallocate testfile with size > 4G +fsize=$((5 * 1024 * 1024 * 1024)) +$XFS_IO_PROG -f -c "falloc 0 $fsize" $testfile >> $seqres.full 2>&1 + +# First write at offset < 4G (at few alternative blks) +off=$((3 * 1024 * 1024 * 1024)) +for i in 1 2 3 4; do + $XFS_IO_PROG -f \ + -c "pwrite $off $blksz" \ + $testfile >> $seqres.full 2>&1 + off=$(($off + (2*$blksz))) +done + +# Then write at offset > 4G (at few alternative blks) to check +# any 32bit overflow case in map.m_lblk +off=$((4 * 1024 * 1024 * 1024)) +for i in 1 2 3 4; do + $XFS_IO_PROG -f \ + -c "pwrite $off $blksz" \ + $testfile >> $seqres.full 2>&1 + off=$(($off + (2*$blksz))) +done + +# ==== Pre-Remount === +md5_pre=`md5sum $testfile | cut -d' ' -f1` +echo "Pre-Remount md5sum of $testfile = $md5_pre" >> $seqres.full + +_scratch_cycle_mount + +# ==== Post-Remount === +md5_post=`md5sum $testfile | cut -d' ' -f1` +echo "Post-Remount md5sum of $testfile = $md5_post" >> $seqres.full +test $md5_pre != $md5_post && echo "md5sum mismatch" + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/ext4/046.out b/tests/ext4/046.out new file mode 100644 index 000000000000..52c445eb70bb --- /dev/null +++ b/tests/ext4/046.out @@ -0,0 +1,2 @@ +QA output created by 046 +Silence is golden diff --git a/tests/ext4/group b/tests/ext4/group index 40351fd9ca0c..02a499a9d220 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -48,6 +48,7 @@ 043 auto quick 044 auto quick 045 auto dir +046 auto quick 271 auto rw quick 301 aio auto ioctl rw stress defrag 302 aio auto ioctl rw stress defrag -- 2.26.2