#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2020 Facebook. All Rights Reserved. # # FS QA Test 206 # # Validate that without no-holes we do not get a i_size that is after a gap in # the file extents on disk when punching a hole past i_size. This is fixed by # the following patches # # btrfs: use the file extent tree infrastructure # btrfs: replace all uses of btrfs_ordered_update_i_size # 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 . ./common/dmlogwrites # remove previous $seqres.full before test rm -f $seqres.full # real QA test starts here _supported_fs btrfs _require_test _require_scratch _require_log_writes _require_xfs_io_command "falloc" "-k" _require_xfs_io_command "fpunch" _log_writes_init $SCRATCH_DEV _log_writes_mkfs "-O ^no-holes" >> $seqres.full 2>&1 # There's not a straightforward way to commit the transaction without also # flushing dirty pages, so shorten the commit interval to 1 so we're sure to get # a commit with our broken file _log_writes_mount -o commit=1 # This creates a gap extent because fpunch doesn't insert hole extents past # i_size $XFS_IO_PROG -f -c "falloc -k 4k 8k" $SCRATCH_MNT/file $XFS_IO_PROG -f -c "fpunch 4k 4k" $SCRATCH_MNT/file # The pwrite extends the i_size to cover the gap extent, and then the truncate # sets the disk_i_size to 12k because it assumes everything was a-ok. $XFS_IO_PROG -f -c "pwrite 0 4k" $SCRATCH_MNT/file | _filter_xfs_io $XFS_IO_PROG -f -c "pwrite 0 8k" $SCRATCH_MNT/file | _filter_xfs_io $XFS_IO_PROG -f -c "truncate 12k" $SCRATCH_MNT/file # Wait for a transaction commit sleep 2 _log_writes_unmount _log_writes_remove cur=$(_log_writes_find_next_fua 0) echo "cur=$cur" >> $seqres.full while [ ! -z "$cur" ]; do _log_writes_replay_log_range $cur $SCRATCH_DEV >> $seqres.full # We only care about the fs consistency, so just run fsck, we don't have # to mount the fs to validate it _check_scratch_fs cur=$(_log_writes_find_next_fua $(($cur + 1))) done # success, all done status=0 exit