2019-03-07 15:58:38 +01:00
|
|
|
#!/usr/bin/env bash
|
2010-06-14 11:17:54 +02:00
|
|
|
#
|
|
|
|
# qcow2 error path testing
|
|
|
|
#
|
|
|
|
# Copyright (C) 2010 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=kwolf@redhat.com
|
|
|
|
|
|
|
|
seq=`basename $0`
|
|
|
|
echo "QA output created by $seq"
|
|
|
|
|
|
|
|
status=1 # failure is the default!
|
|
|
|
|
|
|
|
_cleanup()
|
|
|
|
{
|
|
|
|
_cleanup_test_img
|
2013-09-25 14:12:22 +02:00
|
|
|
rm "$TEST_DIR/blkdebug.conf"
|
2020-02-25 15:31:30 +01:00
|
|
|
rm -f "$TEST_IMG.data_file"
|
2010-06-14 11:17:54 +02:00
|
|
|
}
|
|
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
|
|
|
|
# get standard environment, filters and checks
|
|
|
|
. ./common.rc
|
|
|
|
. ./common.filter
|
|
|
|
. ./common.pattern
|
|
|
|
|
|
|
|
# Currently only qcow2 supports rebasing
|
|
|
|
_supported_fmt qcow2
|
2020-10-27 20:05:59 +01:00
|
|
|
_supported_proto file fuse
|
2019-08-27 19:34:32 +02:00
|
|
|
_default_cache_mode writethrough
|
|
|
|
_supported_cache_modes writethrough none
|
2015-02-18 23:40:48 +01:00
|
|
|
# The refcount table tests expect a certain minimum width for refcount entries
|
|
|
|
# (so that the refcount table actually needs to grow); that minimum is 16 bits,
|
|
|
|
# being the default refcount entry width.
|
|
|
|
# 32 and 64 bits do not work either, however, due to different leaked cluster
|
|
|
|
# count on error.
|
|
|
|
# Thus, the only remaining option is refcount_bits=16.
|
2019-11-07 17:37:07 +01:00
|
|
|
#
|
|
|
|
# As for data_file, none of the refcount tests can work for it.
|
|
|
|
_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' \
|
|
|
|
data_file
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
echo "Errors while writing 128 kB"
|
|
|
|
echo
|
|
|
|
|
|
|
|
CLUSTER_SIZE=1024
|
|
|
|
|
|
|
|
BLKDBG_TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG"
|
|
|
|
|
|
|
|
for event in \
|
|
|
|
l1_update \
|
|
|
|
\
|
|
|
|
l2_load \
|
|
|
|
l2_update \
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 09:52:55 +01:00
|
|
|
l2_alloc_write \
|
2010-06-14 11:17:54 +02:00
|
|
|
\
|
|
|
|
write_aio \
|
|
|
|
\
|
|
|
|
refblock_load \
|
|
|
|
refblock_update_part \
|
|
|
|
refblock_alloc \
|
|
|
|
\
|
|
|
|
cluster_alloc \
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
for errno in 5 28; do
|
|
|
|
for imm in off; do
|
|
|
|
for once in on off; do
|
|
|
|
for vmstate in "" "-b"; do
|
|
|
|
|
2013-09-25 14:12:22 +02:00
|
|
|
cat > "$TEST_DIR/blkdebug.conf" <<EOF
|
2010-06-14 11:17:54 +02:00
|
|
|
[inject-error]
|
|
|
|
event = "$event"
|
|
|
|
errno = "$errno"
|
|
|
|
immediately = "$imm"
|
|
|
|
once ="$once"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
_make_test_img 1G
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate"
|
2011-04-29 15:32:55 +02:00
|
|
|
|
|
|
|
# We want to catch a simple L2 update, not the allocation of the first L2 table
|
|
|
|
if [ "$event" == "l2_update" ]; then
|
2013-09-25 14:12:22 +02:00
|
|
|
$QEMU_IO -c "write $vmstate 0 512" "$TEST_IMG" > /dev/null 2>&1
|
2011-04-29 15:32:55 +02:00
|
|
|
fi
|
|
|
|
|
2013-09-25 14:12:22 +02:00
|
|
|
$QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
# l2_load is not called on allocation, so issue a second write
|
|
|
|
# Reads are another path to trigger l2_load, so do a read, too
|
|
|
|
if [ "$event" == "l2_load" ]; then
|
2013-09-25 14:12:22 +02:00
|
|
|
$QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "read $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
2010-06-14 11:17:54 +02:00
|
|
|
fi
|
|
|
|
|
2019-09-16 19:53:20 +02:00
|
|
|
_check_test_img_ignore_leaks 2>&1 | grep -v "refcount=1 reference=0"
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
echo
|
2017-04-27 00:10:46 +02:00
|
|
|
echo === Refcount table growth tests ===
|
2010-06-14 11:17:54 +02:00
|
|
|
echo
|
|
|
|
CLUSTER_SIZE=512
|
|
|
|
|
|
|
|
|
|
|
|
for event in \
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 09:52:55 +01:00
|
|
|
refblock_alloc_hookup \
|
|
|
|
refblock_alloc_write \
|
|
|
|
refblock_alloc_write_blocks \
|
|
|
|
refblock_alloc_write_table \
|
|
|
|
refblock_alloc_switch_table \
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
# This one takes a while, so let's test only one error code (ENOSPC should
|
|
|
|
# never be generated by qemu, so it's probably a good choice)
|
|
|
|
for errno in 28; do
|
|
|
|
for imm in off; do
|
|
|
|
for once in on off; do
|
|
|
|
for vmstate in "" "-b"; do
|
|
|
|
|
2013-09-25 14:12:22 +02:00
|
|
|
cat > "$TEST_DIR/blkdebug.conf" <<EOF
|
2010-06-14 11:17:54 +02:00
|
|
|
[inject-error]
|
|
|
|
event = "$event"
|
|
|
|
errno = "$errno"
|
|
|
|
immediately = "$imm"
|
|
|
|
once = "$once"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
_make_test_img 1G
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate"
|
2013-09-25 14:12:22 +02:00
|
|
|
$QEMU_IO -c "write $vmstate 0 64M" "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
2010-06-14 11:17:54 +02:00
|
|
|
|
2019-09-16 19:53:20 +02:00
|
|
|
_check_test_img_ignore_leaks 2>&1 | grep -v "refcount=1 reference=0"
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo === L1 growth tests ===
|
|
|
|
echo
|
|
|
|
CLUSTER_SIZE=1024
|
|
|
|
|
|
|
|
|
|
|
|
for event in \
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 09:52:55 +01:00
|
|
|
l1_grow_alloc_table \
|
|
|
|
l1_grow_write_table \
|
|
|
|
l1_grow_activate_table \
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
for errno in 5 28; do
|
|
|
|
for imm in off; do
|
|
|
|
for once in on off; do
|
|
|
|
|
2013-09-25 14:12:22 +02:00
|
|
|
cat > "$TEST_DIR/blkdebug.conf" <<EOF
|
2010-06-14 11:17:54 +02:00
|
|
|
[inject-error]
|
|
|
|
event = "$event"
|
|
|
|
errno = "$errno"
|
|
|
|
immediately = "$imm"
|
|
|
|
once = "$once"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
_make_test_img 1G
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "Event: $event; errno: $errno; imm: $imm; once: $once"
|
2013-09-25 14:12:22 +02:00
|
|
|
$QEMU_IO -c "write -b 0 64k" "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
2010-06-14 11:17:54 +02:00
|
|
|
|
2019-09-16 19:53:20 +02:00
|
|
|
_check_test_img_ignore_leaks 2>&1 | grep -v "refcount=1 reference=0"
|
2010-06-14 11:17:54 +02:00
|
|
|
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
2018-06-28 17:18:51 +02:00
|
|
|
echo
|
|
|
|
echo === Avoid cluster leaks after temporary failure ===
|
|
|
|
echo
|
|
|
|
|
|
|
|
cat > "$TEST_DIR/blkdebug.conf" <<EOF
|
|
|
|
[inject-error]
|
|
|
|
event = "write_aio"
|
|
|
|
errno = "5"
|
|
|
|
once = "on"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# After the failed first write, do a second write so that the updated refcount
|
|
|
|
# block is actually written back
|
|
|
|
_make_test_img 64M
|
|
|
|
$QEMU_IO -c "write 0 1M" -c "write 0 1M" "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
|
|
|
_check_test_img
|
|
|
|
|
2020-02-25 15:31:29 +01:00
|
|
|
echo
|
|
|
|
echo === Avoid freeing preallocated zero clusters on failure ===
|
|
|
|
echo
|
|
|
|
|
|
|
|
cat > "$TEST_DIR/blkdebug.conf" <<EOF
|
|
|
|
[inject-error]
|
|
|
|
event = "write_aio"
|
|
|
|
errno = "5"
|
|
|
|
once = "on"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
_make_test_img $CLUSTER_SIZE
|
|
|
|
# Create a preallocated zero cluster
|
|
|
|
$QEMU_IO -c "write 0 $CLUSTER_SIZE" -c "write -z 0 $CLUSTER_SIZE" "$TEST_IMG" \
|
|
|
|
| _filter_qemu_io
|
|
|
|
# Try to overwrite it (prompting an I/O error from blkdebug), thus
|
|
|
|
# triggering the alloc abort code
|
|
|
|
$QEMU_IO -c "write 0 $CLUSTER_SIZE" "$BLKDBG_TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
_check_test_img
|
|
|
|
|
2010-06-14 11:17:54 +02:00
|
|
|
# success, all done
|
|
|
|
echo "*** done"
|
|
|
|
rm -f $seq.full
|
|
|
|
status=0
|