182 (4573B)
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 23 owner=fam@euphon.net 24 25 seq="$(basename $0)" 26 echo "QA output created by $seq" 27 28 tmp=/tmp/$$ 29 status=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 } 37 trap "_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 47 size=32M 48 49 _make_test_img $size 50 51 echo "Starting QEMU" 52 _launch_qemu -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \ 53 -device virtio-blk,drive=drive0 54 55 echo 56 echo "Starting a second QEMU using the same image should fail" 57 echo '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 66 echo 67 echo '=== Testing reopen ===' 68 echo 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. 84 success_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. 97 success_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. 110 success_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 122 success_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). 137 success_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 147 echo 148 echo '=== Testing failure to loosen restrictions ===' 149 echo 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 166 wait=1 _cleanup_qemu 167 168 # success, all done 169 echo "*** done" 170 rm -f $seq.full 171 status=0