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>
92 lines
3.4 KiB
Bash
Executable File
92 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Test case for non-self-referential qcow2 refcount blocks
|
|
#
|
|
# Copyright (C) 2014 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
|
|
|
|
_supported_fmt qcow2
|
|
_supported_proto file fuse
|
|
# This test relies on refcounts being 64 bits wide (which does not work with
|
|
# compat=0.10)
|
|
_unsupported_imgopts 'refcount_bits=\([^6]\|.\([^4]\|$\)\)' 'compat=0.10'
|
|
|
|
echo
|
|
echo '=== Testing large refcount and L1 table ==='
|
|
echo
|
|
|
|
# Create an image with an L1 table and a refcount table that each span twice the
|
|
# number of clusters which can be described by a single refblock; therefore, at
|
|
# least two refblocks cannot count their own refcounts because all the clusters
|
|
# they describe are part of the L1 table or refcount table.
|
|
|
|
# One refblock can describe (with cluster_size=512 and refcount_bits=64)
|
|
# 512/8 = 64 clusters, therefore the L1 table should cover 128 clusters, which
|
|
# equals 128 * (512/8) = 8192 entries (actually, 8192 - 512/8 = 8129 would
|
|
# suffice, but it does not really matter). 8192 L2 tables can in turn describe
|
|
# 8192 * 512/8 = 524,288 clusters which cover a space of 256 MB.
|
|
|
|
# Since with refcount_bits=64 every refcount block entry is 64 bits wide (just
|
|
# like the L2 table entries), the same calculation applies to the refcount table
|
|
# as well; the difference is that while for the L1 table the guest disk size is
|
|
# concerned, for the refcount table it is the image length that has to be at
|
|
# least 256 MB. We can achieve that by using preallocation=metadata for an image
|
|
# which has a guest disk size of 256 MB.
|
|
|
|
_make_test_img -o "refcount_bits=64,cluster_size=512,preallocation=metadata" 256M
|
|
|
|
# We know for sure that the L1 and refcount tables do not overlap with any other
|
|
# structure because the metadata overlap checks would have caught that case.
|
|
|
|
# Because qemu refuses to open qcow2 files whose L1 table does not cover the
|
|
# whole guest disk size, it is definitely large enough. On the other hand, to
|
|
# test whether the refcount table is large enough, we simply have to verify that
|
|
# indeed all the clusters are allocated, which is done by qemu-img check.
|
|
|
|
# The final thing we need to test is whether the tables are actually covered by
|
|
# refcount blocks; since all clusters of the tables are referenced, we can use
|
|
# qemu-img check for that purpose, too.
|
|
|
|
$QEMU_IMG check "$TEST_IMG" | \
|
|
sed -e 's/^.* = \([0-9]\+\.[0-9]\+% allocated\).*\(clusters\)$/\1 \2/' \
|
|
-e '/^Image end offset/d'
|
|
|
|
# (Note that we cannot use _check_test_img because that function filters out the
|
|
# allocation status)
|
|
|
|
# success, all done
|
|
echo '*** done'
|
|
rm -f $seq.full
|
|
status=0
|