57284d2ada
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>
109 lines
3.4 KiB
Bash
Executable File
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
|