1*86d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
2*86d7f5d3SJohn Marino# Copyright (C) 2007 NEC Corporation
3*86d7f5d3SJohn Marino#
4*86d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use,
5*86d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions
6*86d7f5d3SJohn Marino# of the GNU General Public License v.2.
7*86d7f5d3SJohn Marino#
8*86d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
9*86d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation,
10*86d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
11*86d7f5d3SJohn Marino
12*86d7f5d3SJohn Marinotest_description="ensure that 'vgreduce --removemissing' works on mirrored LV"
13*86d7f5d3SJohn Marino
14*86d7f5d3SJohn Marino. ./test-utils.sh
15*86d7f5d3SJohn Marino
16*86d7f5d3SJohn Marinodmsetup_has_dm_devdir_support_ || exit 200
17*86d7f5d3SJohn Marino
18*86d7f5d3SJohn Marinolv_is_on_ ()
19*86d7f5d3SJohn Marino{
20*86d7f5d3SJohn Marino	local lv=$vg/$1
21*86d7f5d3SJohn Marino	shift
22*86d7f5d3SJohn Marino	local pvs=$*
23*86d7f5d3SJohn Marino
24*86d7f5d3SJohn Marino	echo "Check if $lv is exactly on PVs $pvs"
25*86d7f5d3SJohn Marino	rm -f out1 out2
26*86d7f5d3SJohn Marino	echo $pvs | sed 's/ /\n/g' | sort | uniq > out1
27*86d7f5d3SJohn Marino
28*86d7f5d3SJohn Marino	lvs -a -odevices --noheadings $lv | \
29*86d7f5d3SJohn Marino	sed 's/([^)]*)//g; s/[ ,]/\n/g' | sort | uniq > out2
30*86d7f5d3SJohn Marino
31*86d7f5d3SJohn Marino	diff --ignore-blank-lines out1 out2
32*86d7f5d3SJohn Marino}
33*86d7f5d3SJohn Marino
34*86d7f5d3SJohn Marinomimages_are_on_ ()
35*86d7f5d3SJohn Marino{
36*86d7f5d3SJohn Marino	local lv=$1
37*86d7f5d3SJohn Marino	shift
38*86d7f5d3SJohn Marino	local pvs="$*"
39*86d7f5d3SJohn Marino	local mimages
40*86d7f5d3SJohn Marino	local i
41*86d7f5d3SJohn Marino
42*86d7f5d3SJohn Marino	echo "Check if mirror images of $lv are on PVs $pvs"
43*86d7f5d3SJohn Marino	rm -f out1 out2
44*86d7f5d3SJohn Marino	echo $pvs | sed 's/ /\n/g' | sort | uniq > out1
45*86d7f5d3SJohn Marino
46*86d7f5d3SJohn Marino	mimages=$(lvs --noheadings -a -o lv_name $vg | grep "${lv}_mimage_" | \
47*86d7f5d3SJohn Marino		sed 's/\[//g; s/\]//g')
48*86d7f5d3SJohn Marino	for i in $mimages; do
49*86d7f5d3SJohn Marino		echo "Checking $vg/$i"
50*86d7f5d3SJohn Marino		lvs -a -odevices --noheadings $vg/$i | \
51*86d7f5d3SJohn Marino			sed 's/([^)]*)//g; s/ //g; s/,/ /g' | sort | uniq >> out2
52*86d7f5d3SJohn Marino	done
53*86d7f5d3SJohn Marino
54*86d7f5d3SJohn Marino	diff --ignore-blank-lines out1 out2
55*86d7f5d3SJohn Marino}
56*86d7f5d3SJohn Marino
57*86d7f5d3SJohn Marinomirrorlog_is_on_()
58*86d7f5d3SJohn Marino{
59*86d7f5d3SJohn Marino	local lv="$1"_mlog
60*86d7f5d3SJohn Marino	shift
61*86d7f5d3SJohn Marino	lv_is_on_ $lv $*
62*86d7f5d3SJohn Marino}
63*86d7f5d3SJohn Marino
64*86d7f5d3SJohn Marinolv_is_linear_()
65*86d7f5d3SJohn Marino{
66*86d7f5d3SJohn Marino	echo "Check if $1 is linear LV (i.e. not a mirror)"
67*86d7f5d3SJohn Marino	lvs -o stripes,attr --noheadings $vg/$1 | sed 's/ //g'
68*86d7f5d3SJohn Marino	lvs -o stripes,attr --noheadings $vg/$1 | sed 's/ //g' | grep -q '^1-'
69*86d7f5d3SJohn Marino}
70*86d7f5d3SJohn Marino
71*86d7f5d3SJohn Marinorest_pvs_()
72*86d7f5d3SJohn Marino{
73*86d7f5d3SJohn Marino	local index=$1
74*86d7f5d3SJohn Marino	local num=$2
75*86d7f5d3SJohn Marino	local rem=""
76*86d7f5d3SJohn Marino	local n
77*86d7f5d3SJohn Marino
78*86d7f5d3SJohn Marino	for n in $(seq 1 $(($index - 1))) $(seq $(($index + 1)) $num); do
79*86d7f5d3SJohn Marino		eval local dev=$\dev$n
80*86d7f5d3SJohn Marino		rem="$rem $dev"
81*86d7f5d3SJohn Marino	done
82*86d7f5d3SJohn Marino
83*86d7f5d3SJohn Marino	echo "$rem"
84*86d7f5d3SJohn Marino}
85*86d7f5d3SJohn Marino
86*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
87*86d7f5d3SJohn Marino# Initialize PVs and VGs
88*86d7f5d3SJohn Marino
89*86d7f5d3SJohn Marinoprepare_vg 5
90*86d7f5d3SJohn Marino
91*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
92*86d7f5d3SJohn Marino# Common environment setup/cleanup for each sub testcases
93*86d7f5d3SJohn Marino
94*86d7f5d3SJohn Marinoprepare_lvs_()
95*86d7f5d3SJohn Marino{
96*86d7f5d3SJohn Marino	lvremove -ff $vg;
97*86d7f5d3SJohn Marino	if dmsetup table|grep $vg; then
98*86d7f5d3SJohn Marino		echo "ERROR: lvremove did leave some some mappings in DM behind!"
99*86d7f5d3SJohn Marino		return 1
100*86d7f5d3SJohn Marino	fi
101*86d7f5d3SJohn Marino	:
102*86d7f5d3SJohn Marino}
103*86d7f5d3SJohn Marino
104*86d7f5d3SJohn Marinocheck_and_cleanup_lvs_()
105*86d7f5d3SJohn Marino{
106*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
107*86d7f5d3SJohn Marino	lvremove -ff $vg
108*86d7f5d3SJohn Marino	if dmsetup table|grep $vg; then
109*86d7f5d3SJohn Marino		echo "ERROR: lvremove did leave some some mappings in DM behind!"
110*86d7f5d3SJohn Marino		return 1
111*86d7f5d3SJohn Marino	fi
112*86d7f5d3SJohn Marino}
113*86d7f5d3SJohn Marino
114*86d7f5d3SJohn Marinorecover_vg_()
115*86d7f5d3SJohn Marino{
116*86d7f5d3SJohn Marino	enable_dev $*
117*86d7f5d3SJohn Marino	pvcreate -ff $*
118*86d7f5d3SJohn Marino	vgextend $vg $*
119*86d7f5d3SJohn Marino	check_and_cleanup_lvs_
120*86d7f5d3SJohn Marino}
121*86d7f5d3SJohn Marino
122*86d7f5d3SJohn Marino#COMM "check environment setup/cleanup"
123*86d7f5d3SJohn Marinoprepare_lvs_
124*86d7f5d3SJohn Marinocheck_and_cleanup_lvs_
125*86d7f5d3SJohn Marino
126*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
127*86d7f5d3SJohn Marino# one of mirror images has failed
128*86d7f5d3SJohn Marino
129*86d7f5d3SJohn Marino#COMM "basic: fail the 2nd mirror image of 2-way mirrored LV"
130*86d7f5d3SJohn Marinoprepare_lvs_
131*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
132*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
133*86d7f5d3SJohn Marinoaux mimages_are_on_ $lv1 $dev1 $dev2
134*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev3
135*86d7f5d3SJohn Marinodisable_dev $dev2
136*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
137*86d7f5d3SJohn Marinolv_is_linear_ $lv1
138*86d7f5d3SJohn Marinolv_is_on_ $lv1 $dev1
139*86d7f5d3SJohn Marino
140*86d7f5d3SJohn Marino# "cleanup"
141*86d7f5d3SJohn Marinorecover_vg_ $dev2
142*86d7f5d3SJohn Marino
143*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
144*86d7f5d3SJohn Marino# LV has 3 images in flat,
145*86d7f5d3SJohn Marino# 1 out of 3 images fails
146*86d7f5d3SJohn Marino
147*86d7f5d3SJohn Marino#COMM test_3way_mirror_fail_1_ <PV# to fail>
148*86d7f5d3SJohn Marinotest_3way_mirror_fail_1_()
149*86d7f5d3SJohn Marino{
150*86d7f5d3SJohn Marino	local index=$1
151*86d7f5d3SJohn Marino
152*86d7f5d3SJohn Marino	lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev4:0-1
153*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
154*86d7f5d3SJohn Marino	aux mimages_are_on_ $lv1 $dev1 $dev2 $dev3
155*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev4
156*86d7f5d3SJohn Marino	eval disable_dev \$dev$index
157*86d7f5d3SJohn Marino	vgreduce --removemissing --force $vg
158*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
159*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $(rest_pvs_ $index 3)
160*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev4
161*86d7f5d3SJohn Marino}
162*86d7f5d3SJohn Marino
163*86d7f5d3SJohn Marinofor n in $(seq 1 3); do
164*86d7f5d3SJohn Marino	#COMM fail mirror image $(($n - 1)) of 3-way mirrored LV"
165*86d7f5d3SJohn Marino	prepare_lvs_
166*86d7f5d3SJohn Marino	test_3way_mirror_fail_1_ $n
167*86d7f5d3SJohn Marino	eval recover_vg_ \$dev$n
168*86d7f5d3SJohn Marinodone
169*86d7f5d3SJohn Marino
170*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
171*86d7f5d3SJohn Marino# LV has 3 images in flat,
172*86d7f5d3SJohn Marino# 2 out of 3 images fail
173*86d7f5d3SJohn Marino
174*86d7f5d3SJohn Marino#COMM test_3way_mirror_fail_2_ <PV# NOT to fail>
175*86d7f5d3SJohn Marinotest_3way_mirror_fail_2_()
176*86d7f5d3SJohn Marino{
177*86d7f5d3SJohn Marino	local index=$1
178*86d7f5d3SJohn Marino
179*86d7f5d3SJohn Marino	lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev4:0-1
180*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
181*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev1 $dev2 $dev3
182*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev4
183*86d7f5d3SJohn Marino	rest_pvs_ $index 3
184*86d7f5d3SJohn Marino	disable_dev $(rest_pvs_ $index 3)
185*86d7f5d3SJohn Marino	vgreduce --force --removemissing $vg
186*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
187*86d7f5d3SJohn Marino	aux lv_is_linear_ $lv1
188*86d7f5d3SJohn Marino	eval lv_is_on_ $lv1 \$dev$n
189*86d7f5d3SJohn Marino}
190*86d7f5d3SJohn Marino
191*86d7f5d3SJohn Marinofor n in $(seq 1 3); do
192*86d7f5d3SJohn Marino	#COMM fail mirror images other than mirror image $(($n - 1)) of 3-way mirrored LV
193*86d7f5d3SJohn Marino	prepare_lvs_
194*86d7f5d3SJohn Marino	test_3way_mirror_fail_2_ $n
195*86d7f5d3SJohn Marino	recover_vg_ $(rest_pvs_ $n 3)
196*86d7f5d3SJohn Marinodone
197*86d7f5d3SJohn Marino
198*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
199*86d7f5d3SJohn Marino# LV has 4 images, 1 of them is in the temporary mirror for syncing.
200*86d7f5d3SJohn Marino# 1 out of 4 images fails
201*86d7f5d3SJohn Marino
202*86d7f5d3SJohn Marino#COMM test_3way_mirror_plus_1_fail_1_ <PV# to fail>
203*86d7f5d3SJohn Marinotest_3way_mirror_plus_1_fail_1_()
204*86d7f5d3SJohn Marino{
205*86d7f5d3SJohn Marino	local index=$1
206*86d7f5d3SJohn Marino
207*86d7f5d3SJohn Marino	lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev5:0-1
208*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
209*86d7f5d3SJohn Marino	lvconvert -m+1 $vg/$lv1 $dev4
210*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4
211*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
212*86d7f5d3SJohn Marino	eval disable_dev \$dev$n
213*86d7f5d3SJohn Marino	vgreduce --removemissing --force $vg
214*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
215*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $(rest_pvs_ $index 4)
216*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
217*86d7f5d3SJohn Marino}
218*86d7f5d3SJohn Marino
219*86d7f5d3SJohn Marinofor n in $(seq 1 4); do
220*86d7f5d3SJohn Marino	#COMM "fail mirror image $(($n - 1)) of 4-way (1 converting) mirrored LV"
221*86d7f5d3SJohn Marino	prepare_lvs_
222*86d7f5d3SJohn Marino	test_3way_mirror_plus_1_fail_1_ $n
223*86d7f5d3SJohn Marino	eval recover_vg_ \$dev$n
224*86d7f5d3SJohn Marinodone
225*86d7f5d3SJohn Marino
226*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
227*86d7f5d3SJohn Marino# LV has 4 images, 1 of them is in the temporary mirror for syncing.
228*86d7f5d3SJohn Marino# 3 out of 4 images fail
229*86d7f5d3SJohn Marino
230*86d7f5d3SJohn Marino#COMM test_3way_mirror_plus_1_fail_3_ <PV# NOT to fail>
231*86d7f5d3SJohn Marinotest_3way_mirror_plus_1_fail_3_()
232*86d7f5d3SJohn Marino{
233*86d7f5d3SJohn Marino	local index=$1
234*86d7f5d3SJohn Marino
235*86d7f5d3SJohn Marino	lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev3 $dev5:0-1
236*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
237*86d7f5d3SJohn Marino	lvconvert -m+1 $vg/$lv1 $dev4
238*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4
239*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
240*86d7f5d3SJohn Marino	disable_dev $(rest_pvs_ $index 4)
241*86d7f5d3SJohn Marino	vgreduce --removemissing --force $vg
242*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
243*86d7f5d3SJohn Marino	eval local dev=\$dev$n
244*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev || lv_is_on_ $lv1 $dev
245*86d7f5d3SJohn Marino	not mirrorlog_is_on_ $lv1 $dev5
246*86d7f5d3SJohn Marino}
247*86d7f5d3SJohn Marino
248*86d7f5d3SJohn Marinofor n in $(seq 1 4); do
249*86d7f5d3SJohn Marino	#COMM "fail mirror images other than mirror image $(($n - 1)) of 4-way (1 converting) mirrored LV"
250*86d7f5d3SJohn Marino	prepare_lvs_
251*86d7f5d3SJohn Marino	test_3way_mirror_plus_1_fail_3_ $n
252*86d7f5d3SJohn Marino	recover_vg_ $(rest_pvs_ $n 4)
253*86d7f5d3SJohn Marinodone
254*86d7f5d3SJohn Marino
255*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
256*86d7f5d3SJohn Marino# LV has 4 images, 2 of them are in the temporary mirror for syncing.
257*86d7f5d3SJohn Marino# 1 out of 4 images fail
258*86d7f5d3SJohn Marino
259*86d7f5d3SJohn Marino# test_2way_mirror_plus_2_fail_1_ <PV# to fail>
260*86d7f5d3SJohn Marinotest_2way_mirror_plus_2_fail_1_()
261*86d7f5d3SJohn Marino{
262*86d7f5d3SJohn Marino	local index=$1
263*86d7f5d3SJohn Marino
264*86d7f5d3SJohn Marino	lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
265*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
266*86d7f5d3SJohn Marino	lvconvert -m+2 $vg/$lv1 $dev3 $dev4
267*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4
268*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
269*86d7f5d3SJohn Marino	eval disable_dev \$dev$n
270*86d7f5d3SJohn Marino	vgreduce --removemissing --force $vg
271*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
272*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $(rest_pvs_ $index 4)
273*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
274*86d7f5d3SJohn Marino}
275*86d7f5d3SJohn Marino
276*86d7f5d3SJohn Marinofor n in $(seq 1 4); do
277*86d7f5d3SJohn Marino	#COMM "fail mirror image $(($n - 1)) of 4-way (2 converting) mirrored LV"
278*86d7f5d3SJohn Marino	prepare_lvs_
279*86d7f5d3SJohn Marino	test_2way_mirror_plus_2_fail_1_ $n
280*86d7f5d3SJohn Marino	eval recover_vg_ \$dev$n
281*86d7f5d3SJohn Marinodone
282*86d7f5d3SJohn Marino
283*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
284*86d7f5d3SJohn Marino# LV has 4 images, 2 of them are in the temporary mirror for syncing.
285*86d7f5d3SJohn Marino# 3 out of 4 images fail
286*86d7f5d3SJohn Marino
287*86d7f5d3SJohn Marino# test_2way_mirror_plus_2_fail_3_ <PV# NOT to fail>
288*86d7f5d3SJohn Marinotest_2way_mirror_plus_2_fail_3_()
289*86d7f5d3SJohn Marino{
290*86d7f5d3SJohn Marino	local index=$1
291*86d7f5d3SJohn Marino
292*86d7f5d3SJohn Marino	lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
293*86d7f5d3SJohn Marino	lvchange -an $vg/$lv1
294*86d7f5d3SJohn Marino	lvconvert -m+2 $vg/$lv1 $dev3 $dev4
295*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev1 $dev2 $dev3 $dev4
296*86d7f5d3SJohn Marino	mirrorlog_is_on_ $lv1 $dev5
297*86d7f5d3SJohn Marino	disable_dev $(rest_pvs_ $index 4)
298*86d7f5d3SJohn Marino	vgreduce --removemissing --force $vg
299*86d7f5d3SJohn Marino	lvs -a -o+devices $vg
300*86d7f5d3SJohn Marino	eval local dev=\$dev$n
301*86d7f5d3SJohn Marino	mimages_are_on_ $lv1 $dev || lv_is_on_ $lv1 $dev
302*86d7f5d3SJohn Marino	not mirrorlog_is_on_ $lv1 $dev5
303*86d7f5d3SJohn Marino}
304*86d7f5d3SJohn Marino
305*86d7f5d3SJohn Marinofor n in $(seq 1 4); do
306*86d7f5d3SJohn Marino	#COMM "fail mirror images other than mirror image $(($n - 1)) of 4-way (2 converting) mirrored LV"
307*86d7f5d3SJohn Marino	prepare_lvs_
308*86d7f5d3SJohn Marino	test_2way_mirror_plus_2_fail_3_ $n
309*86d7f5d3SJohn Marino	recover_vg_ $(rest_pvs_ $n 4)
310*86d7f5d3SJohn Marinodone
311*86d7f5d3SJohn Marino
312*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
313*86d7f5d3SJohn Marino# log device is gone (flat mirror and stacked mirror)
314*86d7f5d3SJohn Marino
315*86d7f5d3SJohn Marino#COMM "fail mirror log of 2-way mirrored LV"
316*86d7f5d3SJohn Marinoprepare_lvs_
317*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
318*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
319*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
320*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
321*86d7f5d3SJohn Marinodisable_dev $dev5
322*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
323*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
324*86d7f5d3SJohn Marinonot mirrorlog_is_on_ $lv1 $dev5
325*86d7f5d3SJohn Marinorecover_vg_ $dev5
326*86d7f5d3SJohn Marino
327*86d7f5d3SJohn Marino#COMM "fail mirror log of 3-way (1 converting) mirrored LV"
328*86d7f5d3SJohn Marinoprepare_lvs_
329*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
330*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
331*86d7f5d3SJohn Marinolvconvert -m+1 $vg/$lv1 $dev3
332*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2 $dev3
333*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
334*86d7f5d3SJohn Marinodisable_dev $dev5
335*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
336*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2 $dev3
337*86d7f5d3SJohn Marinonot mirrorlog_is_on_ $lv1 $dev5
338*86d7f5d3SJohn Marinorecover_vg_ $dev5
339*86d7f5d3SJohn Marino
340*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
341*86d7f5d3SJohn Marino# all images are gone (flat mirror and stacked mirror)
342*86d7f5d3SJohn Marino
343*86d7f5d3SJohn Marino#COMM "fail all mirror images of 2-way mirrored LV"
344*86d7f5d3SJohn Marinoprepare_lvs_
345*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
346*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
347*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
348*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
349*86d7f5d3SJohn Marinodisable_dev $dev1 $dev2
350*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
351*86d7f5d3SJohn Marinonot lvs $vg/$lv1
352*86d7f5d3SJohn Marinorecover_vg_ $dev1 $dev2
353*86d7f5d3SJohn Marino
354*86d7f5d3SJohn Marino#COMM "fail all mirror images of 3-way (1 converting) mirrored LV"
355*86d7f5d3SJohn Marinoprepare_lvs_
356*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
357*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
358*86d7f5d3SJohn Marinolvconvert -m+1 $vg/$lv1 $dev3
359*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2 $dev3
360*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
361*86d7f5d3SJohn Marinodisable_dev $dev1 $dev2 $dev3
362*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
363*86d7f5d3SJohn Marinonot lvs $vg/$lv1
364*86d7f5d3SJohn Marinorecover_vg_ $dev1 $dev2 $dev3
365*86d7f5d3SJohn Marino
366*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
367*86d7f5d3SJohn Marino# Multiple LVs
368*86d7f5d3SJohn Marino
369*86d7f5d3SJohn Marino#COMM "fail a mirror image of one of mirrored LV"
370*86d7f5d3SJohn Marinoprepare_lvs_
371*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
372*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
373*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv2 $vg $dev3 $dev4 $dev5:1-1
374*86d7f5d3SJohn Marinolvchange -an $vg/$lv2
375*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
376*86d7f5d3SJohn Marinomimages_are_on_ $lv2 $dev3 $dev4
377*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
378*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv2 $dev5
379*86d7f5d3SJohn Marinodisable_dev $dev2
380*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
381*86d7f5d3SJohn Marinomimages_are_on_ $lv2 $dev3 $dev4
382*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv2 $dev5
383*86d7f5d3SJohn Marinolv_is_linear_ $lv1
384*86d7f5d3SJohn Marinolv_is_on_ $lv1 $dev1
385*86d7f5d3SJohn Marinorecover_vg_ $dev2
386*86d7f5d3SJohn Marino
387*86d7f5d3SJohn Marino#COMM "fail mirror images, one for each mirrored LV"
388*86d7f5d3SJohn Marinoprepare_lvs_
389*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
390*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
391*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv2 $vg $dev3 $dev4 $dev5:1-1
392*86d7f5d3SJohn Marinolvchange -an $vg/$lv2
393*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
394*86d7f5d3SJohn Marinomimages_are_on_ $lv2 $dev3 $dev4
395*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
396*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv2 $dev5
397*86d7f5d3SJohn Marinodisable_dev $dev2
398*86d7f5d3SJohn Marinodisable_dev $dev4
399*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
400*86d7f5d3SJohn Marinolv_is_linear_ $lv1
401*86d7f5d3SJohn Marinolv_is_on_ $lv1 $dev1
402*86d7f5d3SJohn Marinolv_is_linear_ $lv2
403*86d7f5d3SJohn Marinolv_is_on_ $lv2 $dev3
404*86d7f5d3SJohn Marinorecover_vg_ $dev2 $dev4
405*86d7f5d3SJohn Marino
406*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
407*86d7f5d3SJohn Marino# no failure
408*86d7f5d3SJohn Marino
409*86d7f5d3SJohn Marino#COMM "no failures"
410*86d7f5d3SJohn Marinoprepare_lvs_
411*86d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev5:0-1
412*86d7f5d3SJohn Marinolvchange -an $vg/$lv1
413*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
414*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
415*86d7f5d3SJohn Marinovgreduce --removemissing --force $vg
416*86d7f5d3SJohn Marinomimages_are_on_ $lv1 $dev1 $dev2
417*86d7f5d3SJohn Marinomirrorlog_is_on_ $lv1 $dev5
418*86d7f5d3SJohn Marinocheck_and_cleanup_lvs_
419*86d7f5d3SJohn Marino
420*86d7f5d3SJohn Marino# ---------------------------------------------------------------------
421*86d7f5d3SJohn Marino
422