1#!/bin/bash 2# 3# qcow2 specific bdrv_write_zeroes tests with backing files (complements 034) 4# 5# Copyright (C) 2016 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=kwolf@redhat.com 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27here=`pwd` 28status=1 # failure is the default! 29 30_cleanup() 31{ 32 _cleanup_test_img 33} 34trap "_cleanup; exit \$status" 0 1 2 3 15 35 36# get standard environment, filters and checks 37. ./common.rc 38. ./common.filter 39 40_supported_fmt qcow2 41_supported_proto file 42_supported_os Linux 43 44CLUSTER_SIZE=4k 45size=128M 46 47echo 48echo == backing file contains zeros == 49 50CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 51_make_test_img -b "$TEST_IMG.base" 52 53# Make sure that the whole cluster is allocated even for partial write_zeroes 54# when the backing file contains zeros 55 56# X = non-zero data sector in backing file 57# - = sector unallocated in whole backing chain 58# 0 = sector touched by write_zeroes request 59 60# 1. Tail unaligned: 00 00 -- -- 61# 2. Head unaligned: -- -- 00 00 62# 3. Both unaligned: -- 00 00 -- 63# 4. Both, 2 clusters: -- -- -- 00 | 00 -- -- -- 64 65$QEMU_IO -c "write -z 0 2k" "$TEST_IMG" | _filter_qemu_io 66$QEMU_IO -c "write -z 10k 2k" "$TEST_IMG" | _filter_qemu_io 67$QEMU_IO -c "write -z 17k 2k" "$TEST_IMG" | _filter_qemu_io 68$QEMU_IO -c "write -z 27k 2k" "$TEST_IMG" | _filter_qemu_io 69$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 70 71echo 72echo == backing file contains non-zero data before write_zeroes == 73 74CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 75_make_test_img -b "$TEST_IMG.base" 76 77# Single cluster; non-zero data at the cluster start 78# ... | XX -- 00 -- | ... 79$QEMU_IO -c "write -P 0x11 32k 1k" "$TEST_IMG.base" | _filter_qemu_io 80$QEMU_IO -c "write -z 34k 1k" "$TEST_IMG" | _filter_qemu_io 81$QEMU_IO -c "read -P 0x11 32k 1k" "$TEST_IMG" | _filter_qemu_io 82$QEMU_IO -c "read -P 0 33k 3k" "$TEST_IMG" | _filter_qemu_io 83 84# Single cluster; non-zero data exists, but not at the cluster start 85# ... | -- XX 00 -- | ... 86$QEMU_IO -c "write -P 0x11 65k 1k" "$TEST_IMG.base" | _filter_qemu_io 87$QEMU_IO -c "write -z 66k 1k" "$TEST_IMG" | _filter_qemu_io 88$QEMU_IO -c "read -P 0x11 65k 1k" "$TEST_IMG" | _filter_qemu_io 89$QEMU_IO -c "read -P 0 64k 1k" "$TEST_IMG" | _filter_qemu_io 90$QEMU_IO -c "read -P 0 66k 2k" "$TEST_IMG" | _filter_qemu_io 91 92$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 93 94echo 95echo == backing file contains non-zero data after write_zeroes == 96 97CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 98_make_test_img -b "$TEST_IMG.base" 99 100# Single cluster; non-zero data directly after request 101# ... | -- 00 XX -- | ... 102$QEMU_IO -c "write -P 0x11 34k 1k" "$TEST_IMG.base" | _filter_qemu_io 103$QEMU_IO -c "write -z 33k 1k" "$TEST_IMG" | _filter_qemu_io 104$QEMU_IO -c "read -P 0 32k 2k" "$TEST_IMG" | _filter_qemu_io 105$QEMU_IO -c "read -P 0x11 34k 1k" "$TEST_IMG" | _filter_qemu_io 106$QEMU_IO -c "read -P 0 35k 1k" "$TEST_IMG" | _filter_qemu_io 107 108# Single cluster; non-zero data exists, but not directly after request 109# ... | -- 00 -- XX | ... 110$QEMU_IO -c "write -P 0x11 43k 1k" "$TEST_IMG.base" | _filter_qemu_io 111$QEMU_IO -c "write -z 41k 1k" "$TEST_IMG" | _filter_qemu_io 112$QEMU_IO -c "read -P 0x11 43k 1k" "$TEST_IMG" | _filter_qemu_io 113$QEMU_IO -c "read -P 0 40k 3k" "$TEST_IMG" | _filter_qemu_io 114 115$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 116 117echo 118echo == spanning two clusters, non-zero before request == 119 120CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 121_make_test_img -b "$TEST_IMG.base" 122 123# Two clusters; non-zero data before request: 124# 1. At cluster start: 32k: XX -- -- 00 | 00 -- -- -- 125# 2. Between unallocated space: 48k: -- XX -- 00 | 00 -- -- -- 126# 3. Directly before request: 64k: -- -- XX 00 | 00 -- -- -- 127 128$QEMU_IO -c "write -P 0x11 32k 1k" "$TEST_IMG.base" | _filter_qemu_io 129$QEMU_IO -c "write -z 35k 2k" "$TEST_IMG" | _filter_qemu_io 130$QEMU_IO -c "read -P 0x11 32k 1k" "$TEST_IMG" | _filter_qemu_io 131$QEMU_IO -c "read -P 0 33k 7k" "$TEST_IMG" | _filter_qemu_io 132 133$QEMU_IO -c "write -P 0x11 49k 1k" "$TEST_IMG.base" | _filter_qemu_io 134$QEMU_IO -c "write -z 51k 2k" "$TEST_IMG" | _filter_qemu_io 135$QEMU_IO -c "read -P 0 48k 1k" "$TEST_IMG" | _filter_qemu_io 136$QEMU_IO -c "read -P 0x11 49k 1k" "$TEST_IMG" | _filter_qemu_io 137$QEMU_IO -c "read -P 0 50k 6k" "$TEST_IMG" | _filter_qemu_io 138 139$QEMU_IO -c "write -P 0x11 66k 1k" "$TEST_IMG.base" | _filter_qemu_io 140$QEMU_IO -c "write -z 67k 2k" "$TEST_IMG" | _filter_qemu_io 141$QEMU_IO -c "read -P 0 64k 2k" "$TEST_IMG" | _filter_qemu_io 142$QEMU_IO -c "read -P 0x11 66k 1k" "$TEST_IMG" | _filter_qemu_io 143$QEMU_IO -c "read -P 0 67k 5k" "$TEST_IMG" | _filter_qemu_io 144 145$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 146 147echo 148echo == spanning two clusters, non-zero after request == 149 150CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 151_make_test_img -b "$TEST_IMG.base" 152 153# Two clusters; non-zero data after request: 154# 1. Directly after request: 32k: -- -- -- 00 | 00 XX -- -- 155# 2. Between unallocated space: 48k: -- -- -- 00 | 00 -- XX -- 156# 3. At cluster end: 64k: -- -- -- 00 | 00 -- -- XX 157 158$QEMU_IO -c "write -P 0x11 37k 1k" "$TEST_IMG.base" | _filter_qemu_io 159$QEMU_IO -c "write -z 35k 2k" "$TEST_IMG" | _filter_qemu_io 160$QEMU_IO -c "read -P 0 32k 5k" "$TEST_IMG" | _filter_qemu_io 161$QEMU_IO -c "read -P 0x11 37k 1k" "$TEST_IMG" | _filter_qemu_io 162$QEMU_IO -c "read -P 0 38k 2k" "$TEST_IMG" | _filter_qemu_io 163 164$QEMU_IO -c "write -P 0x11 54k 1k" "$TEST_IMG.base" | _filter_qemu_io 165$QEMU_IO -c "write -z 51k 2k" "$TEST_IMG" | _filter_qemu_io 166$QEMU_IO -c "read -P 0 48k 6k" "$TEST_IMG" | _filter_qemu_io 167$QEMU_IO -c "read -P 0x11 54k 1k" "$TEST_IMG" | _filter_qemu_io 168$QEMU_IO -c "read -P 0 55k 1k" "$TEST_IMG" | _filter_qemu_io 169 170$QEMU_IO -c "write -P 0x11 71k 1k" "$TEST_IMG.base" | _filter_qemu_io 171$QEMU_IO -c "write -z 67k 2k" "$TEST_IMG" | _filter_qemu_io 172$QEMU_IO -c "read -P 0 64k 7k" "$TEST_IMG" | _filter_qemu_io 173$QEMU_IO -c "read -P 0x11 71k 1k" "$TEST_IMG" | _filter_qemu_io 174 175$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 176 177echo 178echo == spanning two clusters, partially overwriting backing file == 179 180CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 181_make_test_img -b "$TEST_IMG.base" 182 183# Backing file: -- -- XX XX | XX XX -- -- 184# Active layer: -- -- XX 00 | 00 XX -- -- 185 186$QEMU_IO -c "write -P 0x11 2k 4k" "$TEST_IMG.base" | _filter_qemu_io 187$QEMU_IO -c "write -z 3k 2k" "$TEST_IMG" | _filter_qemu_io 188$QEMU_IO -c "read -P 0 0k 2k" "$TEST_IMG" | _filter_qemu_io 189$QEMU_IO -c "read -P 0x11 2k 1k" "$TEST_IMG" | _filter_qemu_io 190$QEMU_IO -c "read -P 0 3k 2k" "$TEST_IMG" | _filter_qemu_io 191$QEMU_IO -c "read -P 0x11 5k 1k" "$TEST_IMG" | _filter_qemu_io 192$QEMU_IO -c "read -P 0 6k 2k" "$TEST_IMG" | _filter_qemu_io 193 194$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 195 196echo 197echo == spanning multiple clusters, non-zero in first cluster == 198 199CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 200_make_test_img -b "$TEST_IMG.base" 201 202# Backing file: 64k: XX XX -- -- | -- -- -- -- | -- -- -- -- 203# Active layer: 64k: XX XX 00 00 | 00 00 00 00 | 00 -- -- -- 204 205$QEMU_IO -c "write -P 0x11 64k 2k" "$TEST_IMG.base" | _filter_qemu_io 206$QEMU_IO -c "write -z 66k 7k" "$TEST_IMG" | _filter_qemu_io 207$QEMU_IO -c "read -P 0x11 64k 2k" "$TEST_IMG" | _filter_qemu_io 208$QEMU_IO -c "read -P 0 66k 10k" "$TEST_IMG" | _filter_qemu_io 209 210$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 211 212echo 213echo == spanning multiple clusters, non-zero in intermediate cluster == 214 215CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 216_make_test_img -b "$TEST_IMG.base" 217 218# Backing file: 64k: -- -- -- -- | -- XX XX -- | -- -- -- -- 219# Active layer: 64k: -- -- 00 00 | 00 00 00 00 | 00 -- -- -- 220 221$QEMU_IO -c "write -P 0x11 69k 2k" "$TEST_IMG.base" | _filter_qemu_io 222$QEMU_IO -c "write -z 66k 7k" "$TEST_IMG" | _filter_qemu_io 223$QEMU_IO -c "read -P 0 64k 12k" "$TEST_IMG" | _filter_qemu_io 224 225$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 226 227echo 228echo == spanning multiple clusters, non-zero in final cluster == 229 230CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 231_make_test_img -b "$TEST_IMG.base" 232 233# Backing file: 64k: -- -- -- -- | -- -- -- -- | -- -- XX XX 234# Active layer: 64k: -- -- 00 00 | 00 00 00 00 | 00 -- XX XX 235 236$QEMU_IO -c "write -P 0x11 74k 2k" "$TEST_IMG.base" | _filter_qemu_io 237$QEMU_IO -c "write -z 66k 7k" "$TEST_IMG" | _filter_qemu_io 238$QEMU_IO -c "read -P 0 64k 10k" "$TEST_IMG" | _filter_qemu_io 239$QEMU_IO -c "read -P 0x11 74k 2k" "$TEST_IMG" | _filter_qemu_io 240 241$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 242 243echo 244echo == spanning multiple clusters, partially overwriting backing file == 245 246CLUSTER_SIZE=512 TEST_IMG="$TEST_IMG.base" _make_test_img $size 247_make_test_img -b "$TEST_IMG.base" 248 249# Backing file: 64k: -- XX XX XX | XX XX XX XX | XX XX XX -- 250# Active layer: 64k: -- XX 00 00 | 00 00 00 00 | 00 XX XX -- 251 252$QEMU_IO -c "write -P 0x11 65k 10k" "$TEST_IMG.base" | _filter_qemu_io 253$QEMU_IO -c "write -z 66k 7k" "$TEST_IMG" | _filter_qemu_io 254$QEMU_IO -c "read -P 0 64k 1k" "$TEST_IMG" | _filter_qemu_io 255$QEMU_IO -c "read -P 0x11 65k 1k" "$TEST_IMG" | _filter_qemu_io 256$QEMU_IO -c "read -P 0 66k 7k" "$TEST_IMG" | _filter_qemu_io 257$QEMU_IO -c "read -P 0x11 73k 2k" "$TEST_IMG" | _filter_qemu_io 258$QEMU_IO -c "read -P 0 75k 1k" "$TEST_IMG" | _filter_qemu_io 259 260$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 261 262# success, all done 263echo "*** done" 264rm -f $seq.full 265status=0 266