xref: /openbmc/qemu/tests/qemu-iotests/182 (revision d177892d)
1#!/usr/bin/env bash
2# group: rw quick
3#
4# Test image locking for POSIX locks
5#
6# Copyright 2017 Red Hat, Inc.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20#
21
22# creator
23owner=famz@redhat.com
24
25seq="$(basename $0)"
26echo "QA output created by $seq"
27
28tmp=/tmp/$$
29status=1	# failure is the default!
30
31_cleanup()
32{
33    _cleanup_test_img
34    _rm_test_img "$TEST_IMG.overlay"
35    rm -f "$SOCK_DIR/nbd.socket"
36}
37trap "_cleanup; exit \$status" 0 1 2 3 15
38
39# get standard environment, filters and checks
40. ./common.rc
41. ./common.filter
42. ./common.qemu
43
44_supported_fmt qcow2
45_supported_proto file
46
47size=32M
48
49_make_test_img $size
50
51echo "Starting QEMU"
52_launch_qemu -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \
53    -device virtio-blk,drive=drive0
54
55echo
56echo "Starting a second QEMU using the same image should fail"
57echo 'quit' | $QEMU -nographic -monitor stdio \
58    -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \
59    -device virtio-blk,drive=drive0 2>&1 | _filter_testdir 2>&1 |
60    _filter_qemu |
61    sed -e '/falling back to POSIX file/d' \
62        -e '/locks can be lost unexpectedly/d'
63
64_cleanup_qemu
65
66echo
67echo '=== Testing reopen ==='
68echo
69
70# This tests that reopening does not unshare any permissions it should
71# not unshare
72# (There was a bug where reopening shared exactly the opposite of the
73# permissions it was supposed to share)
74
75_launch_qemu
76
77_send_qemu_cmd $QEMU_HANDLE \
78    "{'execute': 'qmp_capabilities'}" \
79    'return'
80
81# Open the image without any format layer (we are not going to access
82# it, so that is fine)
83# This should keep all permissions shared.
84success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
85    "{'execute': 'blockdev-add',
86      'arguments': {
87          'node-name': 'node0',
88          'driver': 'file',
89          'filename': '$TEST_IMG',
90          'locking': 'on'
91          } }" \
92    'return' \
93    'error'
94
95# This snapshot will perform a reopen to drop R/W to RO.
96# It should still keep all permissions shared.
97success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
98    "{'execute': 'blockdev-snapshot-sync',
99      'arguments': {
100          'node-name': 'node0',
101          'snapshot-file': '$TEST_IMG.overlay',
102          'snapshot-node-name': 'node1'
103      } }" \
104    'return' \
105    'error'
106
107# Now open the same file again
108# This does not require any permissions (and does not unshare any), so
109# this will not conflict with node0.
110success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
111    "{'execute': 'blockdev-add',
112      'arguments': {
113          'node-name': 'node1',
114          'driver': 'file',
115          'filename': '$TEST_IMG',
116          'locking': 'on'
117          } }" \
118    'return' \
119    'error'
120
121# Start an NBD server to which we can attach node1
122success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
123    "{'execute': 'nbd-server-start',
124      'arguments': {
125          'addr': {
126              'type': 'unix',
127              'data': {
128                  'path': '$SOCK_DIR/nbd.socket'
129              } } } }" \
130    'return' \
131    'error'
132
133# Now we attach the image to the NBD server.  This server does require
134# some permissions (at least WRITE and READ_CONSISTENT), so if
135# reopening node0 unshared any (which it should not have), this will
136# fail (but it should not).
137success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
138    "{'execute': 'nbd-server-add',
139      'arguments': {
140          'device': 'node1'
141      } }" \
142    'return' \
143    'error'
144
145_cleanup_qemu
146
147echo
148echo '=== Testing failure to loosen restrictions ==='
149echo
150
151_launch_qemu -drive file=$TEST_IMG,if=none,file.locking=on
152
153_send_qemu_cmd $QEMU_HANDLE \
154    "{'execute': 'qmp_capabilities'}" \
155    'return'
156
157_cleanup_test_img
158
159# When quitting qemu, it will try to drop its locks on the test image.
160# Because that file no longer exists, it will be unable to do so.
161# However, that is not fatal, so it should just move on.
162_send_qemu_cmd $QEMU_HANDLE \
163    "{'execute': 'quit'}" \
164    'return'
165
166wait=1 _cleanup_qemu
167
168# success, all done
169echo "*** done"
170rm -f $seq.full
171status=0
172