6bd858b311
The previous patch fixed the inherits_from pointer after block-stream, and this one does the same for block-commit. When block-commit finishes and the 'top' node is not the topmost one from the backing chain then all nodes above 'base' up to and including 'top' are removed from the chain. The bdrv_drop_intermediate() call converts a chain like this one: base <- intermediate <- top <- active into this one: base <- active In a simple scenario each backing file from the first chain has the inherits_from attribute pointing to its parent. This means that reopening 'active' will recursively reopen all its children, whose options can be changed in the process. However after the 'block-commit' call base.inherits_from is NULL and the chain is broken, so 'base' does not inherit from 'active' and will not be reopened automatically: $ qemu-img create -f qcow2 hd0.qcow2 1M $ qemu-img create -f qcow2 -b hd0.qcow2 hd1.qcow2 $ qemu-img create -f qcow2 -b hd1.qcow2 hd2.qcow2 $ $QEMU -drive if=none,file=hd2.qcow2 { 'execute': 'block-commit', 'arguments': { 'device': 'none0', 'top': 'hd1.qcow2' } } { 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io none0 "reopen -o backing.l2-cache-size=2M"' } } { "return": "Cannot change the option 'backing.l2-cache-size'\r\n"} This patch updates base.inherits_from in this scenario, and adds a test case. Signed-off-by: Alberto Garcia <berto@igalia.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
138 lines
3.8 KiB
Bash
Executable File
138 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Test reopening a backing image after block-stream and block-commit
|
|
#
|
|
# Copyright (C) 2018 Igalia, S.L.
|
|
#
|
|
# 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=berto@igalia.com
|
|
|
|
seq=`basename $0`
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
status=1 # failure is the default!
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_test_img
|
|
rm -f "$TEST_IMG.base"
|
|
rm -f "$TEST_IMG.int"
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common.rc
|
|
. ./common.filter
|
|
. ./common.qemu
|
|
|
|
# Any format implementing BlockDriver.bdrv_change_backing_file
|
|
_supported_fmt qcow2 qed
|
|
_supported_proto file
|
|
_supported_os Linux
|
|
|
|
IMG_SIZE=1M
|
|
|
|
# Create the images
|
|
TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt
|
|
TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" | _filter_imgfmt
|
|
_make_test_img -b "$TEST_IMG.int" | _filter_imgfmt
|
|
|
|
# First test: reopen $TEST.IMG changing the detect-zeroes option on
|
|
# its backing file ($TEST_IMG.int).
|
|
echo
|
|
echo "*** Change an option on the backing file"
|
|
echo
|
|
_launch_qemu -drive if=none,file="${TEST_IMG}"
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'qmp_capabilities' }" \
|
|
'return'
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'human-monitor-command',
|
|
'arguments': { 'command-line':
|
|
'qemu-io none0 \"reopen -o backing.detect-zeroes=on\"' } }" \
|
|
"return"
|
|
|
|
_cleanup_qemu
|
|
|
|
# Second test: stream $TEST_IMG.base into $TEST_IMG.int and then
|
|
# reopen $TEST.IMG changing the detect-zeroes option on its new
|
|
# backing file ($TEST_IMG.base).
|
|
echo
|
|
echo "*** Stream and then change an option on the backing file"
|
|
echo
|
|
_launch_qemu -drive if=none,file="${TEST_IMG}"
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'qmp_capabilities' }" \
|
|
'return'
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'block-stream', \
|
|
'arguments': { 'device': 'none0',
|
|
'base': '${TEST_IMG}.base' } }" \
|
|
'return'
|
|
|
|
# Wait for block-stream to finish
|
|
sleep 0.5
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'human-monitor-command',
|
|
'arguments': { 'command-line':
|
|
'qemu-io none0 \"reopen -o backing.detect-zeroes=on\"' } }" \
|
|
"return"
|
|
|
|
_cleanup_qemu
|
|
|
|
# Third test: commit $TEST_IMG.int into $TEST_IMG.base and then reopen
|
|
# $TEST.IMG changing the detect-zeroes option on its new backing file
|
|
# ($TEST_IMG.base).
|
|
echo
|
|
echo "*** Commit and then change an option on the backing file"
|
|
echo
|
|
# Create the images again
|
|
TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt
|
|
TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" | _filter_imgfmt
|
|
_make_test_img -b "$TEST_IMG.int" | _filter_imgfmt
|
|
|
|
_launch_qemu -drive if=none,file="${TEST_IMG}"
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'qmp_capabilities' }" \
|
|
'return'
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'block-commit', \
|
|
'arguments': { 'device': 'none0',
|
|
'top': '${TEST_IMG}.int' } }" \
|
|
'return'
|
|
|
|
# Wait for block-commit to finish
|
|
sleep 0.5
|
|
|
|
_send_qemu_cmd $QEMU_HANDLE \
|
|
"{ 'execute': 'human-monitor-command',
|
|
'arguments': { 'command-line':
|
|
'qemu-io none0 \"reopen -o backing.detect-zeroes=on\"' } }" \
|
|
"return"
|
|
|
|
_cleanup_qemu
|
|
|
|
# success, all done
|
|
echo "*** done"
|
|
rm -f $seq.full
|
|
status=0
|