1*ba898078SFam Zheng#!/bin/bash 2*ba898078SFam Zheng# 3*ba898078SFam Zheng# Test image locking 4*ba898078SFam Zheng# 5*ba898078SFam Zheng# Copyright 2016, 2017 Red Hat, Inc. 6*ba898078SFam Zheng# 7*ba898078SFam Zheng# This program is free software; you can redistribute it and/or modify 8*ba898078SFam Zheng# it under the terms of the GNU General Public License as published by 9*ba898078SFam Zheng# the Free Software Foundation; either version 2 of the License, or 10*ba898078SFam Zheng# (at your option) any later version. 11*ba898078SFam Zheng# 12*ba898078SFam Zheng# This program is distributed in the hope that it will be useful, 13*ba898078SFam Zheng# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*ba898078SFam Zheng# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*ba898078SFam Zheng# GNU General Public License for more details. 16*ba898078SFam Zheng# 17*ba898078SFam Zheng# You should have received a copy of the GNU General Public License 18*ba898078SFam Zheng# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*ba898078SFam Zheng# 20*ba898078SFam Zheng 21*ba898078SFam Zheng# creator 22*ba898078SFam Zhengowner=famz@redhat.com 23*ba898078SFam Zheng 24*ba898078SFam Zhengseq="$(basename $0)" 25*ba898078SFam Zhengecho "QA output created by $seq" 26*ba898078SFam Zheng 27*ba898078SFam Zhenghere="$PWD" 28*ba898078SFam Zhengtmp=/tmp/$$ 29*ba898078SFam Zhengstatus=1 # failure is the default! 30*ba898078SFam Zheng 31*ba898078SFam Zheng_cleanup() 32*ba898078SFam Zheng{ 33*ba898078SFam Zheng _cleanup_test_img 34*ba898078SFam Zheng rm -f "${TEST_IMG}.base" 35*ba898078SFam Zheng rm -f "${TEST_IMG}.convert" 36*ba898078SFam Zheng rm -f "${TEST_IMG}.a" 37*ba898078SFam Zheng rm -f "${TEST_IMG}.b" 38*ba898078SFam Zheng rm -f "${TEST_IMG}.lnk" 39*ba898078SFam Zheng} 40*ba898078SFam Zhengtrap "_cleanup; exit \$status" 0 1 2 3 15 41*ba898078SFam Zheng 42*ba898078SFam Zheng# get standard environment, filters and checks 43*ba898078SFam Zheng. ./common.rc 44*ba898078SFam Zheng. ./common.filter 45*ba898078SFam Zheng. ./common.qemu 46*ba898078SFam Zheng 47*ba898078SFam Zhengsize=32M 48*ba898078SFam Zheng 49*ba898078SFam Zheng_check_ofd() 50*ba898078SFam Zheng{ 51*ba898078SFam Zheng _make_test_img $size >/dev/null 52*ba898078SFam Zheng if $QEMU_IMG_PROG info --image-opts "driver=file,locking=on,filename=$TEST_IMG" 2>&1 | 53*ba898078SFam Zheng grep -q 'falling back to POSIX file'; then 54*ba898078SFam Zheng return 1 55*ba898078SFam Zheng else 56*ba898078SFam Zheng return 0 57*ba898078SFam Zheng fi 58*ba898078SFam Zheng} 59*ba898078SFam Zheng 60*ba898078SFam Zheng_check_ofd || _notrun "OFD lock not available" 61*ba898078SFam Zheng 62*ba898078SFam Zheng_supported_fmt qcow2 63*ba898078SFam Zheng_supported_proto file 64*ba898078SFam Zheng_supported_os Linux 65*ba898078SFam Zheng 66*ba898078SFam Zheng_run_cmd() 67*ba898078SFam Zheng{ 68*ba898078SFam Zheng echo 69*ba898078SFam Zheng (echo "$@"; "$@" 2>&1 1>/dev/null) | _filter_testdir 70*ba898078SFam Zheng} 71*ba898078SFam Zheng 72*ba898078SFam Zhengfunction _do_run_qemu() 73*ba898078SFam Zheng{ 74*ba898078SFam Zheng ( 75*ba898078SFam Zheng if ! test -t 0; then 76*ba898078SFam Zheng while read cmd; do 77*ba898078SFam Zheng echo $cmd 78*ba898078SFam Zheng done 79*ba898078SFam Zheng fi 80*ba898078SFam Zheng echo quit 81*ba898078SFam Zheng ) | $QEMU -nographic -monitor stdio -serial none "$@" 1>/dev/null 82*ba898078SFam Zheng} 83*ba898078SFam Zheng 84*ba898078SFam Zhengfunction _run_qemu_with_images() 85*ba898078SFam Zheng{ 86*ba898078SFam Zheng _do_run_qemu \ 87*ba898078SFam Zheng $(for i in $@; do echo "-drive if=none,file=$i"; done) 2>&1 \ 88*ba898078SFam Zheng | _filter_testdir | _filter_qemu 89*ba898078SFam Zheng} 90*ba898078SFam Zheng 91*ba898078SFam Zhengecho "== readonly=off,force-share=on should be rejected ==" 92*ba898078SFam Zheng_run_qemu_with_images null-co://,readonly=off,force-share=on 93*ba898078SFam Zheng 94*ba898078SFam Zhengfor opts1 in "" "read-only=on" "read-only=on,force-share=on"; do 95*ba898078SFam Zheng echo 96*ba898078SFam Zheng echo "== Creating base image ==" 97*ba898078SFam Zheng TEST_IMG="${TEST_IMG}.base" _make_test_img $size 98*ba898078SFam Zheng 99*ba898078SFam Zheng echo 100*ba898078SFam Zheng echo "== Creating test image ==" 101*ba898078SFam Zheng $QEMU_IMG create -f $IMGFMT "${TEST_IMG}" -b ${TEST_IMG}.base | _filter_img_create 102*ba898078SFam Zheng 103*ba898078SFam Zheng echo 104*ba898078SFam Zheng echo "== Launching QEMU, opts: '$opts1' ==" 105*ba898078SFam Zheng _launch_qemu -drive file="${TEST_IMG}",if=none,$opts1 106*ba898078SFam Zheng h=$QEMU_HANDLE 107*ba898078SFam Zheng 108*ba898078SFam Zheng for opts2 in "" "read-only=on" "read-only=on,force-share=on"; do 109*ba898078SFam Zheng echo 110*ba898078SFam Zheng echo "== Launching another QEMU, opts: '$opts2' ==" 111*ba898078SFam Zheng echo "quit" | \ 112*ba898078SFam Zheng $QEMU -nographic -monitor stdio \ 113*ba898078SFam Zheng -drive file="${TEST_IMG}",if=none,$opts2 2>&1 1>/dev/null | \ 114*ba898078SFam Zheng _filter_testdir | _filter_qemu 115*ba898078SFam Zheng done 116*ba898078SFam Zheng 117*ba898078SFam Zheng for L in "" "-U"; do 118*ba898078SFam Zheng 119*ba898078SFam Zheng echo 120*ba898078SFam Zheng echo "== Running utility commands $L ==" 121*ba898078SFam Zheng _run_cmd $QEMU_IO $L -c "read 0 512" "${TEST_IMG}" 122*ba898078SFam Zheng _run_cmd $QEMU_IO $L -r -c "read 0 512" "${TEST_IMG}" 123*ba898078SFam Zheng _run_cmd $QEMU_IO -c "open $L ${TEST_IMG}" -c "read 0 512" 124*ba898078SFam Zheng _run_cmd $QEMU_IO -c "open -r $L ${TEST_IMG}" -c "read 0 512" 125*ba898078SFam Zheng _run_cmd $QEMU_IMG info $L "${TEST_IMG}" 126*ba898078SFam Zheng _run_cmd $QEMU_IMG check $L "${TEST_IMG}" 127*ba898078SFam Zheng _run_cmd $QEMU_IMG compare $L "${TEST_IMG}" "${TEST_IMG}" 128*ba898078SFam Zheng _run_cmd $QEMU_IMG map $L "${TEST_IMG}" 129*ba898078SFam Zheng _run_cmd $QEMU_IMG amend -o "" $L "${TEST_IMG}" 130*ba898078SFam Zheng _run_cmd $QEMU_IMG commit $L "${TEST_IMG}" 131*ba898078SFam Zheng _run_cmd $QEMU_IMG resize $L "${TEST_IMG}" $size 132*ba898078SFam Zheng _run_cmd $QEMU_IMG rebase $L "${TEST_IMG}" -b "${TEST_IMG}.base" 133*ba898078SFam Zheng _run_cmd $QEMU_IMG snapshot -l $L "${TEST_IMG}" 134*ba898078SFam Zheng _run_cmd $QEMU_IMG convert $L "${TEST_IMG}" "${TEST_IMG}.convert" 135*ba898078SFam Zheng _run_cmd $QEMU_IMG dd $L if="${TEST_IMG}" of="${TEST_IMG}.convert" bs=512 count=1 136*ba898078SFam Zheng _run_cmd $QEMU_IMG bench $L -c 1 "${TEST_IMG}" 137*ba898078SFam Zheng _run_cmd $QEMU_IMG bench $L -w -c 1 "${TEST_IMG}" 138*ba898078SFam Zheng done 139*ba898078SFam Zheng _send_qemu_cmd $h "{ 'execute': 'quit', }" "" 140*ba898078SFam Zheng echo 141*ba898078SFam Zheng echo "Round done" 142*ba898078SFam Zheng _cleanup_qemu 143*ba898078SFam Zhengdone 144*ba898078SFam Zheng 145*ba898078SFam Zhengfor opt1 in $test_opts; do 146*ba898078SFam Zheng for opt2 in $test_opts; do 147*ba898078SFam Zheng echo 148*ba898078SFam Zheng echo "== Two devices with the same image ($opt1 - $opt2) ==" 149*ba898078SFam Zheng _run_qemu_with_images "${TEST_IMG},$opt1" "${TEST_IMG},$opt2" 150*ba898078SFam Zheng done 151*ba898078SFam Zhengdone 152*ba898078SFam Zheng 153*ba898078SFam Zhengecho "== Creating ${TEST_IMG}.[abc] ==" | _filter_testdir 154*ba898078SFam Zheng( 155*ba898078SFam Zheng $QEMU_IMG create -f qcow2 "${TEST_IMG}.a" -b "${TEST_IMG}" 156*ba898078SFam Zheng $QEMU_IMG create -f qcow2 "${TEST_IMG}.b" -b "${TEST_IMG}" 157*ba898078SFam Zheng $QEMU_IMG create -f qcow2 "${TEST_IMG}.c" -b "${TEST_IMG}.b" 158*ba898078SFam Zheng) | _filter_img_create 159*ba898078SFam Zheng 160*ba898078SFam Zhengecho 161*ba898078SFam Zhengecho "== Two devices sharing the same file in backing chain ==" 162*ba898078SFam Zheng_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}.b" 163*ba898078SFam Zheng_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}.c" 164*ba898078SFam Zheng 165*ba898078SFam Zhengecho 166*ba898078SFam Zhengecho "== Backing image also as an active device ==" 167*ba898078SFam Zheng_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}" 168*ba898078SFam Zheng 169*ba898078SFam Zhengecho 170*ba898078SFam Zhengecho "== Backing image also as an active device (ro) ==" 171*ba898078SFam Zheng_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG},readonly=on" 172*ba898078SFam Zheng 173*ba898078SFam Zhengecho 174*ba898078SFam Zhengecho "== Symbolic link ==" 175*ba898078SFam Zhengrm -f "${TEST_IMG}.lnk" &>/dev/null 176*ba898078SFam Zhengln -s ${TEST_IMG} "${TEST_IMG}.lnk" || echo "Failed to create link" 177*ba898078SFam Zheng_run_qemu_with_images "${TEST_IMG}.lnk" "${TEST_IMG}" 178*ba898078SFam Zheng 179*ba898078SFam Zhengecho 180*ba898078SFam Zhengecho "== Closing an image should unlock it ==" 181*ba898078SFam Zheng_launch_qemu 182*ba898078SFam Zheng 183*ba898078SFam Zheng_send_qemu_cmd $QEMU_HANDLE \ 184*ba898078SFam Zheng "{ 'execute': 'qmp_capabilities' }" \ 185*ba898078SFam Zheng 'return' 186*ba898078SFam Zheng 187*ba898078SFam Zhengecho "Adding drive" 188*ba898078SFam Zheng_send_qemu_cmd $QEMU_HANDLE \ 189*ba898078SFam Zheng "{ 'execute': 'human-monitor-command', 190*ba898078SFam Zheng 'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=${TEST_IMG}' } }" \ 191*ba898078SFam Zheng "" 192*ba898078SFam Zheng 193*ba898078SFam Zheng_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512' 194*ba898078SFam Zheng 195*ba898078SFam Zhengecho "Closing drive" 196*ba898078SFam Zheng_send_qemu_cmd $QEMU_HANDLE \ 197*ba898078SFam Zheng "{ 'execute': 'human-monitor-command', 198*ba898078SFam Zheng 'arguments': { 'command-line': 'drive_del d0' } }" \ 199*ba898078SFam Zheng "" 200*ba898078SFam Zheng 201*ba898078SFam Zheng_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512' 202*ba898078SFam Zheng 203*ba898078SFam Zhengecho "Adding two and closing one" 204*ba898078SFam Zhengfor d in d0 d1; do 205*ba898078SFam Zheng _send_qemu_cmd $QEMU_HANDLE \ 206*ba898078SFam Zheng "{ 'execute': 'human-monitor-command', 207*ba898078SFam Zheng 'arguments': { 'command-line': 'drive_add 0 if=none,id=$d,file=${TEST_IMG},readonly=on' } }" \ 208*ba898078SFam Zheng "" 209*ba898078SFam Zhengdone 210*ba898078SFam Zheng 211*ba898078SFam Zheng_run_cmd $QEMU_IMG info "${TEST_IMG}" 212*ba898078SFam Zheng 213*ba898078SFam Zheng_send_qemu_cmd $QEMU_HANDLE \ 214*ba898078SFam Zheng "{ 'execute': 'human-monitor-command', 215*ba898078SFam Zheng 'arguments': { 'command-line': 'drive_del d0' } }" \ 216*ba898078SFam Zheng "" 217*ba898078SFam Zheng 218*ba898078SFam Zheng_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512' 219*ba898078SFam Zheng 220*ba898078SFam Zhengecho "Closing the other" 221*ba898078SFam Zheng_send_qemu_cmd $QEMU_HANDLE \ 222*ba898078SFam Zheng "{ 'execute': 'human-monitor-command', 223*ba898078SFam Zheng 'arguments': { 'command-line': 'drive_del d1' } }" \ 224*ba898078SFam Zheng "" 225*ba898078SFam Zheng 226*ba898078SFam Zheng_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512' 227*ba898078SFam Zheng 228*ba898078SFam Zheng_cleanup_qemu 229*ba898078SFam Zheng 230*ba898078SFam Zheng# success, all done 231*ba898078SFam Zhengecho "*** done" 232*ba898078SFam Zhengrm -f $seq.full 233*ba898078SFam Zhengstatus=0 234