1#!/usr/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27
28#
29# Copyright (c) 2013 by Delphix. All rights reserved.
30#
31
32. $STF_SUITE/include/libtest.shlib
33. $STF_SUITE/tests/functional/online_offline/online_offline.cfg
34
35#
36# DESCRIPTION:
37# 	Turning both disks offline should fail.
38#
39# STRATEGY:
40#	1. Create a mirror and start some random I/O
41#	2. For each disk in the mirror, set them offline sequentially.
42#	3. Only one disk can be offline at any one time.
43#	4. Verify the integrity of the file system and the resilvering.
44#
45
46verify_runnable "global"
47
48DISKLIST=$(get_disklist $TESTPOOL)
49
50function cleanup
51{
52	if [[ -n "$child_pids" ]]; then
53		for wait_pid in $child_pids
54		do
55		        $KILL $wait_pid
56		done
57	fi
58
59	#
60	# Ensure we don't leave disks in the offline state
61	#
62	for disk in $DISKLIST; do
63		log_must $ZPOOL online $TESTPOOL $disk
64		check_state $TESTPOOL $disk "online"
65		if [[ $? != 0 ]]; then
66			log_fail "Unable to online $disk"
67		fi
68
69	done
70
71	[[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
72}
73
74log_assert "Turning both disks offline should fail."
75
76options=""
77options_display="default options"
78
79log_onexit cleanup
80
81[[ -n "$HOLES_FILESIZE" ]] && options=" $options -f $HOLES_FILESIZE "
82
83[[ -n "$HOLES_BLKSIZE" ]] && options="$options -b $HOLES_BLKSIZE "
84
85[[ -n "$HOLES_COUNT" ]] && options="$options -c $HOLES_COUNT "
86
87[[ -n "$HOLES_SEED" ]] && options="$options -s $HOLES_SEED "
88
89[[ -n "$HOLES_FILEOFFSET" ]] && options="$options -o $HOLES_FILEOFFSET "
90
91options="$options -r "
92
93[[ -n "$options" ]] && options_display=$options
94
95child_pid=""
96
97typeset -i iters=2
98typeset -i index=0
99
100i=0
101while [[ $i -lt $iters ]]; do
102	log_note "Invoking $FILE_TRUNC with: $options_display"
103	$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
104	typeset pid=$!
105
106	$SLEEP 1
107	if ! $PS -p $pid > /dev/null 2>&1; then
108		log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
109	fi
110
111	child_pids="$child_pids $pid"
112	((i = i + 1))
113done
114
115set -A disk "" $DISKLIST
116
117log_must $ZPOOL offline $TESTPOOL ${disk[1]}
118
119$SLEEP 60
120
121for wait_pid in $child_pids
122do
123	$KILL $wait_pid
124done
125child_pids=""
126
127i=1
128while [[ $i != ${#disk[*]} ]]; do
129	log_must $ZPOOL online $TESTPOOL ${disk[$i]}
130	check_state $TESTPOOL ${disk[$i]} "online"
131	if [[ $? != 0 ]]; then
132		log_fail "${disk[$i]} of $TESTPOOL did not match online state"
133	fi
134
135	((i = i + 1))
136done
137
138typeset dir=$(get_device_dir $DISKS)
139verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"
140
141log_pass
142