1a2aa8b07SAlberto Garcia#!/usr/bin/env bash 2a2aa8b07SAlberto Garcia# 3a2aa8b07SAlberto Garcia# Test that a backing image is put back in read-only mode after 4a2aa8b07SAlberto Garcia# block-commit (both when it fails and when it succeeds). 5a2aa8b07SAlberto Garcia# 6a2aa8b07SAlberto Garcia# Copyright (C) 2019 Igalia, S.L. 7a2aa8b07SAlberto Garcia# 8a2aa8b07SAlberto Garcia# This program is free software; you can redistribute it and/or modify 9a2aa8b07SAlberto Garcia# it under the terms of the GNU General Public License as published by 10a2aa8b07SAlberto Garcia# the Free Software Foundation; either version 2 of the License, or 11a2aa8b07SAlberto Garcia# (at your option) any later version. 12a2aa8b07SAlberto Garcia# 13a2aa8b07SAlberto Garcia# This program is distributed in the hope that it will be useful, 14a2aa8b07SAlberto Garcia# but WITHOUT ANY WARRANTY; without even the implied warranty of 15a2aa8b07SAlberto Garcia# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16a2aa8b07SAlberto Garcia# GNU General Public License for more details. 17a2aa8b07SAlberto Garcia# 18a2aa8b07SAlberto Garcia# You should have received a copy of the GNU General Public License 19a2aa8b07SAlberto Garcia# along with this program. If not, see <http://www.gnu.org/licenses/>. 20a2aa8b07SAlberto Garcia# 21a2aa8b07SAlberto Garcia 22a2aa8b07SAlberto Garcia# creator 23a2aa8b07SAlberto Garciaowner=berto@igalia.com 24a2aa8b07SAlberto Garcia 25a2aa8b07SAlberto Garciaseq="$(basename $0)" 26a2aa8b07SAlberto Garciaecho "QA output created by $seq" 27a2aa8b07SAlberto Garcia 28a2aa8b07SAlberto Garciastatus=1 # failure is the default! 29a2aa8b07SAlberto Garcia 30a2aa8b07SAlberto Garcia_cleanup() 31a2aa8b07SAlberto Garcia{ 32a2aa8b07SAlberto Garcia _cleanup_test_img 33*f91ecbd7SMax Reitz _rm_test_img "$TEST_IMG.base" 34*f91ecbd7SMax Reitz _rm_test_img "$TEST_IMG.int" 35a2aa8b07SAlberto Garcia} 36a2aa8b07SAlberto Garciatrap "_cleanup; exit \$status" 0 1 2 3 15 37a2aa8b07SAlberto Garcia 38a2aa8b07SAlberto Garcia# get standard environment, filters and checks 39a2aa8b07SAlberto Garcia. ./common.rc 40a2aa8b07SAlberto Garcia. ./common.filter 41a2aa8b07SAlberto Garcia. ./common.qemu 42a2aa8b07SAlberto Garcia 43a2aa8b07SAlberto Garcia# Any format implementing BlockDriver.bdrv_change_backing_file 44a2aa8b07SAlberto Garcia_supported_fmt qcow2 qed 45a2aa8b07SAlberto Garcia_supported_proto file 46a2aa8b07SAlberto Garcia_supported_os Linux 47a2aa8b07SAlberto Garcia 48a2aa8b07SAlberto GarciaIMG_SIZE=1M 49a2aa8b07SAlberto Garcia 50a2aa8b07SAlberto Garcia# Create the images: base <- int <- active 51a2aa8b07SAlberto GarciaTEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt 52a2aa8b07SAlberto GarciaTEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" | _filter_imgfmt 53a2aa8b07SAlberto Garcia_make_test_img -b "$TEST_IMG.int" | _filter_imgfmt 54a2aa8b07SAlberto Garcia 55a2aa8b07SAlberto Garcia# Launch QEMU with these two drives: 56a2aa8b07SAlberto Garcia# none0: base (read-only) 57a2aa8b07SAlberto Garcia# none1: base <- int <- active 58a2aa8b07SAlberto Garcia_launch_qemu -drive if=none,file="${TEST_IMG}.base",node-name=base,read-only=on \ 59a2aa8b07SAlberto Garcia -drive if=none,file="${TEST_IMG}",backing.node-name=int,backing.backing=base 60a2aa8b07SAlberto Garcia 61a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 62a2aa8b07SAlberto Garcia "{ 'execute': 'qmp_capabilities' }" \ 63a2aa8b07SAlberto Garcia 'return' 64a2aa8b07SAlberto Garcia 65a2aa8b07SAlberto Garciaecho 66a2aa8b07SAlberto Garciaecho '=== Send a write command to a drive opened in read-only mode (1)' 67a2aa8b07SAlberto Garciaecho 68a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 69a2aa8b07SAlberto Garcia "{ 'execute': 'human-monitor-command', 70a2aa8b07SAlberto Garcia 'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \ 71a2aa8b07SAlberto Garcia 'return' 72a2aa8b07SAlberto Garcia 73a2aa8b07SAlberto Garciaecho 74a2aa8b07SAlberto Garciaecho '=== Run block-commit on base using an invalid filter node name' 75a2aa8b07SAlberto Garciaecho 76a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 77a2aa8b07SAlberto Garcia "{ 'execute': 'block-commit', 78a2aa8b07SAlberto Garcia 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int', 79a2aa8b07SAlberto Garcia 'filter-node-name': '1234'}}" \ 80a2aa8b07SAlberto Garcia 'error' 81a2aa8b07SAlberto Garcia 82a2aa8b07SAlberto Garciaecho 83a2aa8b07SAlberto Garciaecho '=== Send a write command to a drive opened in read-only mode (2)' 84a2aa8b07SAlberto Garciaecho 85a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 86a2aa8b07SAlberto Garcia "{ 'execute': 'human-monitor-command', 87a2aa8b07SAlberto Garcia 'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \ 88a2aa8b07SAlberto Garcia 'return' 89a2aa8b07SAlberto Garcia 90a2aa8b07SAlberto Garciaecho 91a2aa8b07SAlberto Garciaecho '=== Run block-commit on base using the default filter node name' 92a2aa8b07SAlberto Garciaecho 93a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 94a2aa8b07SAlberto Garcia "{ 'execute': 'block-commit', 95a2aa8b07SAlberto Garcia 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int'}}" \ 96a2aa8b07SAlberto Garcia 'return' 97a2aa8b07SAlberto Garcia 98a2aa8b07SAlberto Garcia# Wait for block-commit to finish 99a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE '' \ 100a2aa8b07SAlberto Garcia '"status": "null"' 101a2aa8b07SAlberto Garcia 102a2aa8b07SAlberto Garciaecho 103a2aa8b07SAlberto Garciaecho '=== Send a write command to a drive opened in read-only mode (3)' 104a2aa8b07SAlberto Garciaecho 105a2aa8b07SAlberto Garcia_send_qemu_cmd $QEMU_HANDLE \ 106a2aa8b07SAlberto Garcia "{ 'execute': 'human-monitor-command', 107a2aa8b07SAlberto Garcia 'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \ 108a2aa8b07SAlberto Garcia 'return' 109a2aa8b07SAlberto Garcia 110a2aa8b07SAlberto Garcia_cleanup_qemu 111a2aa8b07SAlberto Garcia 112a2aa8b07SAlberto Garcia# success, all done 113a2aa8b07SAlberto Garciaecho "*** done" 114a2aa8b07SAlberto Garciarm -f $seq.full 115a2aa8b07SAlberto Garciastatus=0 116