#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved. # # FS QA Test btrfs/193 # # Test if btrfs is going to leak qgroup reserved data space when # falloc on multiple holes fails. # The fix is titled: # "btrfs: qgroup: Fix the wrong target io_tree when freeing reserved data space" # 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 # real QA test starts here # Modify as appropriate. _supported_fs btrfs _supported_os Linux _require_scratch _require_xfs_io_command falloc _scratch_mkfs > /dev/null _scratch_mount $BTRFS_UTIL_PROG quota enable "$SCRATCH_MNT" > /dev/null $BTRFS_UTIL_PROG quota rescan -w "$SCRATCH_MNT" > /dev/null $BTRFS_UTIL_PROG qgroup limit -e 256M "$SCRATCH_MNT" # Create a file with the following layout: # 0 128M 256M 384M # | Hole |4K| Hole |4K| Hole | # The total hole size will be 384M - 8k truncate -s 384m "$SCRATCH_MNT/file" $XFS_IO_PROG -c "pwrite 128m 4k" -c "pwrite 256m 4k" \ "$SCRATCH_MNT/file" | _filter_xfs_io # Falloc 0~384M range, it's going to fail due to the qgroup limit $XFS_IO_PROG -c "falloc 0 384m" "$SCRATCH_MNT/file" | _filter_xfs_io_error rm -f "$SCRATCH_MNT/file" # Ensure above delete reaches disk and free some space sync # We should be able to write at least 3/4 of the limit $XFS_IO_PROG -f -c "pwrite 0 192m" "$SCRATCH_MNT/file" | _filter_xfs_io # success, all done status=0 exit