xref: /titanic_41/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.kshlib (revision a4dd1f3517267c5e5aa5b2bb53cb388002bc688f)
1*a4dd1f35SJohn Wren Kennedy#
2*a4dd1f35SJohn Wren Kennedy# CDDL HEADER START
3*a4dd1f35SJohn Wren Kennedy#
4*a4dd1f35SJohn Wren Kennedy# The contents of this file are subject to the terms of the
5*a4dd1f35SJohn Wren Kennedy# Common Development and Distribution License (the "License").
6*a4dd1f35SJohn Wren Kennedy# You may not use this file except in compliance with the License.
7*a4dd1f35SJohn Wren Kennedy#
8*a4dd1f35SJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*a4dd1f35SJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
10*a4dd1f35SJohn Wren Kennedy# See the License for the specific language governing permissions
11*a4dd1f35SJohn Wren Kennedy# and limitations under the License.
12*a4dd1f35SJohn Wren Kennedy#
13*a4dd1f35SJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
14*a4dd1f35SJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*a4dd1f35SJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
16*a4dd1f35SJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
17*a4dd1f35SJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
18*a4dd1f35SJohn Wren Kennedy#
19*a4dd1f35SJohn Wren Kennedy# CDDL HEADER END
20*a4dd1f35SJohn Wren Kennedy#
21*a4dd1f35SJohn Wren Kennedy
22*a4dd1f35SJohn Wren Kennedy#
23*a4dd1f35SJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*a4dd1f35SJohn Wren Kennedy# Use is subject to license terms.
25*a4dd1f35SJohn Wren Kennedy#
26*a4dd1f35SJohn Wren Kennedy
27*a4dd1f35SJohn Wren Kennedy#
28*a4dd1f35SJohn Wren Kennedy# Copyright (c) 2013 by Delphix. All rights reserved.
29*a4dd1f35SJohn Wren Kennedy#
30*a4dd1f35SJohn Wren Kennedy
31*a4dd1f35SJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
32*a4dd1f35SJohn Wren Kennedy. $STF_SUITE/tests/functional/redundancy/redundancy.cfg
33*a4dd1f35SJohn Wren Kennedy
34*a4dd1f35SJohn Wren Kennedyfunction cleanup
35*a4dd1f35SJohn Wren Kennedy{
36*a4dd1f35SJohn Wren Kennedy	if poolexists $TESTPOOL; then
37*a4dd1f35SJohn Wren Kennedy		destroy_pool $TESTPOOL
38*a4dd1f35SJohn Wren Kennedy	fi
39*a4dd1f35SJohn Wren Kennedy	typeset dir
40*a4dd1f35SJohn Wren Kennedy	for dir in $TESTDIR $BASEDIR; do
41*a4dd1f35SJohn Wren Kennedy		if [[ -d $dir ]]; then
42*a4dd1f35SJohn Wren Kennedy			log_must $RM -rf $dir
43*a4dd1f35SJohn Wren Kennedy		fi
44*a4dd1f35SJohn Wren Kennedy	done
45*a4dd1f35SJohn Wren Kennedy}
46*a4dd1f35SJohn Wren Kennedy
47*a4dd1f35SJohn Wren Kennedy#
48*a4dd1f35SJohn Wren Kennedy# Get random number between min and max number.
49*a4dd1f35SJohn Wren Kennedy#
50*a4dd1f35SJohn Wren Kennedy# $1 Minimal value
51*a4dd1f35SJohn Wren Kennedy# $2 Maximal value
52*a4dd1f35SJohn Wren Kennedy#
53*a4dd1f35SJohn Wren Kennedyfunction random
54*a4dd1f35SJohn Wren Kennedy{
55*a4dd1f35SJohn Wren Kennedy	typeset -i min=$1
56*a4dd1f35SJohn Wren Kennedy	typeset -i max=$2
57*a4dd1f35SJohn Wren Kennedy	typeset -i value
58*a4dd1f35SJohn Wren Kennedy
59*a4dd1f35SJohn Wren Kennedy	while true; do
60*a4dd1f35SJohn Wren Kennedy		((value = RANDOM % (max + 1)))
61*a4dd1f35SJohn Wren Kennedy		if ((value >= min)); then
62*a4dd1f35SJohn Wren Kennedy			break
63*a4dd1f35SJohn Wren Kennedy		fi
64*a4dd1f35SJohn Wren Kennedy	done
65*a4dd1f35SJohn Wren Kennedy
66*a4dd1f35SJohn Wren Kennedy	$ECHO $value
67*a4dd1f35SJohn Wren Kennedy}
68*a4dd1f35SJohn Wren Kennedy
69*a4dd1f35SJohn Wren Kennedy#
70*a4dd1f35SJohn Wren Kennedy# Record the directories construction and checksum all the files which reside
71*a4dd1f35SJohn Wren Kennedy# within the specified pool
72*a4dd1f35SJohn Wren Kennedy#
73*a4dd1f35SJohn Wren Kennedy# $1 The specified pool
74*a4dd1f35SJohn Wren Kennedy# $2 The file which save the record.
75*a4dd1f35SJohn Wren Kennedy#
76*a4dd1f35SJohn Wren Kennedyfunction record_data
77*a4dd1f35SJohn Wren Kennedy{
78*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
79*a4dd1f35SJohn Wren Kennedy	typeset recordfile=$2
80*a4dd1f35SJohn Wren Kennedy
81*a4dd1f35SJohn Wren Kennedy	[[ -z $pool ]] && log_fail "No specified pool."
82*a4dd1f35SJohn Wren Kennedy	[[ -f $recordfile ]] && log_must $RM -f $recordfile
83*a4dd1f35SJohn Wren Kennedy
84*a4dd1f35SJohn Wren Kennedy	typeset mntpnt
85*a4dd1f35SJohn Wren Kennedy	mntpnt=$(get_prop mountpoint $pool)
86*a4dd1f35SJohn Wren Kennedy	log_must eval "$DU -a $mntpnt > $recordfile 2>&1"
87*a4dd1f35SJohn Wren Kennedy	#
88*a4dd1f35SJohn Wren Kennedy	# When the data was damaged, checksum is failing and return 1
89*a4dd1f35SJohn Wren Kennedy	# So, will not use log_must
90*a4dd1f35SJohn Wren Kennedy	#
91*a4dd1f35SJohn Wren Kennedy	$FIND $mntpnt -type f -exec $CKSUM {} + >> $recordfile 2>&1
92*a4dd1f35SJohn Wren Kennedy}
93*a4dd1f35SJohn Wren Kennedy
94*a4dd1f35SJohn Wren Kennedy#
95*a4dd1f35SJohn Wren Kennedy# Create test pool and fill with files and directories.
96*a4dd1f35SJohn Wren Kennedy#
97*a4dd1f35SJohn Wren Kennedy# $1 pool name
98*a4dd1f35SJohn Wren Kennedy# $2 pool type
99*a4dd1f35SJohn Wren Kennedy# $3 virtual devices number
100*a4dd1f35SJohn Wren Kennedy#
101*a4dd1f35SJohn Wren Kennedyfunction setup_test_env
102*a4dd1f35SJohn Wren Kennedy{
103*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
104*a4dd1f35SJohn Wren Kennedy	typeset keyword=$2
105*a4dd1f35SJohn Wren Kennedy	typeset -i vdev_cnt=$3
106*a4dd1f35SJohn Wren Kennedy	typeset vdevs
107*a4dd1f35SJohn Wren Kennedy
108*a4dd1f35SJohn Wren Kennedy	typeset -i i=0
109*a4dd1f35SJohn Wren Kennedy	while (( i < vdev_cnt )); do
110*a4dd1f35SJohn Wren Kennedy		vdevs="$vdevs $BASEDIR/vdev$i"
111*a4dd1f35SJohn Wren Kennedy		((i += 1))
112*a4dd1f35SJohn Wren Kennedy	done
113*a4dd1f35SJohn Wren Kennedy
114*a4dd1f35SJohn Wren Kennedy	if [[ ! -d $BASEDIR ]]; then
115*a4dd1f35SJohn Wren Kennedy		log_must $MKDIR $BASEDIR
116*a4dd1f35SJohn Wren Kennedy	fi
117*a4dd1f35SJohn Wren Kennedy
118*a4dd1f35SJohn Wren Kennedy	if poolexists $pool ; then
119*a4dd1f35SJohn Wren Kennedy		destroy_pool $pool
120*a4dd1f35SJohn Wren Kennedy	fi
121*a4dd1f35SJohn Wren Kennedy
122*a4dd1f35SJohn Wren Kennedy	log_must $MKFILE $DEV_SIZE $vdevs
123*a4dd1f35SJohn Wren Kennedy
124*a4dd1f35SJohn Wren Kennedy	log_must $ZPOOL create -m $TESTDIR $pool $keyword $vdevs
125*a4dd1f35SJohn Wren Kennedy
126*a4dd1f35SJohn Wren Kennedy	log_note "Filling up the filesystem ..."
127*a4dd1f35SJohn Wren Kennedy	typeset -i ret=0
128*a4dd1f35SJohn Wren Kennedy	typeset -i i=0
129*a4dd1f35SJohn Wren Kennedy	typeset file=$TESTDIR/file
130*a4dd1f35SJohn Wren Kennedy	while $TRUE ; do
131*a4dd1f35SJohn Wren Kennedy		$FILE_WRITE -o create -f $file.$i \
132*a4dd1f35SJohn Wren Kennedy			-b $BLOCKSZ -c $NUM_WRITES
133*a4dd1f35SJohn Wren Kennedy		ret=$?
134*a4dd1f35SJohn Wren Kennedy		(( $ret != 0 )) && break
135*a4dd1f35SJohn Wren Kennedy		(( i = i + 1 ))
136*a4dd1f35SJohn Wren Kennedy	done
137*a4dd1f35SJohn Wren Kennedy	(($ret != 28 )) && log_note "$FILE_WRITE return value($ret) is unexpected."
138*a4dd1f35SJohn Wren Kennedy
139*a4dd1f35SJohn Wren Kennedy	record_data $TESTPOOL $PRE_RECORD_FILE
140*a4dd1f35SJohn Wren Kennedy}
141*a4dd1f35SJohn Wren Kennedy
142*a4dd1f35SJohn Wren Kennedy#
143*a4dd1f35SJohn Wren Kennedy# Check pool status is healthy
144*a4dd1f35SJohn Wren Kennedy#
145*a4dd1f35SJohn Wren Kennedy# $1 pool
146*a4dd1f35SJohn Wren Kennedy#
147*a4dd1f35SJohn Wren Kennedyfunction is_healthy
148*a4dd1f35SJohn Wren Kennedy{
149*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
150*a4dd1f35SJohn Wren Kennedy
151*a4dd1f35SJohn Wren Kennedy	typeset healthy_output="pool '$pool' is healthy"
152*a4dd1f35SJohn Wren Kennedy	typeset real_output=$($ZPOOL status -x $pool)
153*a4dd1f35SJohn Wren Kennedy
154*a4dd1f35SJohn Wren Kennedy	if [[ "$real_output" == "$healthy_output" ]]; then
155*a4dd1f35SJohn Wren Kennedy		return 0
156*a4dd1f35SJohn Wren Kennedy	else
157*a4dd1f35SJohn Wren Kennedy		typeset -i ret
158*a4dd1f35SJohn Wren Kennedy		$ZPOOL status -x $pool | $GREP "state:" | \
159*a4dd1f35SJohn Wren Kennedy			$GREP "FAULTED" >/dev/null 2>&1
160*a4dd1f35SJohn Wren Kennedy		ret=$?
161*a4dd1f35SJohn Wren Kennedy		(( $ret == 0 )) && return 1
162*a4dd1f35SJohn Wren Kennedy		typeset l_scan
163*a4dd1f35SJohn Wren Kennedy		typeset errnum
164*a4dd1f35SJohn Wren Kennedy		l_scan=$($ZPOOL status -x $pool | $GREP "scan:")
165*a4dd1f35SJohn Wren Kennedy		l_scan=${l_scan##*"with"}
166*a4dd1f35SJohn Wren Kennedy		errnum=$($ECHO $l_scan | $AWK '{print $1}')
167*a4dd1f35SJohn Wren Kennedy
168*a4dd1f35SJohn Wren Kennedy		return $errnum
169*a4dd1f35SJohn Wren Kennedy	fi
170*a4dd1f35SJohn Wren Kennedy}
171*a4dd1f35SJohn Wren Kennedy
172*a4dd1f35SJohn Wren Kennedy#
173*a4dd1f35SJohn Wren Kennedy# Check pool data is valid
174*a4dd1f35SJohn Wren Kennedy#
175*a4dd1f35SJohn Wren Kennedy# $1 pool
176*a4dd1f35SJohn Wren Kennedy#
177*a4dd1f35SJohn Wren Kennedyfunction is_data_valid
178*a4dd1f35SJohn Wren Kennedy{
179*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
180*a4dd1f35SJohn Wren Kennedy
181*a4dd1f35SJohn Wren Kennedy	record_data $pool $PST_RECORD_FILE
182*a4dd1f35SJohn Wren Kennedy	if ! $DIFF $PRE_RECORD_FILE $PST_RECORD_FILE > /dev/null 2>&1; then
183*a4dd1f35SJohn Wren Kennedy		return 1
184*a4dd1f35SJohn Wren Kennedy	fi
185*a4dd1f35SJohn Wren Kennedy
186*a4dd1f35SJohn Wren Kennedy	return 0
187*a4dd1f35SJohn Wren Kennedy}
188*a4dd1f35SJohn Wren Kennedy
189*a4dd1f35SJohn Wren Kennedy#
190*a4dd1f35SJohn Wren Kennedy# Get the specified count devices name
191*a4dd1f35SJohn Wren Kennedy#
192*a4dd1f35SJohn Wren Kennedy# $1 pool name
193*a4dd1f35SJohn Wren Kennedy# $2 devices count
194*a4dd1f35SJohn Wren Kennedy#
195*a4dd1f35SJohn Wren Kennedyfunction get_vdevs #pool cnt
196*a4dd1f35SJohn Wren Kennedy{
197*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
198*a4dd1f35SJohn Wren Kennedy	typeset -i cnt=$2
199*a4dd1f35SJohn Wren Kennedy
200*a4dd1f35SJohn Wren Kennedy	typeset all_devs=$($ZPOOL iostat -v $pool | $AWK '{print $1}'| \
201*a4dd1f35SJohn Wren Kennedy		$EGREP -v "^pool$|^capacity$|^mirror$|^raidz1$|^raidz2$|---" | \
202*a4dd1f35SJohn Wren Kennedy		$EGREP -v "/old$|^$pool$")
203*a4dd1f35SJohn Wren Kennedy	typeset -i i=0
204*a4dd1f35SJohn Wren Kennedy	typeset vdevs
205*a4dd1f35SJohn Wren Kennedy	while ((i < cnt)); do
206*a4dd1f35SJohn Wren Kennedy		typeset dev=$($ECHO $all_devs | $AWK '{print $1}')
207*a4dd1f35SJohn Wren Kennedy		eval all_devs=\${all_devs##*$dev}
208*a4dd1f35SJohn Wren Kennedy
209*a4dd1f35SJohn Wren Kennedy		vdevs="$dev $vdevs"
210*a4dd1f35SJohn Wren Kennedy		((i += 1))
211*a4dd1f35SJohn Wren Kennedy	done
212*a4dd1f35SJohn Wren Kennedy
213*a4dd1f35SJohn Wren Kennedy	$ECHO "$vdevs"
214*a4dd1f35SJohn Wren Kennedy}
215*a4dd1f35SJohn Wren Kennedy
216*a4dd1f35SJohn Wren Kennedy#
217*a4dd1f35SJohn Wren Kennedy# Synchronize all the data in pool
218*a4dd1f35SJohn Wren Kennedy#
219*a4dd1f35SJohn Wren Kennedy# $1 pool name
220*a4dd1f35SJohn Wren Kennedy#
221*a4dd1f35SJohn Wren Kennedyfunction sync_pool #pool
222*a4dd1f35SJohn Wren Kennedy{
223*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
224*a4dd1f35SJohn Wren Kennedy
225*a4dd1f35SJohn Wren Kennedy	log_must $SYNC
226*a4dd1f35SJohn Wren Kennedy	log_must $SLEEP 2
227*a4dd1f35SJohn Wren Kennedy	# Flush all the pool data.
228*a4dd1f35SJohn Wren Kennedy	typeset -i ret
229*a4dd1f35SJohn Wren Kennedy	$ZPOOL scrub $pool >/dev/null 2>&1
230*a4dd1f35SJohn Wren Kennedy	ret=$?
231*a4dd1f35SJohn Wren Kennedy	(( $ret != 0 )) && \
232*a4dd1f35SJohn Wren Kennedy		log_fail "$ZPOOL scrub $pool failed."
233*a4dd1f35SJohn Wren Kennedy
234*a4dd1f35SJohn Wren Kennedy	while ! is_pool_scrubbed $pool; do
235*a4dd1f35SJohn Wren Kennedy		if is_pool_resilvered $pool ; then
236*a4dd1f35SJohn Wren Kennedy			log_fail "$pool should not be resilver completed."
237*a4dd1f35SJohn Wren Kennedy		fi
238*a4dd1f35SJohn Wren Kennedy		log_must $SLEEP 2
239*a4dd1f35SJohn Wren Kennedy	done
240*a4dd1f35SJohn Wren Kennedy}
241*a4dd1f35SJohn Wren Kennedy
242*a4dd1f35SJohn Wren Kennedy#
243*a4dd1f35SJohn Wren Kennedy# Create and replace the same name virtual device files
244*a4dd1f35SJohn Wren Kennedy#
245*a4dd1f35SJohn Wren Kennedy# $1 pool name
246*a4dd1f35SJohn Wren Kennedy# $2-n virtual device files
247*a4dd1f35SJohn Wren Kennedy#
248*a4dd1f35SJohn Wren Kennedyfunction replace_missing_devs
249*a4dd1f35SJohn Wren Kennedy{
250*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
251*a4dd1f35SJohn Wren Kennedy	shift
252*a4dd1f35SJohn Wren Kennedy
253*a4dd1f35SJohn Wren Kennedy	typeset vdev
254*a4dd1f35SJohn Wren Kennedy	for vdev in $@; do
255*a4dd1f35SJohn Wren Kennedy		log_must $MKFILE $DEV_SIZE $vdev
256*a4dd1f35SJohn Wren Kennedy		log_must $ZPOOL replace -f $pool $vdev $vdev
257*a4dd1f35SJohn Wren Kennedy		while true; do
258*a4dd1f35SJohn Wren Kennedy			if ! is_pool_resilvered $pool ; then
259*a4dd1f35SJohn Wren Kennedy				log_must $SLEEP 2
260*a4dd1f35SJohn Wren Kennedy			else
261*a4dd1f35SJohn Wren Kennedy				break
262*a4dd1f35SJohn Wren Kennedy			fi
263*a4dd1f35SJohn Wren Kennedy		done
264*a4dd1f35SJohn Wren Kennedy	done
265*a4dd1f35SJohn Wren Kennedy}
266*a4dd1f35SJohn Wren Kennedy
267*a4dd1f35SJohn Wren Kennedy#
268*a4dd1f35SJohn Wren Kennedy# Damage the pool's virtual device files.
269*a4dd1f35SJohn Wren Kennedy#
270*a4dd1f35SJohn Wren Kennedy# $1 pool name
271*a4dd1f35SJohn Wren Kennedy# $2 Failing devices count
272*a4dd1f35SJohn Wren Kennedy# $3 damage vdevs method, if not null, we keep
273*a4dd1f35SJohn Wren Kennedy#    the label for the vdevs
274*a4dd1f35SJohn Wren Kennedy#
275*a4dd1f35SJohn Wren Kennedyfunction damage_devs
276*a4dd1f35SJohn Wren Kennedy{
277*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
278*a4dd1f35SJohn Wren Kennedy	typeset -i cnt=$2
279*a4dd1f35SJohn Wren Kennedy	typeset label="$3"
280*a4dd1f35SJohn Wren Kennedy	typeset vdevs
281*a4dd1f35SJohn Wren Kennedy	typeset -i bs_count
282*a4dd1f35SJohn Wren Kennedy
283*a4dd1f35SJohn Wren Kennedy	vdevs=$(get_vdevs $pool $cnt)
284*a4dd1f35SJohn Wren Kennedy	if [[ -n $label ]]; then
285*a4dd1f35SJohn Wren Kennedy		typeset dev
286*a4dd1f35SJohn Wren Kennedy		for dev in $vdevs; do
287*a4dd1f35SJohn Wren Kennedy			bs_count=$($LS -l $dev | $AWK '{print $5}')
288*a4dd1f35SJohn Wren Kennedy			(( bs_count = bs_count/1024 - 512 ))
289*a4dd1f35SJohn Wren Kennedy			$DD if=/dev/zero of=$dev seek=512 bs=1024 \
290*a4dd1f35SJohn Wren Kennedy				count=$bs_count conv=notrunc >/dev/null 2>&1
291*a4dd1f35SJohn Wren Kennedy		done
292*a4dd1f35SJohn Wren Kennedy	else
293*a4dd1f35SJohn Wren Kennedy		log_must $MKFILE $DEV_SIZE $vdevs
294*a4dd1f35SJohn Wren Kennedy	fi
295*a4dd1f35SJohn Wren Kennedy
296*a4dd1f35SJohn Wren Kennedy	sync_pool $pool
297*a4dd1f35SJohn Wren Kennedy}
298*a4dd1f35SJohn Wren Kennedy
299*a4dd1f35SJohn Wren Kennedy#
300*a4dd1f35SJohn Wren Kennedy# Clear errors in the pool caused by data corruptions
301*a4dd1f35SJohn Wren Kennedy#
302*a4dd1f35SJohn Wren Kennedy# $1 pool name
303*a4dd1f35SJohn Wren Kennedy#
304*a4dd1f35SJohn Wren Kennedyfunction clear_errors
305*a4dd1f35SJohn Wren Kennedy{
306*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
307*a4dd1f35SJohn Wren Kennedy
308*a4dd1f35SJohn Wren Kennedy	log_must $ZPOOL clear $pool
309*a4dd1f35SJohn Wren Kennedy
310*a4dd1f35SJohn Wren Kennedy	if ! is_healthy $pool ; then
311*a4dd1f35SJohn Wren Kennedy		log_note "$pool should be healthy."
312*a4dd1f35SJohn Wren Kennedy		return 1
313*a4dd1f35SJohn Wren Kennedy	fi
314*a4dd1f35SJohn Wren Kennedy	if ! is_data_valid $pool ; then
315*a4dd1f35SJohn Wren Kennedy		log_note "Data should be valid in $pool."
316*a4dd1f35SJohn Wren Kennedy		return 1
317*a4dd1f35SJohn Wren Kennedy	fi
318*a4dd1f35SJohn Wren Kennedy
319*a4dd1f35SJohn Wren Kennedy	return 0
320*a4dd1f35SJohn Wren Kennedy}
321*a4dd1f35SJohn Wren Kennedy
322*a4dd1f35SJohn Wren Kennedy#
323*a4dd1f35SJohn Wren Kennedy# Remove the specified pool's virtual device files
324*a4dd1f35SJohn Wren Kennedy#
325*a4dd1f35SJohn Wren Kennedy# $1 Pool name
326*a4dd1f35SJohn Wren Kennedy# $2 Missing devices count
327*a4dd1f35SJohn Wren Kennedy#
328*a4dd1f35SJohn Wren Kennedyfunction remove_devs
329*a4dd1f35SJohn Wren Kennedy{
330*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
331*a4dd1f35SJohn Wren Kennedy	typeset -i cnt=$2
332*a4dd1f35SJohn Wren Kennedy	typeset vdevs
333*a4dd1f35SJohn Wren Kennedy
334*a4dd1f35SJohn Wren Kennedy	vdevs=$(get_vdevs $pool $cnt)
335*a4dd1f35SJohn Wren Kennedy	log_must $RM -f $vdevs
336*a4dd1f35SJohn Wren Kennedy
337*a4dd1f35SJohn Wren Kennedy	sync_pool $pool
338*a4dd1f35SJohn Wren Kennedy}
339*a4dd1f35SJohn Wren Kennedy
340*a4dd1f35SJohn Wren Kennedy#
341*a4dd1f35SJohn Wren Kennedy# Recover the bad or missing device files in the pool
342*a4dd1f35SJohn Wren Kennedy#
343*a4dd1f35SJohn Wren Kennedy# $1 Pool name
344*a4dd1f35SJohn Wren Kennedy# $2 Missing devices count
345*a4dd1f35SJohn Wren Kennedy#
346*a4dd1f35SJohn Wren Kennedyfunction recover_bad_missing_devs
347*a4dd1f35SJohn Wren Kennedy{
348*a4dd1f35SJohn Wren Kennedy	typeset pool=$1
349*a4dd1f35SJohn Wren Kennedy	typeset -i cnt=$2
350*a4dd1f35SJohn Wren Kennedy	typeset vdevs
351*a4dd1f35SJohn Wren Kennedy
352*a4dd1f35SJohn Wren Kennedy	vdevs=$(get_vdevs $pool $cnt)
353*a4dd1f35SJohn Wren Kennedy	replace_missing_devs $pool $vdevs
354*a4dd1f35SJohn Wren Kennedy
355*a4dd1f35SJohn Wren Kennedy	if ! is_healthy $pool ; then
356*a4dd1f35SJohn Wren Kennedy		log_note "$pool should be healthy."
357*a4dd1f35SJohn Wren Kennedy		return 1
358*a4dd1f35SJohn Wren Kennedy	fi
359*a4dd1f35SJohn Wren Kennedy	if ! is_data_valid $pool ; then
360*a4dd1f35SJohn Wren Kennedy		log_note "Data should be valid in $pool."
361*a4dd1f35SJohn Wren Kennedy		return 1
362*a4dd1f35SJohn Wren Kennedy	fi
363*a4dd1f35SJohn Wren Kennedy
364*a4dd1f35SJohn Wren Kennedy	return 0
365*a4dd1f35SJohn Wren Kennedy}
366