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