mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
97575acd74
This test has been failing for btrfs for quite some time, at least since 4.7. There are 2 implementation details of btrfs that it exposes: 1. Currently btrfs filesystem under 100mb are created in Mixed block group mode. Freespace accounting for it is not 100% accurate - I've observed consistent 1mb discrepancy between a newly created filesystem, then writing a file and deleting it and checking the free space. 2. BTRFS won't flush it's delayed allocation on file deletion if less than 32mb are deleted. On such files we need to perform sync (missing in the test) or wait until time elapses for transaction commit. In order to avoid both of the aforementioned idiosyncrasies of the fs make the test filesystem 101mb. With this we achieve 2 things: 1. Since the filesystem is larger we can create a file larger than 32mb, so it's going to be flushed upon deletion and numbers acquired from df will be accurate 2. We don't create the filesystem in mixed mode and also since the 1mb is less than %1 of 101mb we will fall within the tolerance of 1% Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
131 lines
2.8 KiB
Bash
Executable File
131 lines
2.8 KiB
Bash
Executable File
#! /bin/bash
|
|
# FS QA Test No. 015
|
|
#
|
|
# check out-of-space behaviour
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # success is the default!
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
|
|
_cleanup()
|
|
{
|
|
_scratch_unmount
|
|
}
|
|
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_free()
|
|
{
|
|
_df_dir $SCRATCH_MNT | $AWK_PROG '{ print $5 }'
|
|
}
|
|
|
|
# real QA test starts here
|
|
_supported_fs generic
|
|
_supported_os Linux
|
|
|
|
_require_scratch
|
|
_require_no_large_scratch_dev
|
|
|
|
# With filesystems less than 100mb btrfs is created in mixed mode
|
|
# which can lead to slight accounting errors of 1mb. Having the
|
|
# fs be at least 101 mb ensures those errors are within the error
|
|
# tolerance of 1%
|
|
_scratch_mkfs_sized `expr 101 \* 1024 \* 1024` >/dev/null 2>&1 \
|
|
|| _fail "mkfs failed"
|
|
_scratch_mount || _fail "mount failed"
|
|
out=$SCRATCH_MNT/fillup.$$
|
|
rm -f $seqres.full
|
|
|
|
free0=`_free`
|
|
if [ -z "$free0" ]
|
|
then
|
|
echo " *** failed to get free space (0)"
|
|
exit 1
|
|
fi
|
|
echo "free space at start $free0" >> $seqres.full
|
|
|
|
echo "fill disk:" # well, filesystem really - not disk
|
|
|
|
POSIXLY_CORRECT=yes dd if=/dev/zero of=$out bs=1024k 2>&1 | _filter_dd
|
|
|
|
echo "check free space:"
|
|
|
|
free1=`_free`
|
|
if [ -z "$free1" ]
|
|
then
|
|
echo " *** failed to get free space (1)"
|
|
exit 1
|
|
fi
|
|
echo "free space after fill $free1" >> $seqres.full
|
|
|
|
if [ ! -e $out ]
|
|
then
|
|
echo " *** file not created"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -s $out ]
|
|
then
|
|
echo " *** file created with zero length"
|
|
ls -l $out
|
|
exit 1
|
|
fi
|
|
|
|
echo "delete fill:"
|
|
|
|
if ! rm $out
|
|
then
|
|
echo " *** file not deleted"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -e $out ]
|
|
then
|
|
echo " *** file still exists"
|
|
ls -l $out
|
|
exit 1
|
|
fi
|
|
|
|
echo "check free space:"
|
|
|
|
free2=`_free`
|
|
if [ -z "$free2" ]
|
|
then
|
|
echo " *** failed to get free space (2)"
|
|
exit 1
|
|
fi
|
|
echo "free space after delete $free2" >> $seqres.full
|
|
|
|
echo -n " !!! "
|
|
_within_tolerance "free space" $free2 $free0 1% -v
|
|
|
|
status=0
|
|
exit
|