| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FSQA Test No. 183 |
| # |
| # Regression test for read corruption of compressed and shared extents after |
| # punching holes into a file. |
| # |
| seq=`basename $0` |
| seqres=$RESULT_DIR/$seq |
| echo "QA output created by $seq" |
| 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 |
| . ./common/reflink |
| |
| # real QA test starts here |
| _supported_fs btrfs |
| _require_scratch_reflink |
| _require_xfs_io_command "fpunch" |
| |
| rm -f $seqres.full |
| |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount "-o compress" |
| |
| # Create a file with 3 consecutive compressed extents, each corresponds to 128Kb |
| # of data (uncompressed size) and each is stored on disk as a 4Kb extent |
| # (compressed size, regardless of compression algorithm used). |
| # Each extent starts with 4Kb of zeroes, while the remaining bytes all have a |
| # value of 0xff. |
| $XFS_IO_PROG -f -c "pwrite -S 0xff 0 384K" \ |
| -c "pwrite -S 0x00 0 4K" \ |
| -c "pwrite -S 0x00 128K 4K" \ |
| -c "pwrite -S 0x00 256K 4K" \ |
| $SCRATCH_MNT/foobar | _filter_xfs_io |
| |
| echo "File digest after initial creation:" |
| md5sum $SCRATCH_MNT/foobar | _filter_scratch |
| |
| # Clone the first extent into offsets 128K and 256K. |
| $XFS_IO_PROG -c "reflink $SCRATCH_MNT/foobar 0 128K 128K" \ |
| -c "reflink $SCRATCH_MNT/foobar 0 256K 128K" \ |
| $SCRATCH_MNT/foobar | _filter_xfs_io |
| |
| echo "File digest after reflinking:" |
| md5sum $SCRATCH_MNT/foobar | _filter_scratch |
| |
| # Punch holes into the regions that are already full of zeroes. |
| $XFS_IO_PROG -c "fpunch 0 4K" \ |
| -c "fpunch 128K 4K" \ |
| -c "fpunch 256K 4K" \ |
| $SCRATCH_MNT/foobar |
| |
| echo "File digest after punching holes:" |
| md5sum $SCRATCH_MNT/foobar | _filter_scratch |
| |
| echo 1 > /proc/sys/vm/drop_caches |
| |
| echo "File digest after dropping page cache:" |
| md5sum $SCRATCH_MNT/foobar | _filter_scratch |
| |
| status=0 |
| exit |