From: Qu Wenruo Date: Tue, 12 Jan 2021 07:40:24 +0000 (+0800) Subject: btrfs: check qgroup doesn't crash when beyond limit X-Git-Tag: v2022.05.01~571 X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=commitdiff_plain;h=0e195a4ca997436f4237cb6d21edefb6db1f93d7;hp=d6dafbf074d3b66e8104f228d95790a93e3b8b13 btrfs: check qgroup doesn't crash when beyond limit There is a bug that, when btrfs is beyond qgroup limit, touching a file could crash btrfs. Such beyond limit situation needs to be intentionally created, e.g. writing 1GiB file, then limit the subvolume to 512 MiB. As current qgroup works pretty well at preventing us from reaching the limit. This makes existing qgroup test cases unable to detect it. The regression is introduced by commit c53e9653605d ("btrfs: qgroup: try to flush qgroup space when we get -EDQUOT"), and the fix is commit 6f23277a49e6 ("btrfs: qgroup: don't commit transaction when we already hold the handle") Link: https://bugzilla.suse.com/show_bug.cgi?id=1178634 Reviewed-by: Filipe Manana Signed-off-by: Qu Wenruo Signed-off-by: Eryu Guan --- diff --git a/tests/btrfs/230 b/tests/btrfs/230 new file mode 100755 index 00000000..82b28ac1 --- /dev/null +++ b/tests/btrfs/230 @@ -0,0 +1,59 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2020 SUSE Linux Products GmbH. All Rights Reserved. +# +# FS QA Test 230 +# +# Test if btrfs qgroup would crash if we're modifying the fs +# after exceeding the limit +# +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 + +_supported_fs btrfs + +# Need at least 2GiB +_require_scratch_size $((2 * 1024 * 1024)) +_scratch_mkfs > /dev/null 2>&1 +_scratch_mount + +_pwrite_byte 0xcd 0 1G $SCRATCH_MNT/file >> $seqres.full +# Make sure the data reach disk so later qgroup scan can see it +sync + +$BTRFS_UTIL_PROG quota enable $SCRATCH_MNT +$BTRFS_UTIL_PROG quota rescan -w $SCRATCH_MNT >> $seqres.full + +# Set the limit to just 512MiB, which is way below the existing usage +$BTRFS_UTIL_PROG qgroup limit 512M 0/5 $SCRATCH_MNT + +# Touch above file, if kernel not patched, it will trigger an ASSERT() +# +# Even for patched kernel, we will still get EDQUOT error, but that +# is expected behavior. +touch $SCRATCH_MNT/file 2>&1 | _filter_scratch + +# success, all done +status=0 +exit diff --git a/tests/btrfs/230.out b/tests/btrfs/230.out new file mode 100644 index 00000000..a066e1ab --- /dev/null +++ b/tests/btrfs/230.out @@ -0,0 +1,2 @@ +QA output created by 230 +touch: setting times of 'SCRATCH_MNT/file': Disk quota exceeded diff --git a/tests/btrfs/group b/tests/btrfs/group index 79347b8f..a7c65983 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -232,3 +232,4 @@ 227 auto quick send 228 auto quick volume 229 auto quick send clone +230 auto quick qgroup limit