xref: /qemu/tests/qemu-iotests/249 (revision a2aa8b07cd73ff25b90c11b332a9633dd4b33717)
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