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