root / tests / qemu-iotests / common.pattern @ 00840438
History | View | Annotate | Download (4.8 kB)
1 |
#!/bin/bash |
---|---|
2 |
# |
3 |
# Copyright (C) 2009 Red Hat, Inc. |
4 |
# |
5 |
# This program is free software; you can redistribute it and/or modify |
6 |
# it under the terms of the GNU General Public License as published by |
7 |
# the Free Software Foundation; either version 2 of the License, or |
8 |
# (at your option) any later version. |
9 |
# |
10 |
# This program is distributed in the hope that it will be useful, |
11 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 |
# GNU General Public License for more details. |
14 |
# |
15 |
# You should have received a copy of the GNU General Public License |
16 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 |
# |
18 |
|
19 |
function do_is_allocated() { |
20 |
local start=$1 |
21 |
local size=$(( $2 / 512)) |
22 |
local step=$3 |
23 |
local count=$4 |
24 |
|
25 |
for i in `seq 1 $count`; do |
26 |
echo alloc $(( start + (i - 1) * step )) $size |
27 |
done |
28 |
} |
29 |
|
30 |
function is_allocated() { |
31 |
do_is_allocated "$@" | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
32 |
} |
33 |
|
34 |
function do_io() { |
35 |
local op=$1 |
36 |
local start=$2 |
37 |
local size=$3 |
38 |
local step=$4 |
39 |
local count=$5 |
40 |
local pattern=$6 |
41 |
|
42 |
echo === IO: pattern $pattern >&2 |
43 |
for i in `seq 1 $count`; do |
44 |
echo $op -P $pattern $(( start + (i - 1) * step )) $size |
45 |
done |
46 |
} |
47 |
|
48 |
function io_pattern() { |
49 |
do_io "$@" | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
50 |
} |
51 |
|
52 |
function io() { |
53 |
local start=$2 |
54 |
local pattern=$(( (start >> 9) % 256 )) |
55 |
|
56 |
do_io "$@" $pattern | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
57 |
} |
58 |
|
59 |
function io_zero() { |
60 |
do_io "$@" 0 | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
61 |
} |
62 |
|
63 |
function io_test() { |
64 |
local op=$1 |
65 |
local offset=$2 |
66 |
local cluster_size=$3 |
67 |
|
68 |
local num_large=$4 |
69 |
local num_medium=$((num_large * num_large)) |
70 |
local num_small=$((4 * num_medium)) |
71 |
|
72 |
local half_cluster=$((cluster_size / 2)) |
73 |
local quarter_cluster=$((cluster_size / 4)) |
74 |
local l2_size=$((cluster_size * cluster_size / 8)) |
75 |
|
76 |
# Complete clusters |
77 |
io "$op" $offset $cluster_size $cluster_size $num_small |
78 |
offset=$((offset + num_small * $cluster_size)) |
79 |
|
80 |
# From somewhere in the middle to the end of a cluster |
81 |
io "$op" $((offset + $half_cluster)) $half_cluster $cluster_size $num_small |
82 |
offset=$((offset + num_small * $cluster_size)) |
83 |
|
84 |
# From the start to somewhere in the middle of a cluster |
85 |
io "$op" $offset $half_cluster $cluster_size $num_small |
86 |
offset=$((offset + num_small * $cluster_size)) |
87 |
|
88 |
# Completely misaligned (and small) |
89 |
io "$op" $((offset + $quarter_cluster)) $half_cluster $cluster_size $num_small |
90 |
offset=$((offset + num_small * $cluster_size)) |
91 |
|
92 |
# Spanning multiple clusters |
93 |
io "$op" $((offset + $half_cluster)) $((cluster_size * 2)) $((cluster_size * 3)) $num_medium |
94 |
offset=$((offset + num_medium * 3 * $cluster_size)) |
95 |
|
96 |
# Spanning multiple L2 tables |
97 |
# L2 table size: 512 clusters of 4k = 2M |
98 |
offset=$(( ((offset + l2_size - 1) & ~(l2_size - 1)) - (3 * half_cluster) )) |
99 |
io "$op" $offset $((6 * half_cluster)) $(( l2_size + half_cluster )) $num_large |
100 |
offset=$((offset + num_large * ( l2_size + half_cluster ))) |
101 |
} |
102 |
|
103 |
function io_test2() { |
104 |
local orig_offset=$1 |
105 |
local cluster_size=$2 |
106 |
local num=$3 |
107 |
|
108 |
# Pattern (repeat after 9 clusters): |
109 |
# used - used - free - used - compressed - compressed - |
110 |
# free - free - compressed |
111 |
|
112 |
# Write the clusters to be compressed |
113 |
echo === Clusters to be compressed [1] |
114 |
io_pattern writev $((offset + 4 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
115 |
echo === Clusters to be compressed [2] |
116 |
io_pattern writev $((offset + 5 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
117 |
echo === Clusters to be compressed [3] |
118 |
io_pattern writev $((offset + 8 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
119 |
|
120 |
mv "$TEST_IMG" "$TEST_IMG.orig" |
121 |
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT -c "$TEST_IMG.orig" "$TEST_IMG" |
122 |
|
123 |
# Write the used clusters |
124 |
echo === Used clusters [1] |
125 |
io_pattern writev $((offset + 0 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
126 |
echo === Used clusters [2] |
127 |
io_pattern writev $((offset + 1 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
128 |
echo === Used clusters [3] |
129 |
io_pattern writev $((offset + 3 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
130 |
|
131 |
# Read them |
132 |
echo === Read used/compressed clusters |
133 |
io_pattern readv $((offset + 0 * $cluster_size)) $((2 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
134 |
io_pattern readv $((offset + 3 * $cluster_size)) $((3 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
135 |
io_pattern readv $((offset + 8 * $cluster_size)) $((1 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
136 |
|
137 |
echo === Read zeros |
138 |
io_zero readv $((offset + 2 * $cluster_size)) $((1 * $cluster_size)) $((9 * $cluster_size)) $num |
139 |
io_zero readv $((offset + 6 * $cluster_size)) $((2 * $cluster_size)) $((9 * $cluster_size)) $num |
140 |
} |