qemu-e2k/tests/qemu-iotests/138
Max Reitz 57284d2ada iotests: Enable fuse for many tests
Many tests (that do not support generic protocols) can run just fine
with FUSE-exported images, so allow them to.  Note that this is no
attempt at being definitely complete.  There are some tests that might
be modified to run on FUSE, but this patch still skips them.  This patch
only tries to pick the rather low-hanging fruits.

Note that 221 and 250 only pass when .lseek is correctly implemented,
which is only possible with a libfuse that is 3.8 or newer.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20201027190600.192171-20-mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2020-12-11 17:52:40 +01:00

109 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# General test case for qcow2's image check
#
# Copyright (C) 2015 Red Hat, Inc.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will 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, see <http://www.gnu.org/licenses/>.
#
# creator
owner=mreitz@redhat.com
seq="$(basename $0)"
echo "QA output created by $seq"
status=1 # failure is the default!
_cleanup()
{
_cleanup_test_img
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
# This tests qcow2-specific low-level functionality
_supported_fmt qcow2
_supported_proto file fuse
_supported_os Linux
# With an external data file, data clusters are not refcounted
# (so qemu-img check would not do much);
# we want to modify the refcounts, so we need them to have a specific
# format (namely u16)
_unsupported_imgopts data_file 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
echo
echo '=== Check on an image with a multiple of 2^32 clusters ==='
echo
_make_test_img -o "cluster_size=512" 512
# Allocate L2 table
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
# Put the data cluster at a multiple of 2 TB, resulting in the image apparently
# having a multiple of 2^32 clusters
# (To be more specific: It is at 32 PB)
poke_file "$TEST_IMG" $((2048 + 8)) "\x00\x80\x00\x00\x00\x00\x00\x00"
# An offset of 32 PB results in qemu-img check having to allocate an in-memory
# refcount table of 128 TB (16 bit refcounts, 512 byte clusters), if qemu-img
# don't check that referenced data cluster is far beyond the end of file.
# But starting from 4.0, qemu-img does this check, and instead of "Cannot
# allocate memory", we have an error showing that l2 entry is invalid.
_check_test_img
echo
echo '=== Check leaks-fixed/corruptions-fixed report'
echo
# After leaks and corruptions were fixed, those numbers should be
# reported by qemu-img check
_make_test_img 64k
# Allocate data cluster
$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
reftable_ofs=$(peek_file_be "$TEST_IMG" 48 8)
refblock_ofs=$(peek_file_be "$TEST_IMG" $reftable_ofs 8)
# Introduce a leak: Make the image header's refcount 2
poke_file_be "$TEST_IMG" "$refblock_ofs" 2 2
l1_ofs=$(peek_file_be "$TEST_IMG" 40 8)
# Introduce a corruption: Drop the COPIED flag from the (first) L1 entry
l1_entry=$(peek_file_be "$TEST_IMG" $l1_ofs 8)
l1_entry=$((l1_entry & ~(1 << 63)))
poke_file_be "$TEST_IMG" $l1_ofs 8 $l1_entry
echo
# Should print the number of corruptions and leaks fixed
# (Filter out all JSON fields (recognizable by their four-space
# indentation), but keep the "-fixed" fields (by removing two spaces
# from their indentation))
# (Also filter out the L1 entry, because why not)
_check_test_img -r all --output=json \
| sed -e 's/^ \(.*\)-fixed"/\1-fixed"/' \
-e '/^ /d' \
-e "s/\\([^0-9a-f]\\)$(printf %x $l1_entry)\\([^0-9a-f]\\)/\1L1_ENTRY_VALUE\2/"
# success, all done
echo "*** done"
rm -f $seq.full
status=0