1#!/usr/bin/env 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 22owner=famz@redhat.com 23 24seq="$(basename $0)" 25echo "QA output created by $seq" 26 27tmp=/tmp/$$ 28status=1 # failure is the default! 29 30_cleanup() 31{ 32 _cleanup_test_img 33 rm -f "$TEST_IMG.overlay" 34 rm -f "$TEST_DIR/nbd.socket" 35} 36trap "_cleanup; exit \$status" 0 1 2 3 15 37 38# get standard environment, filters and checks 39. ./common.rc 40. ./common.filter 41. ./common.qemu 42 43_supported_fmt qcow2 44_supported_proto file 45_supported_os Linux 46 47size=32M 48 49case "$QEMU_DEFAULT_MACHINE" in 50 s390-ccw-virtio) 51 virtioblk=virtio-blk-ccw 52 ;; 53 *) 54 virtioblk=virtio-blk-pci 55 ;; 56esac 57 58_make_test_img $size 59 60echo "Starting QEMU" 61_launch_qemu -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \ 62 -device $virtioblk,drive=drive0 63 64echo 65echo "Starting a second QEMU using the same image should fail" 66echo 'quit' | $QEMU -nographic -monitor stdio \ 67 -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \ 68 -device $virtioblk,drive=drive0 2>&1 | _filter_testdir 2>&1 | 69 _filter_qemu | 70 sed -e '/falling back to POSIX file/d' \ 71 -e '/locks can be lost unexpectedly/d' 72 73_cleanup_qemu 74 75echo 76echo '=== Testing reopen ===' 77echo 78 79# This tests that reopening does not unshare any permissions it should 80# not unshare 81# (There was a bug where reopening shared exactly the opposite of the 82# permissions it was supposed to share) 83 84_launch_qemu 85 86_send_qemu_cmd $QEMU_HANDLE \ 87 "{'execute': 'qmp_capabilities'}" \ 88 'return' 89 90# Open the image without any format layer (we are not going to access 91# it, so that is fine) 92# This should keep all permissions shared. 93success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 94 "{'execute': 'blockdev-add', 95 'arguments': { 96 'node-name': 'node0', 97 'driver': 'file', 98 'filename': '$TEST_IMG', 99 'locking': 'on' 100 } }" \ 101 'return' \ 102 'error' 103 104# This snapshot will perform a reopen to drop R/W to RO. 105# It should still keep all permissions shared. 106success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 107 "{'execute': 'blockdev-snapshot-sync', 108 'arguments': { 109 'node-name': 'node0', 110 'snapshot-file': '$TEST_IMG.overlay', 111 'snapshot-node-name': 'node1' 112 } }" \ 113 'return' \ 114 'error' 115 116# Now open the same file again 117# This does not require any permissions (and does not unshare any), so 118# this will not conflict with node0. 119success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 120 "{'execute': 'blockdev-add', 121 'arguments': { 122 'node-name': 'node1', 123 'driver': 'file', 124 'filename': '$TEST_IMG', 125 'locking': 'on' 126 } }" \ 127 'return' \ 128 'error' 129 130# Start an NBD server to which we can attach node1 131success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 132 "{'execute': 'nbd-server-start', 133 'arguments': { 134 'addr': { 135 'type': 'unix', 136 'data': { 137 'path': '$TEST_DIR/nbd.socket' 138 } } } }" \ 139 'return' \ 140 'error' 141 142# Now we attach the image to the NBD server. This server does require 143# some permissions (at least WRITE and READ_CONSISTENT), so if 144# reopening node0 unshared any (which it should not have), this will 145# fail (but it should not). 146success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 147 "{'execute': 'nbd-server-add', 148 'arguments': { 149 'device': 'node1' 150 } }" \ 151 'return' \ 152 'error' 153 154_cleanup_qemu 155 156# success, all done 157echo "*** done" 158rm -f $seq.full 159status=0 160