Files
apfstests/tests/generic/064
T
Eric Whitney 4fbcbdf76b generic/064: allow room for unexpected allocation behavior
Per Dave Chinner's suggestion, modify generic/064 so that it won't fail
if it finds a few more extents than it expects in its test file after
inserting ranges.  When 064's test file is first created, some file
systems may use more than the ideal minimum single extent to represent
it, and this can lead to a mismatch between the actual and expected
extent count after the ranges have been inserted.  Ext4 file systems
mounted with delayed allocation disabled can exhibit this behavior
if a test file's blocks happen to be allocated across regions of file
system metadata.

Also, replace the open coded counting of extents and holes with a
simpler call to _count_extents(), and clarify some comments.

Signed-off-by: Eric Whitney <enwlinux@gmail.com>
Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
2015-09-21 11:05:26 +10:00

98 lines
2.9 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test No. generic/064
#
# Test multiple fallocate insert/collapse range calls on same file.
# Call insert range on alternate blocks multiple times until the file
# is left with 50 extents and as many holes. Then call collapse range
# on the previously inserted ranges to test merge code of collapse
# range. Also check for data integrity and file system consistency.
#-----------------------------------------------------------------------
# Copyright (c) 2015 Samsung Electronics. 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 # failure is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs generic
_supported_os Linux
_require_scratch
_require_xfs_io_command "fiemap"
_require_xfs_io_command "finsert"
_require_xfs_io_command "fcollapse"
src=$SCRATCH_MNT/testfile
dest=$SCRATCH_MNT/testfile.dest
BLOCKS=100
BSIZE=`get_block_size $SCRATCH_MNT`
rm -f $seqres.full
_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
_scratch_mount || _fail "mount failed"
length=$(($BLOCKS * $BSIZE))
# Write file
_do "$XFS_IO_PROG -f -c \"pwrite 0 $length\" -c fsync $src"
cp $src $dest
extent_before=`_count_extents $dest`
# Insert alternate blocks
for (( j=0; j < $(($BLOCKS/2)); j++ )); do
offset=$((($j*$BSIZE)*2))
_do "$XFS_IO_PROG -c \"finsert $offset $BSIZE\" $dest"
done
# Check if 50 extents are present, allowing some slop for file systems
# that don't have ideal allocation behavior
num_extents=`_count_extents $dest`
_within_tolerance "Extent count after inserts" $num_extents 50 0 6% -v
_check_scratch_fs
if [ $? -ne 0 ]; then
status=1
exit
fi
# Collapse alternate blocks
for (( j=0; j < $(($BLOCKS/2)); j++ )); do
offset=$((($j*$BSIZE)))
_do "$XFS_IO_PROG -c \"fcollapse $offset $BSIZE\" $dest"
done
extent_after=`_count_extents $dest`
if [ $extent_before -ne $extent_after ]; then
echo "extents mismatched before = $extent_before after = $extent_after"
fi
# compare original file and test file.
cmp $src $dest || _fail "file bytes check failed"
# success, all done
status=0
exit