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