#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2020 Facebook. All Rights Reserved. # # FS QA Test 172 # # Validate that without no-holes we do not get an i_size that is after a gap in # the file extents on disk. 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 # Modify as appropriate. _supported_fs btrfs _require_scratch _require_log_writes _require_xfs_io_command "sync_range" _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 $XFS_IO_PROG -f -c "pwrite 0 5m" $SCRATCH_MNT/file | _filter_xfs_io $XFS_IO_PROG -f -c "sync_range -abw 4m 1m" $SCRATCH_MNT/file | _filter_xfs_io # Now wait for a transaction commit to happen, wait 2x just to be super sure 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