111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env 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 Zhengtmp=/tmp/$$ 28de9efdb3SFam Zhengstatus=1 # failure is the default! 29de9efdb3SFam Zheng 30de9efdb3SFam Zheng_cleanup() 31de9efdb3SFam Zheng{ 32de9efdb3SFam Zheng _cleanup_test_img 33*f91ecbd7SMax Reitz _rm_test_img "$TEST_IMG.overlay" 34748f831bSMax Reitz rm -f "$SOCK_DIR/nbd.socket" 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 46de9efdb3SFam Zhengsize=32M 47de9efdb3SFam Zheng 48f1d5516aSCornelia Huckcase "$QEMU_DEFAULT_MACHINE" in 49f1d5516aSCornelia Huck s390-ccw-virtio) 50f1d5516aSCornelia Huck virtioblk=virtio-blk-ccw 51f1d5516aSCornelia Huck ;; 52f1d5516aSCornelia Huck *) 53f1d5516aSCornelia Huck virtioblk=virtio-blk-pci 54f1d5516aSCornelia Huck ;; 55f1d5516aSCornelia Huckesac 56f1d5516aSCornelia Huck 57de9efdb3SFam Zheng_make_test_img $size 58de9efdb3SFam Zheng 59de9efdb3SFam Zhengecho "Starting QEMU" 60de9efdb3SFam Zheng_launch_qemu -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \ 61f1d5516aSCornelia Huck -device $virtioblk,drive=drive0 62de9efdb3SFam Zheng 63de9efdb3SFam Zhengecho 64de9efdb3SFam Zhengecho "Starting a second QEMU using the same image should fail" 65c60f6fcfSKevin Wolfecho 'quit' | $QEMU -nographic -monitor stdio \ 66de9efdb3SFam Zheng -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \ 67f1d5516aSCornelia Huck -device $virtioblk,drive=drive0 2>&1 | _filter_testdir 2>&1 | 68de9efdb3SFam Zheng _filter_qemu | 69de9efdb3SFam Zheng sed -e '/falling back to POSIX file/d' \ 70de9efdb3SFam Zheng -e '/locks can be lost unexpectedly/d' 71de9efdb3SFam Zheng 72de9efdb3SFam Zheng_cleanup_qemu 73de9efdb3SFam Zheng 746d0a4a0fSMax Reitzecho 756d0a4a0fSMax Reitzecho '=== Testing reopen ===' 766d0a4a0fSMax Reitzecho 776d0a4a0fSMax Reitz 786d0a4a0fSMax Reitz# This tests that reopening does not unshare any permissions it should 796d0a4a0fSMax Reitz# not unshare 806d0a4a0fSMax Reitz# (There was a bug where reopening shared exactly the opposite of the 816d0a4a0fSMax Reitz# permissions it was supposed to share) 826d0a4a0fSMax Reitz 836d0a4a0fSMax Reitz_launch_qemu 846d0a4a0fSMax Reitz 856d0a4a0fSMax Reitz_send_qemu_cmd $QEMU_HANDLE \ 866d0a4a0fSMax Reitz "{'execute': 'qmp_capabilities'}" \ 876d0a4a0fSMax Reitz 'return' 886d0a4a0fSMax Reitz 896d0a4a0fSMax Reitz# Open the image without any format layer (we are not going to access 906d0a4a0fSMax Reitz# it, so that is fine) 916d0a4a0fSMax Reitz# This should keep all permissions shared. 926d0a4a0fSMax Reitzsuccess_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 936d0a4a0fSMax Reitz "{'execute': 'blockdev-add', 946d0a4a0fSMax Reitz 'arguments': { 956d0a4a0fSMax Reitz 'node-name': 'node0', 966d0a4a0fSMax Reitz 'driver': 'file', 976d0a4a0fSMax Reitz 'filename': '$TEST_IMG', 986d0a4a0fSMax Reitz 'locking': 'on' 996d0a4a0fSMax Reitz } }" \ 1006d0a4a0fSMax Reitz 'return' \ 1016d0a4a0fSMax Reitz 'error' 1026d0a4a0fSMax Reitz 1036d0a4a0fSMax Reitz# This snapshot will perform a reopen to drop R/W to RO. 1046d0a4a0fSMax Reitz# It should still keep all permissions shared. 1056d0a4a0fSMax Reitzsuccess_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 1066d0a4a0fSMax Reitz "{'execute': 'blockdev-snapshot-sync', 1076d0a4a0fSMax Reitz 'arguments': { 1086d0a4a0fSMax Reitz 'node-name': 'node0', 1096d0a4a0fSMax Reitz 'snapshot-file': '$TEST_IMG.overlay', 1106d0a4a0fSMax Reitz 'snapshot-node-name': 'node1' 1116d0a4a0fSMax Reitz } }" \ 1126d0a4a0fSMax Reitz 'return' \ 1136d0a4a0fSMax Reitz 'error' 1146d0a4a0fSMax Reitz 1156d0a4a0fSMax Reitz# Now open the same file again 1166d0a4a0fSMax Reitz# This does not require any permissions (and does not unshare any), so 1176d0a4a0fSMax Reitz# this will not conflict with node0. 1186d0a4a0fSMax Reitzsuccess_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 1196d0a4a0fSMax Reitz "{'execute': 'blockdev-add', 1206d0a4a0fSMax Reitz 'arguments': { 1216d0a4a0fSMax Reitz 'node-name': 'node1', 1226d0a4a0fSMax Reitz 'driver': 'file', 1236d0a4a0fSMax Reitz 'filename': '$TEST_IMG', 1246d0a4a0fSMax Reitz 'locking': 'on' 1256d0a4a0fSMax Reitz } }" \ 1266d0a4a0fSMax Reitz 'return' \ 1276d0a4a0fSMax Reitz 'error' 1286d0a4a0fSMax Reitz 1298fabb8beSMax Reitz# Start an NBD server to which we can attach node1 1308fabb8beSMax Reitzsuccess_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 1318fabb8beSMax Reitz "{'execute': 'nbd-server-start', 1328fabb8beSMax Reitz 'arguments': { 1338fabb8beSMax Reitz 'addr': { 1348fabb8beSMax Reitz 'type': 'unix', 1358fabb8beSMax Reitz 'data': { 136748f831bSMax Reitz 'path': '$SOCK_DIR/nbd.socket' 1378fabb8beSMax Reitz } } } }" \ 1388fabb8beSMax Reitz 'return' \ 1398fabb8beSMax Reitz 'error' 1408fabb8beSMax Reitz 1418fabb8beSMax Reitz# Now we attach the image to the NBD server. This server does require 1428fabb8beSMax Reitz# some permissions (at least WRITE and READ_CONSISTENT), so if 1436d0a4a0fSMax Reitz# reopening node0 unshared any (which it should not have), this will 1446d0a4a0fSMax Reitz# fail (but it should not). 1456d0a4a0fSMax Reitzsuccess_or_failure=y _send_qemu_cmd $QEMU_HANDLE \ 1468fabb8beSMax Reitz "{'execute': 'nbd-server-add', 1476d0a4a0fSMax Reitz 'arguments': { 1488fabb8beSMax Reitz 'device': 'node1' 1496d0a4a0fSMax Reitz } }" \ 1506d0a4a0fSMax Reitz 'return' \ 1516d0a4a0fSMax Reitz 'error' 1526d0a4a0fSMax Reitz 1536d0a4a0fSMax Reitz_cleanup_qemu 1546d0a4a0fSMax Reitz 155dc68c9d3SMax Reitzecho 156dc68c9d3SMax Reitzecho '=== Testing failure to loosen restrictions ===' 157dc68c9d3SMax Reitzecho 158dc68c9d3SMax Reitz 159dc68c9d3SMax Reitz_launch_qemu -drive file=$TEST_IMG,if=none,file.locking=on 160dc68c9d3SMax Reitz 161dc68c9d3SMax Reitz_send_qemu_cmd $QEMU_HANDLE \ 162dc68c9d3SMax Reitz "{'execute': 'qmp_capabilities'}" \ 163dc68c9d3SMax Reitz 'return' 164dc68c9d3SMax Reitz 165dc68c9d3SMax Reitz_cleanup_test_img 166dc68c9d3SMax Reitz 167dc68c9d3SMax Reitz# When quitting qemu, it will try to drop its locks on the test image. 168dc68c9d3SMax Reitz# Because that file no longer exists, it will be unable to do so. 169dc68c9d3SMax Reitz# However, that is not fatal, so it should just move on. 170dc68c9d3SMax Reitz_send_qemu_cmd $QEMU_HANDLE \ 171dc68c9d3SMax Reitz "{'execute': 'quit'}" \ 172dc68c9d3SMax Reitz 'return' 173dc68c9d3SMax Reitz 174dc68c9d3SMax Reitzwait=1 _cleanup_qemu 175dc68c9d3SMax Reitz 176de9efdb3SFam Zheng# success, all done 177de9efdb3SFam Zhengecho "*** done" 178de9efdb3SFam Zhengrm -f $seq.full 179de9efdb3SFam Zhengstatus=0 180