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