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