6bfc907dee
102 truncates a qcow2 file (the raw file) on purpose while a VM is running. However, image locking will usually prevent exactly this. The fact that most people have not noticed until now (I suppose you may have seen sporadic failures, but not taken them too seriously, like me) further shows that this truncation is actually not really done concurrently, but that the VM is still starting up by this point and has not yet opened the image. Remedy this by waiting for the monitor shell to appear before the qemu-img invocation so we know the VM is up. Signed-off-by: Max Reitz <mreitz@redhat.com> Message-id: 20171129185102.29390-1-mreitz@redhat.com Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
87 lines
2.3 KiB
Bash
Executable File
87 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Test case for qemu-io -c map and qemu-img map
|
|
#
|
|
# 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"
|
|
|
|
here=$PWD
|
|
status=1 # failure is the default!
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_qemu
|
|
_cleanup_test_img
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and qemu instance handling
|
|
. ./common.rc
|
|
. ./common.filter
|
|
. ./common.qemu
|
|
|
|
_supported_fmt qcow2
|
|
_supported_proto file
|
|
_supported_os Linux
|
|
|
|
IMG_SIZE=64K
|
|
|
|
echo
|
|
echo '=== Testing map command on truncated image ==='
|
|
echo
|
|
|
|
_make_test_img $IMG_SIZE
|
|
# Create cluster
|
|
$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
|
|
# Remove data cluster from image (first cluster: image header, second: reftable,
|
|
# third: refblock, fourth: L1 table, fifth: L2 table)
|
|
$QEMU_IMG resize -f raw --shrink "$TEST_IMG" $((5 * 64 * 1024))
|
|
|
|
$QEMU_IO -c map "$TEST_IMG"
|
|
$QEMU_IMG map "$TEST_IMG"
|
|
|
|
echo
|
|
echo '=== Testing map on an image file truncated outside of qemu ==='
|
|
echo
|
|
|
|
# Same as above, only now we concurrently truncate and map the image
|
|
_make_test_img $IMG_SIZE
|
|
$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
qemu_comm_method=monitor _launch_qemu -drive if=none,file="$TEST_IMG",id=drv0
|
|
|
|
# Wait for a prompt to appear (so we know qemu has opened the image)
|
|
_send_qemu_cmd '' '(qemu)'
|
|
|
|
$QEMU_IMG resize --shrink --image-opts \
|
|
"driver=raw,file.driver=file,file.filename=$TEST_IMG,file.locking=off" \
|
|
$((5 * 64 * 1024))
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE 'qemu-io drv0 map' 'allocated' \
|
|
| sed -e 's/^(qemu).*qemu-io drv0 map...$/(qemu) qemu-io drv0 map/'
|
|
_send_qemu_cmd $QEMU_HANDLE 'quit' ''
|
|
|
|
# success, all done
|
|
echo '*** done'
|
|
rm -f $seq.full
|
|
status=0
|