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