xref: /titanic_51/usr/src/test/zfs-tests/include/libtest.shlib (revision 52244c0958bdf281ca42932b449f644b4decfdc2)
1d583b39bSJohn Wren Kennedy#
2d583b39bSJohn Wren Kennedy# CDDL HEADER START
3d583b39bSJohn Wren Kennedy#
4d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the
5d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License").
6d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License.
7d583b39bSJohn Wren Kennedy#
8d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
10d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions
11d583b39bSJohn Wren Kennedy# and limitations under the License.
12d583b39bSJohn Wren Kennedy#
13d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
14d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
16d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
17d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
18d583b39bSJohn Wren Kennedy#
19d583b39bSJohn Wren Kennedy# CDDL HEADER END
20d583b39bSJohn Wren Kennedy#
21d583b39bSJohn Wren Kennedy
22d583b39bSJohn Wren Kennedy#
23d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24d583b39bSJohn Wren Kennedy# Use is subject to license terms.
25d583b39bSJohn Wren Kennedy#
26d583b39bSJohn Wren Kennedy
27d583b39bSJohn Wren Kennedy#
28*52244c09SJohn Wren Kennedy# Copyright (c) 2012, 2014 by Delphix. All rights reserved.
29d583b39bSJohn Wren Kennedy#
30d583b39bSJohn Wren Kennedy
31d583b39bSJohn Wren Kennedy. ${STF_TOOLS}/contrib/include/logapi.shlib
32d583b39bSJohn Wren Kennedy
33d583b39bSJohn Wren KennedyZFS=${ZFS:-/usr/sbin/zfs}
34d583b39bSJohn Wren KennedyZPOOL=${ZPOOL:-/usr/sbin/zpool}
35d583b39bSJohn Wren Kennedy
36d583b39bSJohn Wren Kennedy# Determine whether a dataset is mounted
37d583b39bSJohn Wren Kennedy#
38d583b39bSJohn Wren Kennedy# $1 dataset name
39d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs
40d583b39bSJohn Wren Kennedy#
41d583b39bSJohn Wren Kennedy# Return 0 if dataset is mounted; 1 if unmounted; 2 on error
42d583b39bSJohn Wren Kennedy
43d583b39bSJohn Wren Kennedyfunction ismounted
44d583b39bSJohn Wren Kennedy{
45d583b39bSJohn Wren Kennedy	typeset fstype=$2
46d583b39bSJohn Wren Kennedy	[[ -z $fstype ]] && fstype=zfs
47d583b39bSJohn Wren Kennedy	typeset out dir name ret
48d583b39bSJohn Wren Kennedy
49d583b39bSJohn Wren Kennedy	case $fstype in
50d583b39bSJohn Wren Kennedy		zfs)
51d583b39bSJohn Wren Kennedy			if [[ "$1" == "/"* ]] ; then
52d583b39bSJohn Wren Kennedy				for out in $($ZFS mount | $AWK '{print $2}'); do
53d583b39bSJohn Wren Kennedy					[[ $1 == $out ]] && return 0
54d583b39bSJohn Wren Kennedy				done
55d583b39bSJohn Wren Kennedy			else
56d583b39bSJohn Wren Kennedy				for out in $($ZFS mount | $AWK '{print $1}'); do
57d583b39bSJohn Wren Kennedy					[[ $1 == $out ]] && return 0
58d583b39bSJohn Wren Kennedy				done
59d583b39bSJohn Wren Kennedy			fi
60d583b39bSJohn Wren Kennedy		;;
61d583b39bSJohn Wren Kennedy		ufs|nfs)
62d583b39bSJohn Wren Kennedy			out=$($DF -F $fstype $1 2>/dev/null)
63d583b39bSJohn Wren Kennedy			ret=$?
64d583b39bSJohn Wren Kennedy			(($ret != 0)) && return $ret
65d583b39bSJohn Wren Kennedy
66d583b39bSJohn Wren Kennedy			dir=${out%%\(*}
67d583b39bSJohn Wren Kennedy			dir=${dir%% *}
68d583b39bSJohn Wren Kennedy			name=${out##*\(}
69d583b39bSJohn Wren Kennedy			name=${name%%\)*}
70d583b39bSJohn Wren Kennedy			name=${name%% *}
71d583b39bSJohn Wren Kennedy
72d583b39bSJohn Wren Kennedy			[[ "$1" == "$dir" || "$1" == "$name" ]] && return 0
73d583b39bSJohn Wren Kennedy		;;
74d583b39bSJohn Wren Kennedy	esac
75d583b39bSJohn Wren Kennedy
76d583b39bSJohn Wren Kennedy	return 1
77d583b39bSJohn Wren Kennedy}
78d583b39bSJohn Wren Kennedy
79d583b39bSJohn Wren Kennedy# Return 0 if a dataset is mounted; 1 otherwise
80d583b39bSJohn Wren Kennedy#
81d583b39bSJohn Wren Kennedy# $1 dataset name
82d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs
83d583b39bSJohn Wren Kennedy
84d583b39bSJohn Wren Kennedyfunction mounted
85d583b39bSJohn Wren Kennedy{
86d583b39bSJohn Wren Kennedy	ismounted $1 $2
87d583b39bSJohn Wren Kennedy	(($? == 0)) && return 0
88d583b39bSJohn Wren Kennedy	return 1
89d583b39bSJohn Wren Kennedy}
90d583b39bSJohn Wren Kennedy
91d583b39bSJohn Wren Kennedy# Return 0 if a dataset is unmounted; 1 otherwise
92d583b39bSJohn Wren Kennedy#
93d583b39bSJohn Wren Kennedy# $1 dataset name
94d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs
95d583b39bSJohn Wren Kennedy
96d583b39bSJohn Wren Kennedyfunction unmounted
97d583b39bSJohn Wren Kennedy{
98d583b39bSJohn Wren Kennedy	ismounted $1 $2
99d583b39bSJohn Wren Kennedy	(($? == 1)) && return 0
100d583b39bSJohn Wren Kennedy	return 1
101d583b39bSJohn Wren Kennedy}
102d583b39bSJohn Wren Kennedy
103d583b39bSJohn Wren Kennedy# split line on ","
104d583b39bSJohn Wren Kennedy#
105d583b39bSJohn Wren Kennedy# $1 - line to split
106d583b39bSJohn Wren Kennedy
107d583b39bSJohn Wren Kennedyfunction splitline
108d583b39bSJohn Wren Kennedy{
109d583b39bSJohn Wren Kennedy	$ECHO $1 | $SED "s/,/ /g"
110d583b39bSJohn Wren Kennedy}
111d583b39bSJohn Wren Kennedy
112d583b39bSJohn Wren Kennedyfunction default_setup
113d583b39bSJohn Wren Kennedy{
114d583b39bSJohn Wren Kennedy	default_setup_noexit "$@"
115d583b39bSJohn Wren Kennedy
116d583b39bSJohn Wren Kennedy	log_pass
117d583b39bSJohn Wren Kennedy}
118d583b39bSJohn Wren Kennedy
119d583b39bSJohn Wren Kennedy#
120d583b39bSJohn Wren Kennedy# Given a list of disks, setup storage pools and datasets.
121d583b39bSJohn Wren Kennedy#
122d583b39bSJohn Wren Kennedyfunction default_setup_noexit
123d583b39bSJohn Wren Kennedy{
124d583b39bSJohn Wren Kennedy	typeset disklist=$1
125d583b39bSJohn Wren Kennedy	typeset container=$2
126d583b39bSJohn Wren Kennedy	typeset volume=$3
127d583b39bSJohn Wren Kennedy
128d583b39bSJohn Wren Kennedy	if is_global_zone; then
129d583b39bSJohn Wren Kennedy		if poolexists $TESTPOOL ; then
130d583b39bSJohn Wren Kennedy			destroy_pool $TESTPOOL
131d583b39bSJohn Wren Kennedy		fi
132d583b39bSJohn Wren Kennedy		[[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL
133d583b39bSJohn Wren Kennedy		log_must $ZPOOL create -f $TESTPOOL $disklist
134d583b39bSJohn Wren Kennedy	else
135d583b39bSJohn Wren Kennedy		reexport_pool
136d583b39bSJohn Wren Kennedy	fi
137d583b39bSJohn Wren Kennedy
138d583b39bSJohn Wren Kennedy	$RM -rf $TESTDIR  || log_unresolved Could not remove $TESTDIR
139d583b39bSJohn Wren Kennedy	$MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR
140d583b39bSJohn Wren Kennedy
141d583b39bSJohn Wren Kennedy	log_must $ZFS create $TESTPOOL/$TESTFS
142d583b39bSJohn Wren Kennedy	log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
143d583b39bSJohn Wren Kennedy
144d583b39bSJohn Wren Kennedy	if [[ -n $container ]]; then
145d583b39bSJohn Wren Kennedy		$RM -rf $TESTDIR1  || \
146d583b39bSJohn Wren Kennedy			log_unresolved Could not remove $TESTDIR1
147d583b39bSJohn Wren Kennedy		$MKDIR -p $TESTDIR1 || \
148d583b39bSJohn Wren Kennedy			log_unresolved Could not create $TESTDIR1
149d583b39bSJohn Wren Kennedy
150d583b39bSJohn Wren Kennedy		log_must $ZFS create $TESTPOOL/$TESTCTR
151d583b39bSJohn Wren Kennedy		log_must $ZFS set canmount=off $TESTPOOL/$TESTCTR
152d583b39bSJohn Wren Kennedy		log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1
153d583b39bSJohn Wren Kennedy		log_must $ZFS set mountpoint=$TESTDIR1 \
154d583b39bSJohn Wren Kennedy		    $TESTPOOL/$TESTCTR/$TESTFS1
155d583b39bSJohn Wren Kennedy	fi
156d583b39bSJohn Wren Kennedy
157d583b39bSJohn Wren Kennedy	if [[ -n $volume ]]; then
158d583b39bSJohn Wren Kennedy		if is_global_zone ; then
159d583b39bSJohn Wren Kennedy			log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL
160d583b39bSJohn Wren Kennedy		else
161d583b39bSJohn Wren Kennedy			log_must $ZFS create $TESTPOOL/$TESTVOL
162d583b39bSJohn Wren Kennedy		fi
163d583b39bSJohn Wren Kennedy	fi
164d583b39bSJohn Wren Kennedy}
165d583b39bSJohn Wren Kennedy
166d583b39bSJohn Wren Kennedy#
167d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool, file system and
168d583b39bSJohn Wren Kennedy# a container.
169d583b39bSJohn Wren Kennedy#
170d583b39bSJohn Wren Kennedyfunction default_container_setup
171d583b39bSJohn Wren Kennedy{
172d583b39bSJohn Wren Kennedy	typeset disklist=$1
173d583b39bSJohn Wren Kennedy
174d583b39bSJohn Wren Kennedy	default_setup "$disklist" "true"
175d583b39bSJohn Wren Kennedy}
176d583b39bSJohn Wren Kennedy
177d583b39bSJohn Wren Kennedy#
178d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool,file system
179d583b39bSJohn Wren Kennedy# and a volume.
180d583b39bSJohn Wren Kennedy#
181d583b39bSJohn Wren Kennedyfunction default_volume_setup
182d583b39bSJohn Wren Kennedy{
183d583b39bSJohn Wren Kennedy	typeset disklist=$1
184d583b39bSJohn Wren Kennedy
185d583b39bSJohn Wren Kennedy	default_setup "$disklist" "" "true"
186d583b39bSJohn Wren Kennedy}
187d583b39bSJohn Wren Kennedy
188d583b39bSJohn Wren Kennedy#
189d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool,file system,
190d583b39bSJohn Wren Kennedy# a container and a volume.
191d583b39bSJohn Wren Kennedy#
192d583b39bSJohn Wren Kennedyfunction default_container_volume_setup
193d583b39bSJohn Wren Kennedy{
194d583b39bSJohn Wren Kennedy	typeset disklist=$1
195d583b39bSJohn Wren Kennedy
196d583b39bSJohn Wren Kennedy	default_setup "$disklist" "true" "true"
197d583b39bSJohn Wren Kennedy}
198d583b39bSJohn Wren Kennedy
199d583b39bSJohn Wren Kennedy#
200d583b39bSJohn Wren Kennedy# Create a snapshot on a filesystem or volume. Defaultly create a snapshot on
201d583b39bSJohn Wren Kennedy# filesystem
202d583b39bSJohn Wren Kennedy#
203d583b39bSJohn Wren Kennedy# $1 Existing filesystem or volume name. Default, $TESTFS
204d583b39bSJohn Wren Kennedy# $2 snapshot name. Default, $TESTSNAP
205d583b39bSJohn Wren Kennedy#
206d583b39bSJohn Wren Kennedyfunction create_snapshot
207d583b39bSJohn Wren Kennedy{
208d583b39bSJohn Wren Kennedy	typeset fs_vol=${1:-$TESTFS}
209d583b39bSJohn Wren Kennedy	typeset snap=${2:-$TESTSNAP}
210d583b39bSJohn Wren Kennedy
211d583b39bSJohn Wren Kennedy	[[ -z $fs_vol ]] && log_fail "Filesystem or volume's name is undefined."
212d583b39bSJohn Wren Kennedy	[[ -z $snap ]] && log_fail "Snapshot's name is undefined."
213d583b39bSJohn Wren Kennedy
214d583b39bSJohn Wren Kennedy	if snapexists $fs_vol@$snap; then
215d583b39bSJohn Wren Kennedy		log_fail "$fs_vol@$snap already exists."
216d583b39bSJohn Wren Kennedy	fi
217d583b39bSJohn Wren Kennedy	datasetexists $fs_vol || \
218d583b39bSJohn Wren Kennedy		log_fail "$fs_vol must exist."
219d583b39bSJohn Wren Kennedy
220d583b39bSJohn Wren Kennedy	log_must $ZFS snapshot $fs_vol@$snap
221d583b39bSJohn Wren Kennedy}
222d583b39bSJohn Wren Kennedy
223d583b39bSJohn Wren Kennedy#
224d583b39bSJohn Wren Kennedy# Create a clone from a snapshot, default clone name is $TESTCLONE.
225d583b39bSJohn Wren Kennedy#
226d583b39bSJohn Wren Kennedy# $1 Existing snapshot, $TESTPOOL/$TESTFS@$TESTSNAP is default.
227d583b39bSJohn Wren Kennedy# $2 Clone name, $TESTPOOL/$TESTCLONE is default.
228d583b39bSJohn Wren Kennedy#
229d583b39bSJohn Wren Kennedyfunction create_clone   # snapshot clone
230d583b39bSJohn Wren Kennedy{
231d583b39bSJohn Wren Kennedy	typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP}
232d583b39bSJohn Wren Kennedy	typeset clone=${2:-$TESTPOOL/$TESTCLONE}
233d583b39bSJohn Wren Kennedy
234d583b39bSJohn Wren Kennedy	[[ -z $snap ]] && \
235d583b39bSJohn Wren Kennedy		log_fail "Snapshot name is undefined."
236d583b39bSJohn Wren Kennedy	[[ -z $clone ]] && \
237d583b39bSJohn Wren Kennedy		log_fail "Clone name is undefined."
238d583b39bSJohn Wren Kennedy
239d583b39bSJohn Wren Kennedy	log_must $ZFS clone $snap $clone
240d583b39bSJohn Wren Kennedy}
241d583b39bSJohn Wren Kennedy
242d583b39bSJohn Wren Kennedyfunction default_mirror_setup
243d583b39bSJohn Wren Kennedy{
244d583b39bSJohn Wren Kennedy	default_mirror_setup_noexit $1 $2 $3
245d583b39bSJohn Wren Kennedy
246d583b39bSJohn Wren Kennedy	log_pass
247d583b39bSJohn Wren Kennedy}
248d583b39bSJohn Wren Kennedy
249d583b39bSJohn Wren Kennedy#
250d583b39bSJohn Wren Kennedy# Given a pair of disks, set up a storage pool and dataset for the mirror
251d583b39bSJohn Wren Kennedy# @parameters: $1 the primary side of the mirror
252d583b39bSJohn Wren Kennedy#   $2 the secondary side of the mirror
253d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL TESTFS
254d583b39bSJohn Wren Kennedyfunction default_mirror_setup_noexit
255d583b39bSJohn Wren Kennedy{
256d583b39bSJohn Wren Kennedy	readonly func="default_mirror_setup_noexit"
257d583b39bSJohn Wren Kennedy	typeset primary=$1
258d583b39bSJohn Wren Kennedy	typeset secondary=$2
259d583b39bSJohn Wren Kennedy
260d583b39bSJohn Wren Kennedy	[[ -z $primary ]] && \
261d583b39bSJohn Wren Kennedy		log_fail "$func: No parameters passed"
262d583b39bSJohn Wren Kennedy	[[ -z $secondary ]] && \
263d583b39bSJohn Wren Kennedy		log_fail "$func: No secondary partition passed"
264d583b39bSJohn Wren Kennedy	[[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL
265d583b39bSJohn Wren Kennedy	log_must $ZPOOL create -f $TESTPOOL mirror $@
266d583b39bSJohn Wren Kennedy	log_must $ZFS create $TESTPOOL/$TESTFS
267d583b39bSJohn Wren Kennedy	log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
268d583b39bSJohn Wren Kennedy}
269d583b39bSJohn Wren Kennedy
270d583b39bSJohn Wren Kennedy#
271d583b39bSJohn Wren Kennedy# create a number of mirrors.
272d583b39bSJohn Wren Kennedy# We create a number($1) of 2 way mirrors using the pairs of disks named
273d583b39bSJohn Wren Kennedy# on the command line. These mirrors are *not* mounted
274d583b39bSJohn Wren Kennedy# @parameters: $1 the number of mirrors to create
275d583b39bSJohn Wren Kennedy#  $... the devices to use to create the mirrors on
276d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL
277d583b39bSJohn Wren Kennedyfunction setup_mirrors
278d583b39bSJohn Wren Kennedy{
279d583b39bSJohn Wren Kennedy	typeset -i nmirrors=$1
280d583b39bSJohn Wren Kennedy
281d583b39bSJohn Wren Kennedy	shift
282d583b39bSJohn Wren Kennedy	while ((nmirrors > 0)); do
283d583b39bSJohn Wren Kennedy		log_must test -n "$1" -a -n "$2"
284d583b39bSJohn Wren Kennedy		[[ -d /$TESTPOOL$nmirrors ]] && $RM -rf /$TESTPOOL$nmirrors
285d583b39bSJohn Wren Kennedy		log_must $ZPOOL create -f $TESTPOOL$nmirrors mirror $1 $2
286d583b39bSJohn Wren Kennedy		shift 2
287d583b39bSJohn Wren Kennedy		((nmirrors = nmirrors - 1))
288d583b39bSJohn Wren Kennedy	done
289d583b39bSJohn Wren Kennedy}
290d583b39bSJohn Wren Kennedy
291d583b39bSJohn Wren Kennedy#
292d583b39bSJohn Wren Kennedy# create a number of raidz pools.
293d583b39bSJohn Wren Kennedy# We create a number($1) of 2 raidz pools  using the pairs of disks named
294d583b39bSJohn Wren Kennedy# on the command line. These pools are *not* mounted
295d583b39bSJohn Wren Kennedy# @parameters: $1 the number of pools to create
296d583b39bSJohn Wren Kennedy#  $... the devices to use to create the pools on
297d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL
298d583b39bSJohn Wren Kennedyfunction setup_raidzs
299d583b39bSJohn Wren Kennedy{
300d583b39bSJohn Wren Kennedy	typeset -i nraidzs=$1
301d583b39bSJohn Wren Kennedy
302d583b39bSJohn Wren Kennedy	shift
303d583b39bSJohn Wren Kennedy	while ((nraidzs > 0)); do
304d583b39bSJohn Wren Kennedy		log_must test -n "$1" -a -n "$2"
305d583b39bSJohn Wren Kennedy		[[ -d /$TESTPOOL$nraidzs ]] && $RM -rf /$TESTPOOL$nraidzs
306d583b39bSJohn Wren Kennedy		log_must $ZPOOL create -f $TESTPOOL$nraidzs raidz $1 $2
307d583b39bSJohn Wren Kennedy		shift 2
308d583b39bSJohn Wren Kennedy		((nraidzs = nraidzs - 1))
309d583b39bSJohn Wren Kennedy	done
310d583b39bSJohn Wren Kennedy}
311d583b39bSJohn Wren Kennedy
312d583b39bSJohn Wren Kennedy#
313d583b39bSJohn Wren Kennedy# Destroy the configured testpool mirrors.
314d583b39bSJohn Wren Kennedy# the mirrors are of the form ${TESTPOOL}{number}
315d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL
316d583b39bSJohn Wren Kennedyfunction destroy_mirrors
317d583b39bSJohn Wren Kennedy{
318d583b39bSJohn Wren Kennedy	default_cleanup_noexit
319d583b39bSJohn Wren Kennedy
320d583b39bSJohn Wren Kennedy	log_pass
321d583b39bSJohn Wren Kennedy}
322d583b39bSJohn Wren Kennedy
323d583b39bSJohn Wren Kennedy#
324d583b39bSJohn Wren Kennedy# Given a minimum of two disks, set up a storage pool and dataset for the raid-z
325d583b39bSJohn Wren Kennedy# $1 the list of disks
326d583b39bSJohn Wren Kennedy#
327d583b39bSJohn Wren Kennedyfunction default_raidz_setup
328d583b39bSJohn Wren Kennedy{
329d583b39bSJohn Wren Kennedy	typeset disklist="$*"
330d583b39bSJohn Wren Kennedy	disks=(${disklist[*]})
331d583b39bSJohn Wren Kennedy
332d583b39bSJohn Wren Kennedy	if [[ ${#disks[*]} -lt 2 ]]; then
333d583b39bSJohn Wren Kennedy		log_fail "A raid-z requires a minimum of two disks."
334d583b39bSJohn Wren Kennedy	fi
335d583b39bSJohn Wren Kennedy
336d583b39bSJohn Wren Kennedy	[[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL
337d583b39bSJohn Wren Kennedy	log_must $ZPOOL create -f $TESTPOOL raidz $1 $2 $3
338d583b39bSJohn Wren Kennedy	log_must $ZFS create $TESTPOOL/$TESTFS
339d583b39bSJohn Wren Kennedy	log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
340d583b39bSJohn Wren Kennedy
341d583b39bSJohn Wren Kennedy	log_pass
342d583b39bSJohn Wren Kennedy}
343d583b39bSJohn Wren Kennedy
344d583b39bSJohn Wren Kennedy#
345d583b39bSJohn Wren Kennedy# Common function used to cleanup storage pools and datasets.
346d583b39bSJohn Wren Kennedy#
347d583b39bSJohn Wren Kennedy# Invoked at the start of the test suite to ensure the system
348d583b39bSJohn Wren Kennedy# is in a known state, and also at the end of each set of
349d583b39bSJohn Wren Kennedy# sub-tests to ensure errors from one set of tests doesn't
350d583b39bSJohn Wren Kennedy# impact the execution of the next set.
351d583b39bSJohn Wren Kennedy
352d583b39bSJohn Wren Kennedyfunction default_cleanup
353d583b39bSJohn Wren Kennedy{
354d583b39bSJohn Wren Kennedy	default_cleanup_noexit
355d583b39bSJohn Wren Kennedy
356d583b39bSJohn Wren Kennedy	log_pass
357d583b39bSJohn Wren Kennedy}
358d583b39bSJohn Wren Kennedy
359d583b39bSJohn Wren Kennedyfunction default_cleanup_noexit
360d583b39bSJohn Wren Kennedy{
361d583b39bSJohn Wren Kennedy	typeset exclude=""
362d583b39bSJohn Wren Kennedy	typeset pool=""
363d583b39bSJohn Wren Kennedy	#
364d583b39bSJohn Wren Kennedy	# Destroying the pool will also destroy any
365d583b39bSJohn Wren Kennedy	# filesystems it contains.
366d583b39bSJohn Wren Kennedy	#
367d583b39bSJohn Wren Kennedy	if is_global_zone; then
368d583b39bSJohn Wren Kennedy		$ZFS unmount -a > /dev/null 2>&1
369d583b39bSJohn Wren Kennedy		exclude=`eval $ECHO \"'(${KEEP})'\"`
370d583b39bSJohn Wren Kennedy		ALL_POOLS=$($ZPOOL list -H -o name \
371d583b39bSJohn Wren Kennedy		    | $GREP -v "$NO_POOLS" | $EGREP -v "$exclude")
372d583b39bSJohn Wren Kennedy		# Here, we loop through the pools we're allowed to
373d583b39bSJohn Wren Kennedy		# destroy, only destroying them if it's safe to do
374d583b39bSJohn Wren Kennedy		# so.
375d583b39bSJohn Wren Kennedy		while [ ! -z ${ALL_POOLS} ]
376d583b39bSJohn Wren Kennedy		do
377d583b39bSJohn Wren Kennedy			for pool in ${ALL_POOLS}
378d583b39bSJohn Wren Kennedy			do
379d583b39bSJohn Wren Kennedy				if safe_to_destroy_pool $pool ;
380d583b39bSJohn Wren Kennedy				then
381d583b39bSJohn Wren Kennedy					destroy_pool $pool
382d583b39bSJohn Wren Kennedy				fi
383d583b39bSJohn Wren Kennedy				ALL_POOLS=$($ZPOOL list -H -o name \
384d583b39bSJohn Wren Kennedy				    | $GREP -v "$NO_POOLS" \
385d583b39bSJohn Wren Kennedy				    | $EGREP -v "$exclude")
386d583b39bSJohn Wren Kennedy			done
387d583b39bSJohn Wren Kennedy		done
388d583b39bSJohn Wren Kennedy
389d583b39bSJohn Wren Kennedy		$ZFS mount -a
390d583b39bSJohn Wren Kennedy	else
391d583b39bSJohn Wren Kennedy		typeset fs=""
392d583b39bSJohn Wren Kennedy		for fs in $($ZFS list -H -o name \
393d583b39bSJohn Wren Kennedy		    | $GREP "^$ZONE_POOL/$ZONE_CTR[01234]/"); do
394d583b39bSJohn Wren Kennedy			datasetexists $fs && \
395d583b39bSJohn Wren Kennedy				log_must $ZFS destroy -Rf $fs
396d583b39bSJohn Wren Kennedy		done
397d583b39bSJohn Wren Kennedy
398d583b39bSJohn Wren Kennedy		# Need cleanup here to avoid garbage dir left.
399d583b39bSJohn Wren Kennedy		for fs in $($ZFS list -H -o name); do
400d583b39bSJohn Wren Kennedy			[[ $fs == /$ZONE_POOL ]] && continue
401d583b39bSJohn Wren Kennedy			[[ -d $fs ]] && log_must $RM -rf $fs/*
402d583b39bSJohn Wren Kennedy		done
403d583b39bSJohn Wren Kennedy
404d583b39bSJohn Wren Kennedy		#
405d583b39bSJohn Wren Kennedy		# Reset the $ZONE_POOL/$ZONE_CTR[01234] file systems property to
406d583b39bSJohn Wren Kennedy		# the default value
407d583b39bSJohn Wren Kennedy		#
408d583b39bSJohn Wren Kennedy		for fs in $($ZFS list -H -o name); do
409d583b39bSJohn Wren Kennedy			if [[ $fs == $ZONE_POOL/$ZONE_CTR[01234] ]]; then
410d583b39bSJohn Wren Kennedy				log_must $ZFS set reservation=none $fs
411d583b39bSJohn Wren Kennedy				log_must $ZFS set recordsize=128K $fs
412d583b39bSJohn Wren Kennedy				log_must $ZFS set mountpoint=/$fs $fs
413d583b39bSJohn Wren Kennedy				typeset enc=""
414d583b39bSJohn Wren Kennedy				enc=$(get_prop encryption $fs)
415d583b39bSJohn Wren Kennedy				if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || \
416d583b39bSJohn Wren Kennedy					[[ "$enc" == "off" ]]; then
417d583b39bSJohn Wren Kennedy					log_must $ZFS set checksum=on $fs
418d583b39bSJohn Wren Kennedy				fi
419d583b39bSJohn Wren Kennedy				log_must $ZFS set compression=off $fs
420d583b39bSJohn Wren Kennedy				log_must $ZFS set atime=on $fs
421d583b39bSJohn Wren Kennedy				log_must $ZFS set devices=off $fs
422d583b39bSJohn Wren Kennedy				log_must $ZFS set exec=on $fs
423d583b39bSJohn Wren Kennedy				log_must $ZFS set setuid=on $fs
424d583b39bSJohn Wren Kennedy				log_must $ZFS set readonly=off $fs
425d583b39bSJohn Wren Kennedy				log_must $ZFS set snapdir=hidden $fs
426d583b39bSJohn Wren Kennedy				log_must $ZFS set aclmode=groupmask $fs
427d583b39bSJohn Wren Kennedy				log_must $ZFS set aclinherit=secure $fs
428d583b39bSJohn Wren Kennedy			fi
429d583b39bSJohn Wren Kennedy		done
430d583b39bSJohn Wren Kennedy	fi
431d583b39bSJohn Wren Kennedy
432d583b39bSJohn Wren Kennedy	[[ -d $TESTDIR ]] && \
433d583b39bSJohn Wren Kennedy		log_must $RM -rf $TESTDIR
434d583b39bSJohn Wren Kennedy}
435d583b39bSJohn Wren Kennedy
436d583b39bSJohn Wren Kennedy
437d583b39bSJohn Wren Kennedy#
438d583b39bSJohn Wren Kennedy# Common function used to cleanup storage pools, file systems
439d583b39bSJohn Wren Kennedy# and containers.
440d583b39bSJohn Wren Kennedy#
441d583b39bSJohn Wren Kennedyfunction default_container_cleanup
442d583b39bSJohn Wren Kennedy{
443d583b39bSJohn Wren Kennedy	if ! is_global_zone; then
444d583b39bSJohn Wren Kennedy		reexport_pool
445d583b39bSJohn Wren Kennedy	fi
446d583b39bSJohn Wren Kennedy
447d583b39bSJohn Wren Kennedy	ismounted $TESTPOOL/$TESTCTR/$TESTFS1
448d583b39bSJohn Wren Kennedy	[[ $? -eq 0 ]] && \
449d583b39bSJohn Wren Kennedy	    log_must $ZFS unmount $TESTPOOL/$TESTCTR/$TESTFS1
450d583b39bSJohn Wren Kennedy
451d583b39bSJohn Wren Kennedy	datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \
452d583b39bSJohn Wren Kennedy	    log_must $ZFS destroy -R $TESTPOOL/$TESTCTR/$TESTFS1
453d583b39bSJohn Wren Kennedy
454d583b39bSJohn Wren Kennedy	datasetexists $TESTPOOL/$TESTCTR && \
455d583b39bSJohn Wren Kennedy	    log_must $ZFS destroy -Rf $TESTPOOL/$TESTCTR
456d583b39bSJohn Wren Kennedy
457d583b39bSJohn Wren Kennedy	[[ -e $TESTDIR1 ]] && \
458d583b39bSJohn Wren Kennedy	    log_must $RM -rf $TESTDIR1 > /dev/null 2>&1
459d583b39bSJohn Wren Kennedy
460d583b39bSJohn Wren Kennedy	default_cleanup
461d583b39bSJohn Wren Kennedy}
462d583b39bSJohn Wren Kennedy
463d583b39bSJohn Wren Kennedy#
464d583b39bSJohn Wren Kennedy# Common function used to cleanup snapshot of file system or volume. Default to
465d583b39bSJohn Wren Kennedy# delete the file system's snapshot
466d583b39bSJohn Wren Kennedy#
467d583b39bSJohn Wren Kennedy# $1 snapshot name
468d583b39bSJohn Wren Kennedy#
469d583b39bSJohn Wren Kennedyfunction destroy_snapshot
470d583b39bSJohn Wren Kennedy{
471d583b39bSJohn Wren Kennedy	typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP}
472d583b39bSJohn Wren Kennedy
473d583b39bSJohn Wren Kennedy	if ! snapexists $snap; then
474d583b39bSJohn Wren Kennedy		log_fail "'$snap' does not existed."
475d583b39bSJohn Wren Kennedy	fi
476d583b39bSJohn Wren Kennedy
477d583b39bSJohn Wren Kennedy	#
478d583b39bSJohn Wren Kennedy	# For the sake of the value which come from 'get_prop' is not equal
479d583b39bSJohn Wren Kennedy	# to the really mountpoint when the snapshot is unmounted. So, firstly
480d583b39bSJohn Wren Kennedy	# check and make sure this snapshot's been mounted in current system.
481d583b39bSJohn Wren Kennedy	#
482d583b39bSJohn Wren Kennedy	typeset mtpt=""
483d583b39bSJohn Wren Kennedy	if ismounted $snap; then
484d583b39bSJohn Wren Kennedy		mtpt=$(get_prop mountpoint $snap)
485d583b39bSJohn Wren Kennedy		(($? != 0)) && \
486d583b39bSJohn Wren Kennedy			log_fail "get_prop mountpoint $snap failed."
487d583b39bSJohn Wren Kennedy	fi
488d583b39bSJohn Wren Kennedy
489d583b39bSJohn Wren Kennedy	log_must $ZFS destroy $snap
490d583b39bSJohn Wren Kennedy	[[ $mtpt != "" && -d $mtpt ]] && \
491d583b39bSJohn Wren Kennedy		log_must $RM -rf $mtpt
492d583b39bSJohn Wren Kennedy}
493d583b39bSJohn Wren Kennedy
494d583b39bSJohn Wren Kennedy#
495d583b39bSJohn Wren Kennedy# Common function used to cleanup clone.
496d583b39bSJohn Wren Kennedy#
497d583b39bSJohn Wren Kennedy# $1 clone name
498d583b39bSJohn Wren Kennedy#
499d583b39bSJohn Wren Kennedyfunction destroy_clone
500d583b39bSJohn Wren Kennedy{
501d583b39bSJohn Wren Kennedy	typeset clone=${1:-$TESTPOOL/$TESTCLONE}
502d583b39bSJohn Wren Kennedy
503d583b39bSJohn Wren Kennedy	if ! datasetexists $clone; then
504d583b39bSJohn Wren Kennedy		log_fail "'$clone' does not existed."
505d583b39bSJohn Wren Kennedy	fi
506d583b39bSJohn Wren Kennedy
507d583b39bSJohn Wren Kennedy	# With the same reason in destroy_snapshot
508d583b39bSJohn Wren Kennedy	typeset mtpt=""
509d583b39bSJohn Wren Kennedy	if ismounted $clone; then
510d583b39bSJohn Wren Kennedy		mtpt=$(get_prop mountpoint $clone)
511d583b39bSJohn Wren Kennedy		(($? != 0)) && \
512d583b39bSJohn Wren Kennedy			log_fail "get_prop mountpoint $clone failed."
513d583b39bSJohn Wren Kennedy	fi
514d583b39bSJohn Wren Kennedy
515d583b39bSJohn Wren Kennedy	log_must $ZFS destroy $clone
516d583b39bSJohn Wren Kennedy	[[ $mtpt != "" && -d $mtpt ]] && \
517d583b39bSJohn Wren Kennedy		log_must $RM -rf $mtpt
518d583b39bSJohn Wren Kennedy}
519d583b39bSJohn Wren Kennedy
520d583b39bSJohn Wren Kennedy# Return 0 if a snapshot exists; $? otherwise
521d583b39bSJohn Wren Kennedy#
522d583b39bSJohn Wren Kennedy# $1 - snapshot name
523d583b39bSJohn Wren Kennedy
524d583b39bSJohn Wren Kennedyfunction snapexists
525d583b39bSJohn Wren Kennedy{
526d583b39bSJohn Wren Kennedy	$ZFS list -H -t snapshot "$1" > /dev/null 2>&1
527d583b39bSJohn Wren Kennedy	return $?
528d583b39bSJohn Wren Kennedy}
529d583b39bSJohn Wren Kennedy
530d583b39bSJohn Wren Kennedy#
531d583b39bSJohn Wren Kennedy# Set a property to a certain value on a dataset.
532d583b39bSJohn Wren Kennedy# Sets a property of the dataset to the value as passed in.
533d583b39bSJohn Wren Kennedy# @param:
534d583b39bSJohn Wren Kennedy#	$1 dataset who's property is being set
535d583b39bSJohn Wren Kennedy#	$2 property to set
536d583b39bSJohn Wren Kennedy#	$3 value to set property to
537d583b39bSJohn Wren Kennedy# @return:
538d583b39bSJohn Wren Kennedy#	0 if the property could be set.
539d583b39bSJohn Wren Kennedy#	non-zero otherwise.
540d583b39bSJohn Wren Kennedy# @use: ZFS
541d583b39bSJohn Wren Kennedy#
542d583b39bSJohn Wren Kennedyfunction dataset_setprop
543d583b39bSJohn Wren Kennedy{
544d583b39bSJohn Wren Kennedy	typeset fn=dataset_setprop
545d583b39bSJohn Wren Kennedy
546d583b39bSJohn Wren Kennedy	if (($# < 3)); then
547d583b39bSJohn Wren Kennedy		log_note "$fn: Insufficient parameters (need 3, had $#)"
548d583b39bSJohn Wren Kennedy		return 1
549d583b39bSJohn Wren Kennedy	fi
550d583b39bSJohn Wren Kennedy	typeset output=
551d583b39bSJohn Wren Kennedy	output=$($ZFS set $2=$3 $1 2>&1)
552d583b39bSJohn Wren Kennedy	typeset rv=$?
553d583b39bSJohn Wren Kennedy	if ((rv != 0)); then
554d583b39bSJohn Wren Kennedy		log_note "Setting property on $1 failed."
555d583b39bSJohn Wren Kennedy		log_note "property $2=$3"
556d583b39bSJohn Wren Kennedy		log_note "Return Code: $rv"
557d583b39bSJohn Wren Kennedy		log_note "Output: $output"
558d583b39bSJohn Wren Kennedy		return $rv
559d583b39bSJohn Wren Kennedy	fi
560d583b39bSJohn Wren Kennedy	return 0
561d583b39bSJohn Wren Kennedy}
562d583b39bSJohn Wren Kennedy
563d583b39bSJohn Wren Kennedy#
564d583b39bSJohn Wren Kennedy# Assign suite defined dataset properties.
565d583b39bSJohn Wren Kennedy# This function is used to apply the suite's defined default set of
566d583b39bSJohn Wren Kennedy# properties to a dataset.
567d583b39bSJohn Wren Kennedy# @parameters: $1 dataset to use
568d583b39bSJohn Wren Kennedy# @uses: ZFS COMPRESSION_PROP CHECKSUM_PROP
569d583b39bSJohn Wren Kennedy# @returns:
570d583b39bSJohn Wren Kennedy#   0 if the dataset has been altered.
571d583b39bSJohn Wren Kennedy#   1 if no pool name was passed in.
572d583b39bSJohn Wren Kennedy#   2 if the dataset could not be found.
573d583b39bSJohn Wren Kennedy#   3 if the dataset could not have it's properties set.
574d583b39bSJohn Wren Kennedy#
575d583b39bSJohn Wren Kennedyfunction dataset_set_defaultproperties
576d583b39bSJohn Wren Kennedy{
577d583b39bSJohn Wren Kennedy	typeset dataset="$1"
578d583b39bSJohn Wren Kennedy
579d583b39bSJohn Wren Kennedy	[[ -z $dataset ]] && return 1
580d583b39bSJohn Wren Kennedy
581d583b39bSJohn Wren Kennedy	typeset confset=
582d583b39bSJohn Wren Kennedy	typeset -i found=0
583d583b39bSJohn Wren Kennedy	for confset in $($ZFS list); do
584d583b39bSJohn Wren Kennedy		if [[ $dataset = $confset ]]; then
585d583b39bSJohn Wren Kennedy			found=1
586d583b39bSJohn Wren Kennedy			break
587d583b39bSJohn Wren Kennedy		fi
588d583b39bSJohn Wren Kennedy	done
589d583b39bSJohn Wren Kennedy	[[ $found -eq 0 ]] && return 2
590d583b39bSJohn Wren Kennedy	if [[ -n $COMPRESSION_PROP ]]; then
591d583b39bSJohn Wren Kennedy		dataset_setprop $dataset compression $COMPRESSION_PROP || \
592d583b39bSJohn Wren Kennedy			return 3
593d583b39bSJohn Wren Kennedy		log_note "Compression set to '$COMPRESSION_PROP' on $dataset"
594d583b39bSJohn Wren Kennedy	fi
595d583b39bSJohn Wren Kennedy	if [[ -n $CHECKSUM_PROP ]]; then
596d583b39bSJohn Wren Kennedy		dataset_setprop $dataset checksum $CHECKSUM_PROP || \
597d583b39bSJohn Wren Kennedy			return 3
598d583b39bSJohn Wren Kennedy		log_note "Checksum set to '$CHECKSUM_PROP' on $dataset"
599d583b39bSJohn Wren Kennedy	fi
600d583b39bSJohn Wren Kennedy	return 0
601d583b39bSJohn Wren Kennedy}
602d583b39bSJohn Wren Kennedy
603d583b39bSJohn Wren Kennedy#
604d583b39bSJohn Wren Kennedy# Check a numeric assertion
605d583b39bSJohn Wren Kennedy# @parameter: $@ the assertion to check
606d583b39bSJohn Wren Kennedy# @output: big loud notice if assertion failed
607d583b39bSJohn Wren Kennedy# @use: log_fail
608d583b39bSJohn Wren Kennedy#
609d583b39bSJohn Wren Kennedyfunction assert
610d583b39bSJohn Wren Kennedy{
611d583b39bSJohn Wren Kennedy	(($@)) || log_fail "$@"
612d583b39bSJohn Wren Kennedy}
613d583b39bSJohn Wren Kennedy
614d583b39bSJohn Wren Kennedy#
615d583b39bSJohn Wren Kennedy# Function to format partition size of a disk
616d583b39bSJohn Wren Kennedy# Given a disk cxtxdx reduces all partitions
617d583b39bSJohn Wren Kennedy# to 0 size
618d583b39bSJohn Wren Kennedy#
619d583b39bSJohn Wren Kennedyfunction zero_partitions #<whole_disk_name>
620d583b39bSJohn Wren Kennedy{
621d583b39bSJohn Wren Kennedy	typeset diskname=$1
622d583b39bSJohn Wren Kennedy	typeset i
623d583b39bSJohn Wren Kennedy
624d583b39bSJohn Wren Kennedy	for i in 0 1 3 4 5 6 7
625d583b39bSJohn Wren Kennedy	do
626d583b39bSJohn Wren Kennedy		set_partition $i "" 0mb $diskname
627d583b39bSJohn Wren Kennedy	done
628d583b39bSJohn Wren Kennedy}
629d583b39bSJohn Wren Kennedy
630d583b39bSJohn Wren Kennedy#
631d583b39bSJohn Wren Kennedy# Given a slice, size and disk, this function
632d583b39bSJohn Wren Kennedy# formats the slice to the specified size.
633d583b39bSJohn Wren Kennedy# Size should be specified with units as per
634d583b39bSJohn Wren Kennedy# the `format` command requirements eg. 100mb 3gb
635d583b39bSJohn Wren Kennedy#
636d583b39bSJohn Wren Kennedyfunction set_partition #<slice_num> <slice_start> <size_plus_units>  <whole_disk_name>
637d583b39bSJohn Wren Kennedy{
638d583b39bSJohn Wren Kennedy	typeset -i slicenum=$1
639d583b39bSJohn Wren Kennedy	typeset start=$2
640d583b39bSJohn Wren Kennedy	typeset size=$3
641d583b39bSJohn Wren Kennedy	typeset disk=$4
642d583b39bSJohn Wren Kennedy	[[ -z $slicenum || -z $size || -z $disk ]] && \
643d583b39bSJohn Wren Kennedy	    log_fail "The slice, size or disk name is unspecified."
644d583b39bSJohn Wren Kennedy	typeset format_file=/var/tmp/format_in.$$
645d583b39bSJohn Wren Kennedy
646d583b39bSJohn Wren Kennedy	$ECHO "partition" >$format_file
647d583b39bSJohn Wren Kennedy	$ECHO "$slicenum" >> $format_file
648d583b39bSJohn Wren Kennedy	$ECHO "" >> $format_file
649d583b39bSJohn Wren Kennedy	$ECHO "" >> $format_file
650d583b39bSJohn Wren Kennedy	$ECHO "$start" >> $format_file
651d583b39bSJohn Wren Kennedy	$ECHO "$size" >> $format_file
652d583b39bSJohn Wren Kennedy	$ECHO "label" >> $format_file
653d583b39bSJohn Wren Kennedy	$ECHO "" >> $format_file
654d583b39bSJohn Wren Kennedy	$ECHO "q" >> $format_file
655d583b39bSJohn Wren Kennedy	$ECHO "q" >> $format_file
656d583b39bSJohn Wren Kennedy
657d583b39bSJohn Wren Kennedy	$FORMAT -e -s -d $disk -f $format_file
658d583b39bSJohn Wren Kennedy	typeset ret_val=$?
659d583b39bSJohn Wren Kennedy	$RM -f $format_file
660d583b39bSJohn Wren Kennedy	[[ $ret_val -ne 0 ]] && \
661d583b39bSJohn Wren Kennedy	    log_fail "Unable to format $disk slice $slicenum to $size"
662d583b39bSJohn Wren Kennedy	return 0
663d583b39bSJohn Wren Kennedy}
664d583b39bSJohn Wren Kennedy
665d583b39bSJohn Wren Kennedy#
666d583b39bSJohn Wren Kennedy# Get the end cyl of the given slice
667d583b39bSJohn Wren Kennedy#
668d583b39bSJohn Wren Kennedyfunction get_endslice #<disk> <slice>
669d583b39bSJohn Wren Kennedy{
670d583b39bSJohn Wren Kennedy	typeset disk=$1
671d583b39bSJohn Wren Kennedy	typeset slice=$2
672d583b39bSJohn Wren Kennedy	if [[ -z $disk || -z $slice ]] ; then
673d583b39bSJohn Wren Kennedy		log_fail "The disk name or slice number is unspecified."
674d583b39bSJohn Wren Kennedy	fi
675d583b39bSJohn Wren Kennedy
676d583b39bSJohn Wren Kennedy	disk=${disk#/dev/dsk/}
677d583b39bSJohn Wren Kennedy	disk=${disk#/dev/rdsk/}
678d583b39bSJohn Wren Kennedy	disk=${disk%s*}
679d583b39bSJohn Wren Kennedy
680d583b39bSJohn Wren Kennedy	typeset -i ratio=0
681d583b39bSJohn Wren Kennedy	ratio=$($PRTVTOC /dev/rdsk/${disk}s2 | \
682d583b39bSJohn Wren Kennedy		$GREP "sectors\/cylinder" | \
683d583b39bSJohn Wren Kennedy		$AWK '{print $2}')
684d583b39bSJohn Wren Kennedy
685d583b39bSJohn Wren Kennedy	if ((ratio == 0)); then
686d583b39bSJohn Wren Kennedy		return
687d583b39bSJohn Wren Kennedy	fi
688d583b39bSJohn Wren Kennedy
689d583b39bSJohn Wren Kennedy	typeset -i endcyl=$($PRTVTOC -h /dev/rdsk/${disk}s2 |
690d583b39bSJohn Wren Kennedy		$NAWK -v token="$slice" '{if ($1==token) print $6}')
691d583b39bSJohn Wren Kennedy
692d583b39bSJohn Wren Kennedy	((endcyl = (endcyl + 1) / ratio))
693d583b39bSJohn Wren Kennedy	echo $endcyl
694d583b39bSJohn Wren Kennedy}
695d583b39bSJohn Wren Kennedy
696d583b39bSJohn Wren Kennedy
697d583b39bSJohn Wren Kennedy#
698d583b39bSJohn Wren Kennedy# Given a size,disk and total slice number,  this function formats the
699d583b39bSJohn Wren Kennedy# disk slices from 0 to the total slice number with the same specified
700d583b39bSJohn Wren Kennedy# size.
701d583b39bSJohn Wren Kennedy#
702d583b39bSJohn Wren Kennedyfunction partition_disk	#<slice_size> <whole_disk_name>	<total_slices>
703d583b39bSJohn Wren Kennedy{
704d583b39bSJohn Wren Kennedy	typeset -i i=0
705d583b39bSJohn Wren Kennedy	typeset slice_size=$1
706d583b39bSJohn Wren Kennedy	typeset disk_name=$2
707d583b39bSJohn Wren Kennedy	typeset total_slices=$3
708d583b39bSJohn Wren Kennedy	typeset cyl
709d583b39bSJohn Wren Kennedy
710d583b39bSJohn Wren Kennedy	zero_partitions $disk_name
711d583b39bSJohn Wren Kennedy	while ((i < $total_slices)); do
712d583b39bSJohn Wren Kennedy		if ((i == 2)); then
713d583b39bSJohn Wren Kennedy			((i = i + 1))
714d583b39bSJohn Wren Kennedy			continue
715d583b39bSJohn Wren Kennedy		fi
716d583b39bSJohn Wren Kennedy		set_partition $i "$cyl" $slice_size $disk_name
717d583b39bSJohn Wren Kennedy		cyl=$(get_endslice $disk_name $i)
718d583b39bSJohn Wren Kennedy		((i = i+1))
719d583b39bSJohn Wren Kennedy	done
720d583b39bSJohn Wren Kennedy}
721d583b39bSJohn Wren Kennedy
722d583b39bSJohn Wren Kennedy#
723d583b39bSJohn Wren Kennedy# This function continues to write to a filenum number of files into dirnum
724d583b39bSJohn Wren Kennedy# number of directories until either $FILE_WRITE returns an error or the
725d583b39bSJohn Wren Kennedy# maximum number of files per directory have been written.
726d583b39bSJohn Wren Kennedy#
727d583b39bSJohn Wren Kennedy# Usage:
728d583b39bSJohn Wren Kennedy# fill_fs [destdir] [dirnum] [filenum] [bytes] [num_writes] [data]
729d583b39bSJohn Wren Kennedy#
730d583b39bSJohn Wren Kennedy# Return value: 0 on success
731d583b39bSJohn Wren Kennedy#		non 0 on error
732d583b39bSJohn Wren Kennedy#
733d583b39bSJohn Wren Kennedy# Where :
734d583b39bSJohn Wren Kennedy#	destdir:    is the directory where everything is to be created under
735d583b39bSJohn Wren Kennedy#	dirnum:	    the maximum number of subdirectories to use, -1 no limit
736d583b39bSJohn Wren Kennedy#	filenum:    the maximum number of files per subdirectory
737d583b39bSJohn Wren Kennedy#	bytes:	    number of bytes to write
738d583b39bSJohn Wren Kennedy#	num_writes: numer of types to write out bytes
739d583b39bSJohn Wren Kennedy#	data:	    the data that will be writen
740d583b39bSJohn Wren Kennedy#
741d583b39bSJohn Wren Kennedy#	E.g.
742d583b39bSJohn Wren Kennedy#	file_fs /testdir 20 25 1024 256 0
743d583b39bSJohn Wren Kennedy#
744d583b39bSJohn Wren Kennedy# Note: bytes * num_writes equals the size of the testfile
745d583b39bSJohn Wren Kennedy#
746d583b39bSJohn Wren Kennedyfunction fill_fs # destdir dirnum filenum bytes num_writes data
747d583b39bSJohn Wren Kennedy{
748d583b39bSJohn Wren Kennedy	typeset destdir=${1:-$TESTDIR}
749d583b39bSJohn Wren Kennedy	typeset -i dirnum=${2:-50}
750d583b39bSJohn Wren Kennedy	typeset -i filenum=${3:-50}
751d583b39bSJohn Wren Kennedy	typeset -i bytes=${4:-8192}
752d583b39bSJohn Wren Kennedy	typeset -i num_writes=${5:-10240}
753d583b39bSJohn Wren Kennedy	typeset -i data=${6:-0}
754d583b39bSJohn Wren Kennedy
755d583b39bSJohn Wren Kennedy	typeset -i odirnum=1
756d583b39bSJohn Wren Kennedy	typeset -i idirnum=0
757d583b39bSJohn Wren Kennedy	typeset -i fn=0
758d583b39bSJohn Wren Kennedy	typeset -i retval=0
759d583b39bSJohn Wren Kennedy
760d583b39bSJohn Wren Kennedy	log_must $MKDIR -p $destdir/$idirnum
761d583b39bSJohn Wren Kennedy	while (($odirnum > 0)); do
762d583b39bSJohn Wren Kennedy		if ((dirnum >= 0 && idirnum >= dirnum)); then
763d583b39bSJohn Wren Kennedy			odirnum=0
764d583b39bSJohn Wren Kennedy			break
765d583b39bSJohn Wren Kennedy		fi
766d583b39bSJohn Wren Kennedy		$FILE_WRITE -o create -f $destdir/$idirnum/$TESTFILE.$fn \
767d583b39bSJohn Wren Kennedy		    -b $bytes -c $num_writes -d $data
768d583b39bSJohn Wren Kennedy		retval=$?
769d583b39bSJohn Wren Kennedy		if (($retval != 0)); then
770d583b39bSJohn Wren Kennedy			odirnum=0
771d583b39bSJohn Wren Kennedy			break
772d583b39bSJohn Wren Kennedy		fi
773d583b39bSJohn Wren Kennedy		if (($fn >= $filenum)); then
774d583b39bSJohn Wren Kennedy			fn=0
775d583b39bSJohn Wren Kennedy			((idirnum = idirnum + 1))
776d583b39bSJohn Wren Kennedy			log_must $MKDIR -p $destdir/$idirnum
777d583b39bSJohn Wren Kennedy		else
778d583b39bSJohn Wren Kennedy			((fn = fn + 1))
779d583b39bSJohn Wren Kennedy		fi
780d583b39bSJohn Wren Kennedy	done
781d583b39bSJohn Wren Kennedy	return $retval
782d583b39bSJohn Wren Kennedy}
783d583b39bSJohn Wren Kennedy
784d583b39bSJohn Wren Kennedy#
785d583b39bSJohn Wren Kennedy# Simple function to get the specified property. If unable to
786d583b39bSJohn Wren Kennedy# get the property then exits.
787d583b39bSJohn Wren Kennedy#
788d583b39bSJohn Wren Kennedy# Note property is in 'parsable' format (-p)
789d583b39bSJohn Wren Kennedy#
790d583b39bSJohn Wren Kennedyfunction get_prop # property dataset
791d583b39bSJohn Wren Kennedy{
792d583b39bSJohn Wren Kennedy	typeset prop_val
793d583b39bSJohn Wren Kennedy	typeset prop=$1
794d583b39bSJohn Wren Kennedy	typeset dataset=$2
795d583b39bSJohn Wren Kennedy
796d583b39bSJohn Wren Kennedy	prop_val=$($ZFS get -pH -o value $prop $dataset 2>/dev/null)
797d583b39bSJohn Wren Kennedy	if [[ $? -ne 0 ]]; then
798d583b39bSJohn Wren Kennedy		log_note "Unable to get $prop property for dataset " \
799d583b39bSJohn Wren Kennedy		"$dataset"
800d583b39bSJohn Wren Kennedy		return 1
801d583b39bSJohn Wren Kennedy	fi
802d583b39bSJohn Wren Kennedy
803d583b39bSJohn Wren Kennedy	$ECHO $prop_val
804d583b39bSJohn Wren Kennedy	return 0
805d583b39bSJohn Wren Kennedy}
806d583b39bSJohn Wren Kennedy
807d583b39bSJohn Wren Kennedy#
808d583b39bSJohn Wren Kennedy# Simple function to get the specified property of pool. If unable to
809d583b39bSJohn Wren Kennedy# get the property then exits.
810d583b39bSJohn Wren Kennedy#
811d583b39bSJohn Wren Kennedyfunction get_pool_prop # property pool
812d583b39bSJohn Wren Kennedy{
813d583b39bSJohn Wren Kennedy	typeset prop_val
814d583b39bSJohn Wren Kennedy	typeset prop=$1
815d583b39bSJohn Wren Kennedy	typeset pool=$2
816d583b39bSJohn Wren Kennedy
817d583b39bSJohn Wren Kennedy	if poolexists $pool ; then
818d583b39bSJohn Wren Kennedy		prop_val=$($ZPOOL get $prop $pool 2>/dev/null | $TAIL -1 | \
819d583b39bSJohn Wren Kennedy			$AWK '{print $3}')
820d583b39bSJohn Wren Kennedy		if [[ $? -ne 0 ]]; then
821d583b39bSJohn Wren Kennedy			log_note "Unable to get $prop property for pool " \
822d583b39bSJohn Wren Kennedy			"$pool"
823d583b39bSJohn Wren Kennedy			return 1
824d583b39bSJohn Wren Kennedy		fi
825d583b39bSJohn Wren Kennedy	else
826d583b39bSJohn Wren Kennedy		log_note "Pool $pool not exists."
827d583b39bSJohn Wren Kennedy		return 1
828d583b39bSJohn Wren Kennedy	fi
829d583b39bSJohn Wren Kennedy
830d583b39bSJohn Wren Kennedy	$ECHO $prop_val
831d583b39bSJohn Wren Kennedy	return 0
832d583b39bSJohn Wren Kennedy}
833d583b39bSJohn Wren Kennedy
834d583b39bSJohn Wren Kennedy# Return 0 if a pool exists; $? otherwise
835d583b39bSJohn Wren Kennedy#
836d583b39bSJohn Wren Kennedy# $1 - pool name
837d583b39bSJohn Wren Kennedy
838d583b39bSJohn Wren Kennedyfunction poolexists
839d583b39bSJohn Wren Kennedy{
840d583b39bSJohn Wren Kennedy	typeset pool=$1
841d583b39bSJohn Wren Kennedy
842d583b39bSJohn Wren Kennedy	if [[ -z $pool ]]; then
843d583b39bSJohn Wren Kennedy		log_note "No pool name given."
844d583b39bSJohn Wren Kennedy		return 1
845d583b39bSJohn Wren Kennedy	fi
846d583b39bSJohn Wren Kennedy
847d583b39bSJohn Wren Kennedy	$ZPOOL get name "$pool" > /dev/null 2>&1
848d583b39bSJohn Wren Kennedy	return $?
849d583b39bSJohn Wren Kennedy}
850d583b39bSJohn Wren Kennedy
851d583b39bSJohn Wren Kennedy# Return 0 if all the specified datasets exist; $? otherwise
852d583b39bSJohn Wren Kennedy#
853d583b39bSJohn Wren Kennedy# $1-n  dataset name
854d583b39bSJohn Wren Kennedyfunction datasetexists
855d583b39bSJohn Wren Kennedy{
856d583b39bSJohn Wren Kennedy	if (($# == 0)); then
857d583b39bSJohn Wren Kennedy		log_note "No dataset name given."
858d583b39bSJohn Wren Kennedy		return 1
859d583b39bSJohn Wren Kennedy	fi
860d583b39bSJohn Wren Kennedy
861d583b39bSJohn Wren Kennedy	while (($# > 0)); do
862d583b39bSJohn Wren Kennedy		$ZFS get name $1 > /dev/null 2>&1 || \
863d583b39bSJohn Wren Kennedy			return $?
864d583b39bSJohn Wren Kennedy		shift
865d583b39bSJohn Wren Kennedy	done
866d583b39bSJohn Wren Kennedy
867d583b39bSJohn Wren Kennedy	return 0
868d583b39bSJohn Wren Kennedy}
869d583b39bSJohn Wren Kennedy
870d583b39bSJohn Wren Kennedy# return 0 if none of the specified datasets exists, otherwise return 1.
871d583b39bSJohn Wren Kennedy#
872d583b39bSJohn Wren Kennedy# $1-n  dataset name
873d583b39bSJohn Wren Kennedyfunction datasetnonexists
874d583b39bSJohn Wren Kennedy{
875d583b39bSJohn Wren Kennedy	if (($# == 0)); then
876d583b39bSJohn Wren Kennedy		log_note "No dataset name given."
877d583b39bSJohn Wren Kennedy		return 1
878d583b39bSJohn Wren Kennedy	fi
879d583b39bSJohn Wren Kennedy
880d583b39bSJohn Wren Kennedy	while (($# > 0)); do
881d583b39bSJohn Wren Kennedy		$ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 \
882d583b39bSJohn Wren Kennedy		    && return 1
883d583b39bSJohn Wren Kennedy		shift
884d583b39bSJohn Wren Kennedy	done
885d583b39bSJohn Wren Kennedy
886d583b39bSJohn Wren Kennedy	return 0
887d583b39bSJohn Wren Kennedy}
888d583b39bSJohn Wren Kennedy
889d583b39bSJohn Wren Kennedy#
890d583b39bSJohn Wren Kennedy# Given a mountpoint, or a dataset name, determine if it is shared.
891d583b39bSJohn Wren Kennedy#
892d583b39bSJohn Wren Kennedy# Returns 0 if shared, 1 otherwise.
893d583b39bSJohn Wren Kennedy#
894d583b39bSJohn Wren Kennedyfunction is_shared
895d583b39bSJohn Wren Kennedy{
896d583b39bSJohn Wren Kennedy	typeset fs=$1
897d583b39bSJohn Wren Kennedy	typeset mtpt
898d583b39bSJohn Wren Kennedy
899d583b39bSJohn Wren Kennedy	if [[ $fs != "/"* ]] ; then
900d583b39bSJohn Wren Kennedy		if datasetnonexists "$fs" ; then
901d583b39bSJohn Wren Kennedy			return 1
902d583b39bSJohn Wren Kennedy		else
903d583b39bSJohn Wren Kennedy			mtpt=$(get_prop mountpoint "$fs")
904d583b39bSJohn Wren Kennedy			case $mtpt in
905d583b39bSJohn Wren Kennedy				none|legacy|-) return 1
906d583b39bSJohn Wren Kennedy					;;
907d583b39bSJohn Wren Kennedy				*)	fs=$mtpt
908d583b39bSJohn Wren Kennedy					;;
909d583b39bSJohn Wren Kennedy			esac
910d583b39bSJohn Wren Kennedy		fi
911d583b39bSJohn Wren Kennedy	fi
912d583b39bSJohn Wren Kennedy
913d583b39bSJohn Wren Kennedy	for mtpt in `$SHARE | $AWK '{print $2}'` ; do
914d583b39bSJohn Wren Kennedy		if [[ $mtpt == $fs ]] ; then
915d583b39bSJohn Wren Kennedy			return 0
916d583b39bSJohn Wren Kennedy		fi
917d583b39bSJohn Wren Kennedy	done
918d583b39bSJohn Wren Kennedy
919d583b39bSJohn Wren Kennedy	typeset stat=$($SVCS -H -o STA nfs/server:default)
920d583b39bSJohn Wren Kennedy	if [[ $stat != "ON" ]]; then
921d583b39bSJohn Wren Kennedy		log_note "Current nfs/server status: $stat"
922d583b39bSJohn Wren Kennedy	fi
923d583b39bSJohn Wren Kennedy
924d583b39bSJohn Wren Kennedy	return 1
925d583b39bSJohn Wren Kennedy}
926d583b39bSJohn Wren Kennedy
927d583b39bSJohn Wren Kennedy#
928d583b39bSJohn Wren Kennedy# Given a mountpoint, determine if it is not shared.
929d583b39bSJohn Wren Kennedy#
930d583b39bSJohn Wren Kennedy# Returns 0 if not shared, 1 otherwise.
931d583b39bSJohn Wren Kennedy#
932d583b39bSJohn Wren Kennedyfunction not_shared
933d583b39bSJohn Wren Kennedy{
934d583b39bSJohn Wren Kennedy	typeset fs=$1
935d583b39bSJohn Wren Kennedy
936d583b39bSJohn Wren Kennedy	is_shared $fs
937d583b39bSJohn Wren Kennedy	if (($? == 0)); then
938d583b39bSJohn Wren Kennedy		return 1
939d583b39bSJohn Wren Kennedy	fi
940d583b39bSJohn Wren Kennedy
941d583b39bSJohn Wren Kennedy	return 0
942d583b39bSJohn Wren Kennedy}
943d583b39bSJohn Wren Kennedy
944d583b39bSJohn Wren Kennedy#
945d583b39bSJohn Wren Kennedy# Helper function to unshare a mountpoint.
946d583b39bSJohn Wren Kennedy#
947d583b39bSJohn Wren Kennedyfunction unshare_fs #fs
948d583b39bSJohn Wren Kennedy{
949d583b39bSJohn Wren Kennedy	typeset fs=$1
950d583b39bSJohn Wren Kennedy
951d583b39bSJohn Wren Kennedy	is_shared $fs
952d583b39bSJohn Wren Kennedy	if (($? == 0)); then
953d583b39bSJohn Wren Kennedy		log_must $ZFS unshare $fs
954d583b39bSJohn Wren Kennedy	fi
955d583b39bSJohn Wren Kennedy
956d583b39bSJohn Wren Kennedy	return 0
957d583b39bSJohn Wren Kennedy}
958d583b39bSJohn Wren Kennedy
959d583b39bSJohn Wren Kennedy#
960d583b39bSJohn Wren Kennedy# Check NFS server status and trigger it online.
961d583b39bSJohn Wren Kennedy#
962d583b39bSJohn Wren Kennedyfunction setup_nfs_server
963d583b39bSJohn Wren Kennedy{
964d583b39bSJohn Wren Kennedy	# Cannot share directory in non-global zone.
965d583b39bSJohn Wren Kennedy	#
966d583b39bSJohn Wren Kennedy	if ! is_global_zone; then
967d583b39bSJohn Wren Kennedy		log_note "Cannot trigger NFS server by sharing in LZ."
968d583b39bSJohn Wren Kennedy		return
969d583b39bSJohn Wren Kennedy	fi
970d583b39bSJohn Wren Kennedy
971d583b39bSJohn Wren Kennedy	typeset nfs_fmri="svc:/network/nfs/server:default"
972d583b39bSJohn Wren Kennedy	if [[ $($SVCS -Ho STA $nfs_fmri) != "ON" ]]; then
973d583b39bSJohn Wren Kennedy		#
974d583b39bSJohn Wren Kennedy		# Only really sharing operation can enable NFS server
975d583b39bSJohn Wren Kennedy		# to online permanently.
976d583b39bSJohn Wren Kennedy		#
977d583b39bSJohn Wren Kennedy		typeset dummy=/tmp/dummy
978d583b39bSJohn Wren Kennedy
979d583b39bSJohn Wren Kennedy		if [[ -d $dummy ]]; then
980d583b39bSJohn Wren Kennedy			log_must $RM -rf $dummy
981d583b39bSJohn Wren Kennedy		fi
982d583b39bSJohn Wren Kennedy
983d583b39bSJohn Wren Kennedy		log_must $MKDIR $dummy
984d583b39bSJohn Wren Kennedy		log_must $SHARE $dummy
985d583b39bSJohn Wren Kennedy
986d583b39bSJohn Wren Kennedy		#
987d583b39bSJohn Wren Kennedy		# Waiting for fmri's status to be the final status.
988d583b39bSJohn Wren Kennedy		# Otherwise, in transition, an asterisk (*) is appended for
989d583b39bSJohn Wren Kennedy		# instances, unshare will reverse status to 'DIS' again.
990d583b39bSJohn Wren Kennedy		#
991d583b39bSJohn Wren Kennedy		# Waiting for 1's at least.
992d583b39bSJohn Wren Kennedy		#
993d583b39bSJohn Wren Kennedy		log_must $SLEEP 1
994d583b39bSJohn Wren Kennedy		timeout=10
995d583b39bSJohn Wren Kennedy		while [[ timeout -ne 0 && $($SVCS -Ho STA $nfs_fmri) == *'*' ]]
996d583b39bSJohn Wren Kennedy		do
997d583b39bSJohn Wren Kennedy			log_must $SLEEP 1
998d583b39bSJohn Wren Kennedy
999d583b39bSJohn Wren Kennedy			((timeout -= 1))
1000d583b39bSJohn Wren Kennedy		done
1001d583b39bSJohn Wren Kennedy
1002d583b39bSJohn Wren Kennedy		log_must $UNSHARE $dummy
1003d583b39bSJohn Wren Kennedy		log_must $RM -rf $dummy
1004d583b39bSJohn Wren Kennedy	fi
1005d583b39bSJohn Wren Kennedy
1006d583b39bSJohn Wren Kennedy	log_note "Current NFS status: '$($SVCS -Ho STA,FMRI $nfs_fmri)'"
1007d583b39bSJohn Wren Kennedy}
1008d583b39bSJohn Wren Kennedy
1009d583b39bSJohn Wren Kennedy#
1010d583b39bSJohn Wren Kennedy# To verify whether calling process is in global zone
1011d583b39bSJohn Wren Kennedy#
1012d583b39bSJohn Wren Kennedy# Return 0 if in global zone, 1 in non-global zone
1013d583b39bSJohn Wren Kennedy#
1014d583b39bSJohn Wren Kennedyfunction is_global_zone
1015d583b39bSJohn Wren Kennedy{
1016d583b39bSJohn Wren Kennedy	typeset cur_zone=$($ZONENAME 2>/dev/null)
1017d583b39bSJohn Wren Kennedy	if [[ $cur_zone != "global" ]]; then
1018d583b39bSJohn Wren Kennedy		return 1
1019d583b39bSJohn Wren Kennedy	fi
1020d583b39bSJohn Wren Kennedy	return 0
1021d583b39bSJohn Wren Kennedy}
1022d583b39bSJohn Wren Kennedy
1023d583b39bSJohn Wren Kennedy#
1024d583b39bSJohn Wren Kennedy# Verify whether test is permitted to run from
1025d583b39bSJohn Wren Kennedy# global zone, local zone, or both
1026d583b39bSJohn Wren Kennedy#
1027d583b39bSJohn Wren Kennedy# $1 zone limit, could be "global", "local", or "both"(no limit)
1028d583b39bSJohn Wren Kennedy#
1029d583b39bSJohn Wren Kennedy# Return 0 if permitted, otherwise exit with log_unsupported
1030d583b39bSJohn Wren Kennedy#
1031d583b39bSJohn Wren Kennedyfunction verify_runnable # zone limit
1032d583b39bSJohn Wren Kennedy{
1033d583b39bSJohn Wren Kennedy	typeset limit=$1
1034d583b39bSJohn Wren Kennedy
1035d583b39bSJohn Wren Kennedy	[[ -z $limit ]] && return 0
1036d583b39bSJohn Wren Kennedy
1037d583b39bSJohn Wren Kennedy	if is_global_zone ; then
1038d583b39bSJohn Wren Kennedy		case $limit in
1039d583b39bSJohn Wren Kennedy			global|both)
1040d583b39bSJohn Wren Kennedy				;;
1041d583b39bSJohn Wren Kennedy			local)	log_unsupported "Test is unable to run from "\
1042d583b39bSJohn Wren Kennedy					"global zone."
1043d583b39bSJohn Wren Kennedy				;;
1044d583b39bSJohn Wren Kennedy			*)	log_note "Warning: unknown limit $limit - " \
1045d583b39bSJohn Wren Kennedy					"use both."
1046d583b39bSJohn Wren Kennedy				;;
1047d583b39bSJohn Wren Kennedy		esac
1048d583b39bSJohn Wren Kennedy	else
1049d583b39bSJohn Wren Kennedy		case $limit in
1050d583b39bSJohn Wren Kennedy			local|both)
1051d583b39bSJohn Wren Kennedy				;;
1052d583b39bSJohn Wren Kennedy			global)	log_unsupported "Test is unable to run from "\
1053d583b39bSJohn Wren Kennedy					"local zone."
1054d583b39bSJohn Wren Kennedy				;;
1055d583b39bSJohn Wren Kennedy			*)	log_note "Warning: unknown limit $limit - " \
1056d583b39bSJohn Wren Kennedy					"use both."
1057d583b39bSJohn Wren Kennedy				;;
1058d583b39bSJohn Wren Kennedy		esac
1059d583b39bSJohn Wren Kennedy
1060d583b39bSJohn Wren Kennedy		reexport_pool
1061d583b39bSJohn Wren Kennedy	fi
1062d583b39bSJohn Wren Kennedy
1063d583b39bSJohn Wren Kennedy	return 0
1064d583b39bSJohn Wren Kennedy}
1065d583b39bSJohn Wren Kennedy
1066d583b39bSJohn Wren Kennedy# Return 0 if create successfully or the pool exists; $? otherwise
1067d583b39bSJohn Wren Kennedy# Note: In local zones, this function should return 0 silently.
1068d583b39bSJohn Wren Kennedy#
1069d583b39bSJohn Wren Kennedy# $1 - pool name
1070d583b39bSJohn Wren Kennedy# $2-n - [keyword] devs_list
1071d583b39bSJohn Wren Kennedy
1072d583b39bSJohn Wren Kennedyfunction create_pool #pool devs_list
1073d583b39bSJohn Wren Kennedy{
1074d583b39bSJohn Wren Kennedy	typeset pool=${1%%/*}
1075d583b39bSJohn Wren Kennedy
1076d583b39bSJohn Wren Kennedy	shift
1077d583b39bSJohn Wren Kennedy
1078d583b39bSJohn Wren Kennedy	if [[ -z $pool ]]; then
1079d583b39bSJohn Wren Kennedy		log_note "Missing pool name."
1080d583b39bSJohn Wren Kennedy		return 1
1081d583b39bSJohn Wren Kennedy	fi
1082d583b39bSJohn Wren Kennedy
1083d583b39bSJohn Wren Kennedy	if poolexists $pool ; then
1084d583b39bSJohn Wren Kennedy		destroy_pool $pool
1085d583b39bSJohn Wren Kennedy	fi
1086d583b39bSJohn Wren Kennedy
1087d583b39bSJohn Wren Kennedy	if is_global_zone ; then
1088d583b39bSJohn Wren Kennedy		[[ -d /$pool ]] && $RM -rf /$pool
1089d583b39bSJohn Wren Kennedy		log_must $ZPOOL create -f $pool $@
1090d583b39bSJohn Wren Kennedy	fi
1091d583b39bSJohn Wren Kennedy
1092d583b39bSJohn Wren Kennedy	return 0
1093d583b39bSJohn Wren Kennedy}
1094d583b39bSJohn Wren Kennedy
1095d583b39bSJohn Wren Kennedy# Return 0 if destroy successfully or the pool exists; $? otherwise
1096d583b39bSJohn Wren Kennedy# Note: In local zones, this function should return 0 silently.
1097d583b39bSJohn Wren Kennedy#
1098d583b39bSJohn Wren Kennedy# $1 - pool name
1099d583b39bSJohn Wren Kennedy# Destroy pool with the given parameters.
1100d583b39bSJohn Wren Kennedy
1101d583b39bSJohn Wren Kennedyfunction destroy_pool #pool
1102d583b39bSJohn Wren Kennedy{
1103d583b39bSJohn Wren Kennedy	typeset pool=${1%%/*}
1104d583b39bSJohn Wren Kennedy	typeset mtpt
1105d583b39bSJohn Wren Kennedy
1106d583b39bSJohn Wren Kennedy	if [[ -z $pool ]]; then
1107d583b39bSJohn Wren Kennedy		log_note "No pool name given."
1108d583b39bSJohn Wren Kennedy		return 1
1109d583b39bSJohn Wren Kennedy	fi
1110d583b39bSJohn Wren Kennedy
1111d583b39bSJohn Wren Kennedy	if is_global_zone ; then
1112d583b39bSJohn Wren Kennedy		if poolexists "$pool" ; then
1113d583b39bSJohn Wren Kennedy			mtpt=$(get_prop mountpoint "$pool")
1114d583b39bSJohn Wren Kennedy			log_must $ZPOOL destroy -f $pool
1115d583b39bSJohn Wren Kennedy
1116d583b39bSJohn Wren Kennedy			[[ -d $mtpt ]] && \
1117d583b39bSJohn Wren Kennedy				log_must $RM -rf $mtpt
1118d583b39bSJohn Wren Kennedy		else
1119d583b39bSJohn Wren Kennedy			log_note "Pool not exist. ($pool)"
1120d583b39bSJohn Wren Kennedy			return 1
1121d583b39bSJohn Wren Kennedy		fi
1122d583b39bSJohn Wren Kennedy	fi
1123d583b39bSJohn Wren Kennedy
1124d583b39bSJohn Wren Kennedy	return 0
1125d583b39bSJohn Wren Kennedy}
1126d583b39bSJohn Wren Kennedy
1127d583b39bSJohn Wren Kennedy#
1128d583b39bSJohn Wren Kennedy# Firstly, create a pool with 5 datasets. Then, create a single zone and
1129d583b39bSJohn Wren Kennedy# export the 5 datasets to it. In addition, we also add a ZFS filesystem
1130d583b39bSJohn Wren Kennedy# and a zvol device to the zone.
1131d583b39bSJohn Wren Kennedy#
1132d583b39bSJohn Wren Kennedy# $1 zone name
1133d583b39bSJohn Wren Kennedy# $2 zone root directory prefix
1134d583b39bSJohn Wren Kennedy# $3 zone ip
1135d583b39bSJohn Wren Kennedy#
1136d583b39bSJohn Wren Kennedyfunction zfs_zones_setup #zone_name zone_root zone_ip
1137d583b39bSJohn Wren Kennedy{
1138d583b39bSJohn Wren Kennedy	typeset zone_name=${1:-$(hostname)-z}
1139d583b39bSJohn Wren Kennedy	typeset zone_root=${2:-"/zone_root"}
1140d583b39bSJohn Wren Kennedy	typeset zone_ip=${3:-"10.1.1.10"}
1141d583b39bSJohn Wren Kennedy	typeset prefix_ctr=$ZONE_CTR
1142d583b39bSJohn Wren Kennedy	typeset pool_name=$ZONE_POOL
1143d583b39bSJohn Wren Kennedy	typeset -i cntctr=5
1144d583b39bSJohn Wren Kennedy	typeset -i i=0
1145d583b39bSJohn Wren Kennedy
1146d583b39bSJohn Wren Kennedy	# Create pool and 5 container within it
1147d583b39bSJohn Wren Kennedy	#
1148d583b39bSJohn Wren Kennedy	[[ -d /$pool_name ]] && $RM -rf /$pool_name
1149d583b39bSJohn Wren Kennedy	log_must $ZPOOL create -f $pool_name $DISKS
1150d583b39bSJohn Wren Kennedy	while ((i < cntctr)); do
1151d583b39bSJohn Wren Kennedy		log_must $ZFS create $pool_name/$prefix_ctr$i
1152d583b39bSJohn Wren Kennedy		((i += 1))
1153d583b39bSJohn Wren Kennedy	done
1154d583b39bSJohn Wren Kennedy
1155d583b39bSJohn Wren Kennedy	# create a zvol
1156d583b39bSJohn Wren Kennedy	log_must $ZFS create -V 1g $pool_name/zone_zvol
1157d583b39bSJohn Wren Kennedy
1158d583b39bSJohn Wren Kennedy	#
1159d583b39bSJohn Wren Kennedy	# If current system support slog, add slog device for pool
1160d583b39bSJohn Wren Kennedy	#
1161d583b39bSJohn Wren Kennedy	if verify_slog_support ; then
1162d583b39bSJohn Wren Kennedy		typeset sdevs="/var/tmp/sdev1 /var/tmp/sdev2"
1163d583b39bSJohn Wren Kennedy		log_must $MKFILE 100M $sdevs
1164d583b39bSJohn Wren Kennedy		log_must $ZPOOL add $pool_name log mirror $sdevs
1165d583b39bSJohn Wren Kennedy	fi
1166d583b39bSJohn Wren Kennedy
1167d583b39bSJohn Wren Kennedy	# this isn't supported just yet.
1168d583b39bSJohn Wren Kennedy	# Create a filesystem. In order to add this to
1169d583b39bSJohn Wren Kennedy	# the zone, it must have it's mountpoint set to 'legacy'
1170d583b39bSJohn Wren Kennedy	# log_must $ZFS create $pool_name/zfs_filesystem
1171d583b39bSJohn Wren Kennedy	# log_must $ZFS set mountpoint=legacy $pool_name/zfs_filesystem
1172d583b39bSJohn Wren Kennedy
1173d583b39bSJohn Wren Kennedy	[[ -d $zone_root ]] && \
1174d583b39bSJohn Wren Kennedy		log_must $RM -rf $zone_root/$zone_name
1175d583b39bSJohn Wren Kennedy	[[ ! -d $zone_root ]] && \
1176d583b39bSJohn Wren Kennedy		log_must $MKDIR -p -m 0700 $zone_root/$zone_name
1177d583b39bSJohn Wren Kennedy
1178d583b39bSJohn Wren Kennedy	# Create zone configure file and configure the zone
1179d583b39bSJohn Wren Kennedy	#
1180d583b39bSJohn Wren Kennedy	typeset zone_conf=/tmp/zone_conf.$$
1181d583b39bSJohn Wren Kennedy	$ECHO "create" > $zone_conf
1182d583b39bSJohn Wren Kennedy	$ECHO "set zonepath=$zone_root/$zone_name" >> $zone_conf
1183d583b39bSJohn Wren Kennedy	$ECHO "set autoboot=true" >> $zone_conf
1184d583b39bSJohn Wren Kennedy	i=0
1185d583b39bSJohn Wren Kennedy	while ((i < cntctr)); do
1186d583b39bSJohn Wren Kennedy		$ECHO "add dataset" >> $zone_conf
1187d583b39bSJohn Wren Kennedy		$ECHO "set name=$pool_name/$prefix_ctr$i" >> \
1188d583b39bSJohn Wren Kennedy			$zone_conf
1189d583b39bSJohn Wren Kennedy		$ECHO "end" >> $zone_conf
1190d583b39bSJohn Wren Kennedy		((i += 1))
1191d583b39bSJohn Wren Kennedy	done
1192d583b39bSJohn Wren Kennedy
1193d583b39bSJohn Wren Kennedy	# add our zvol to the zone
1194d583b39bSJohn Wren Kennedy	$ECHO "add device" >> $zone_conf
1195d583b39bSJohn Wren Kennedy	$ECHO "set match=/dev/zvol/dsk/$pool_name/zone_zvol" >> $zone_conf
1196d583b39bSJohn Wren Kennedy	$ECHO "end" >> $zone_conf
1197d583b39bSJohn Wren Kennedy
1198d583b39bSJohn Wren Kennedy	# add a corresponding zvol rdsk to the zone
1199d583b39bSJohn Wren Kennedy	$ECHO "add device" >> $zone_conf
1200d583b39bSJohn Wren Kennedy	$ECHO "set match=/dev/zvol/rdsk/$pool_name/zone_zvol" >> $zone_conf
1201d583b39bSJohn Wren Kennedy	$ECHO "end" >> $zone_conf
1202d583b39bSJohn Wren Kennedy
1203d583b39bSJohn Wren Kennedy	# once it's supported, we'll add our filesystem to the zone
1204d583b39bSJohn Wren Kennedy	# $ECHO "add fs" >> $zone_conf
1205d583b39bSJohn Wren Kennedy	# $ECHO "set type=zfs" >> $zone_conf
1206d583b39bSJohn Wren Kennedy	# $ECHO "set special=$pool_name/zfs_filesystem" >> $zone_conf
1207d583b39bSJohn Wren Kennedy	# $ECHO "set dir=/export/zfs_filesystem" >> $zone_conf
1208d583b39bSJohn Wren Kennedy	# $ECHO "end" >> $zone_conf
1209d583b39bSJohn Wren Kennedy
1210d583b39bSJohn Wren Kennedy	$ECHO "verify" >> $zone_conf
1211d583b39bSJohn Wren Kennedy	$ECHO "commit" >> $zone_conf
1212d583b39bSJohn Wren Kennedy	log_must $ZONECFG -z $zone_name -f $zone_conf
1213d583b39bSJohn Wren Kennedy	log_must $RM -f $zone_conf
1214d583b39bSJohn Wren Kennedy
1215d583b39bSJohn Wren Kennedy	# Install the zone
1216d583b39bSJohn Wren Kennedy	$ZONEADM -z $zone_name install
1217d583b39bSJohn Wren Kennedy	if (($? == 0)); then
1218d583b39bSJohn Wren Kennedy		log_note "SUCCESS: $ZONEADM -z $zone_name install"
1219d583b39bSJohn Wren Kennedy	else
1220d583b39bSJohn Wren Kennedy		log_fail "FAIL: $ZONEADM -z $zone_name install"
1221d583b39bSJohn Wren Kennedy	fi
1222d583b39bSJohn Wren Kennedy
1223d583b39bSJohn Wren Kennedy	# Install sysidcfg file
1224d583b39bSJohn Wren Kennedy	#
1225d583b39bSJohn Wren Kennedy	typeset sysidcfg=$zone_root/$zone_name/root/etc/sysidcfg
1226d583b39bSJohn Wren Kennedy	$ECHO "system_locale=C" > $sysidcfg
1227d583b39bSJohn Wren Kennedy	$ECHO  "terminal=dtterm" >> $sysidcfg
1228d583b39bSJohn Wren Kennedy	$ECHO  "network_interface=primary {" >> $sysidcfg
1229d583b39bSJohn Wren Kennedy	$ECHO  "hostname=$zone_name" >> $sysidcfg
1230d583b39bSJohn Wren Kennedy	$ECHO  "}" >> $sysidcfg
1231d583b39bSJohn Wren Kennedy	$ECHO  "name_service=NONE" >> $sysidcfg
1232d583b39bSJohn Wren Kennedy	$ECHO  "root_password=mo791xfZ/SFiw" >> $sysidcfg
1233d583b39bSJohn Wren Kennedy	$ECHO  "security_policy=NONE" >> $sysidcfg
1234d583b39bSJohn Wren Kennedy	$ECHO  "timezone=US/Eastern" >> $sysidcfg
1235d583b39bSJohn Wren Kennedy
1236d583b39bSJohn Wren Kennedy	# Boot this zone
1237d583b39bSJohn Wren Kennedy	log_must $ZONEADM -z $zone_name boot
1238d583b39bSJohn Wren Kennedy}
1239d583b39bSJohn Wren Kennedy
1240d583b39bSJohn Wren Kennedy#
1241d583b39bSJohn Wren Kennedy# Reexport TESTPOOL & TESTPOOL(1-4)
1242d583b39bSJohn Wren Kennedy#
1243d583b39bSJohn Wren Kennedyfunction reexport_pool
1244d583b39bSJohn Wren Kennedy{
1245d583b39bSJohn Wren Kennedy	typeset -i cntctr=5
1246d583b39bSJohn Wren Kennedy	typeset -i i=0
1247d583b39bSJohn Wren Kennedy
1248d583b39bSJohn Wren Kennedy	while ((i < cntctr)); do
1249d583b39bSJohn Wren Kennedy		if ((i == 0)); then
1250d583b39bSJohn Wren Kennedy			TESTPOOL=$ZONE_POOL/$ZONE_CTR$i
1251d583b39bSJohn Wren Kennedy			if ! ismounted $TESTPOOL; then
1252d583b39bSJohn Wren Kennedy				log_must $ZFS mount $TESTPOOL
1253d583b39bSJohn Wren Kennedy			fi
1254d583b39bSJohn Wren Kennedy		else
1255d583b39bSJohn Wren Kennedy			eval TESTPOOL$i=$ZONE_POOL/$ZONE_CTR$i
1256d583b39bSJohn Wren Kennedy			if eval ! ismounted \$TESTPOOL$i; then
1257d583b39bSJohn Wren Kennedy				log_must eval $ZFS mount \$TESTPOOL$i
1258d583b39bSJohn Wren Kennedy			fi
1259d583b39bSJohn Wren Kennedy		fi
1260d583b39bSJohn Wren Kennedy		((i += 1))
1261d583b39bSJohn Wren Kennedy	done
1262d583b39bSJohn Wren Kennedy}
1263d583b39bSJohn Wren Kennedy
1264d583b39bSJohn Wren Kennedy#
1265d583b39bSJohn Wren Kennedy# Verify a given disk is online or offline
1266d583b39bSJohn Wren Kennedy#
1267d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise
1268d583b39bSJohn Wren Kennedy#
1269d583b39bSJohn Wren Kennedyfunction check_state # pool disk state{online,offline}
1270d583b39bSJohn Wren Kennedy{
1271d583b39bSJohn Wren Kennedy	typeset pool=$1
1272d583b39bSJohn Wren Kennedy	typeset disk=${2#/dev/dsk/}
1273d583b39bSJohn Wren Kennedy	typeset state=$3
1274d583b39bSJohn Wren Kennedy
1275d583b39bSJohn Wren Kennedy	$ZPOOL status -v $pool | grep "$disk"  \
1276d583b39bSJohn Wren Kennedy	    | grep -i "$state" > /dev/null 2>&1
1277d583b39bSJohn Wren Kennedy
1278d583b39bSJohn Wren Kennedy	return $?
1279d583b39bSJohn Wren Kennedy}
1280d583b39bSJohn Wren Kennedy
1281d583b39bSJohn Wren Kennedy#
1282d583b39bSJohn Wren Kennedy# Get the mountpoint of snapshot
1283d583b39bSJohn Wren Kennedy# For the snapshot use <mp_filesystem>/.zfs/snapshot/<snap>
1284d583b39bSJohn Wren Kennedy# as its mountpoint
1285d583b39bSJohn Wren Kennedy#
1286d583b39bSJohn Wren Kennedyfunction snapshot_mountpoint
1287d583b39bSJohn Wren Kennedy{
1288d583b39bSJohn Wren Kennedy	typeset dataset=${1:-$TESTPOOL/$TESTFS@$TESTSNAP}
1289d583b39bSJohn Wren Kennedy
1290d583b39bSJohn Wren Kennedy	if [[ $dataset != *@* ]]; then
1291d583b39bSJohn Wren Kennedy		log_fail "Error name of snapshot '$dataset'."
1292d583b39bSJohn Wren Kennedy	fi
1293d583b39bSJohn Wren Kennedy
1294d583b39bSJohn Wren Kennedy	typeset fs=${dataset%@*}
1295d583b39bSJohn Wren Kennedy	typeset snap=${dataset#*@}
1296d583b39bSJohn Wren Kennedy
1297d583b39bSJohn Wren Kennedy	if [[ -z $fs || -z $snap ]]; then
1298d583b39bSJohn Wren Kennedy		log_fail "Error name of snapshot '$dataset'."
1299d583b39bSJohn Wren Kennedy	fi
1300d583b39bSJohn Wren Kennedy
1301d583b39bSJohn Wren Kennedy	$ECHO $(get_prop mountpoint $fs)/.zfs/snapshot/$snap
1302d583b39bSJohn Wren Kennedy}
1303d583b39bSJohn Wren Kennedy
1304d583b39bSJohn Wren Kennedy#
1305d583b39bSJohn Wren Kennedy# Given a pool and file system, this function will verify the file system
1306d583b39bSJohn Wren Kennedy# using the zdb internal tool. Note that the pool is exported and imported
1307d583b39bSJohn Wren Kennedy# to ensure it has consistent state.
1308d583b39bSJohn Wren Kennedy#
1309d583b39bSJohn Wren Kennedyfunction verify_filesys # pool filesystem dir
1310d583b39bSJohn Wren Kennedy{
1311d583b39bSJohn Wren Kennedy	typeset pool="$1"
1312d583b39bSJohn Wren Kennedy	typeset filesys="$2"
1313d583b39bSJohn Wren Kennedy	typeset zdbout="/tmp/zdbout.$$"
1314d583b39bSJohn Wren Kennedy
1315d583b39bSJohn Wren Kennedy	shift
1316d583b39bSJohn Wren Kennedy	shift
1317d583b39bSJohn Wren Kennedy	typeset dirs=$@
1318d583b39bSJohn Wren Kennedy	typeset search_path=""
1319d583b39bSJohn Wren Kennedy
1320d583b39bSJohn Wren Kennedy	log_note "Calling $ZDB to verify filesystem '$filesys'"
1321d583b39bSJohn Wren Kennedy	$ZFS unmount -a > /dev/null 2>&1
1322d583b39bSJohn Wren Kennedy	log_must $ZPOOL export $pool
1323d583b39bSJohn Wren Kennedy
1324d583b39bSJohn Wren Kennedy	if [[ -n $dirs ]] ; then
1325d583b39bSJohn Wren Kennedy		for dir in $dirs ; do
1326d583b39bSJohn Wren Kennedy			search_path="$search_path -d $dir"
1327d583b39bSJohn Wren Kennedy		done
1328d583b39bSJohn Wren Kennedy	fi
1329d583b39bSJohn Wren Kennedy
1330d583b39bSJohn Wren Kennedy	log_must $ZPOOL import $search_path $pool
1331d583b39bSJohn Wren Kennedy
1332d583b39bSJohn Wren Kennedy	$ZDB -cudi $filesys > $zdbout 2>&1
1333d583b39bSJohn Wren Kennedy	if [[ $? != 0 ]]; then
1334d583b39bSJohn Wren Kennedy		log_note "Output: $ZDB -cudi $filesys"
1335d583b39bSJohn Wren Kennedy		$CAT $zdbout
1336d583b39bSJohn Wren Kennedy		log_fail "$ZDB detected errors with: '$filesys'"
1337d583b39bSJohn Wren Kennedy	fi
1338d583b39bSJohn Wren Kennedy
1339d583b39bSJohn Wren Kennedy	log_must $ZFS mount -a
1340d583b39bSJohn Wren Kennedy	log_must $RM -rf $zdbout
1341d583b39bSJohn Wren Kennedy}
1342d583b39bSJohn Wren Kennedy
1343d583b39bSJohn Wren Kennedy#
1344d583b39bSJohn Wren Kennedy# Given a pool, and this function list all disks in the pool
1345d583b39bSJohn Wren Kennedy#
1346d583b39bSJohn Wren Kennedyfunction get_disklist # pool
1347d583b39bSJohn Wren Kennedy{
1348d583b39bSJohn Wren Kennedy	typeset disklist=""
1349d583b39bSJohn Wren Kennedy
1350d583b39bSJohn Wren Kennedy	disklist=$($ZPOOL iostat -v $1 | $NAWK '(NR >4) {print $1}' | \
1351d583b39bSJohn Wren Kennedy	    $GREP -v "\-\-\-\-\-" | \
1352d583b39bSJohn Wren Kennedy	    $EGREP -v -e "^(mirror|raidz1|raidz2|spare|log|cache)$")
1353d583b39bSJohn Wren Kennedy
1354d583b39bSJohn Wren Kennedy	$ECHO $disklist
1355d583b39bSJohn Wren Kennedy}
1356d583b39bSJohn Wren Kennedy
1357d583b39bSJohn Wren Kennedy#
1358d583b39bSJohn Wren Kennedy# Destroy all existing metadevices and state database
1359d583b39bSJohn Wren Kennedy#
1360d583b39bSJohn Wren Kennedyfunction destroy_metas
1361d583b39bSJohn Wren Kennedy{
1362d583b39bSJohn Wren Kennedy	typeset metad
1363d583b39bSJohn Wren Kennedy
1364d583b39bSJohn Wren Kennedy	for metad in $($METASTAT -p | $AWK '{print $1}'); do
1365d583b39bSJohn Wren Kennedy		log_must $METACLEAR -rf $metad
1366d583b39bSJohn Wren Kennedy	done
1367d583b39bSJohn Wren Kennedy
1368d583b39bSJohn Wren Kennedy	for metad in $($METADB | $CUT -f6 | $GREP dev | $UNIQ); do
1369d583b39bSJohn Wren Kennedy		log_must $METADB -fd $metad
1370d583b39bSJohn Wren Kennedy	done
1371d583b39bSJohn Wren Kennedy}
1372d583b39bSJohn Wren Kennedy
1373d583b39bSJohn Wren Kennedy# /**
1374d583b39bSJohn Wren Kennedy#  This function kills a given list of processes after a time period. We use
1375d583b39bSJohn Wren Kennedy#  this in the stress tests instead of STF_TIMEOUT so that we can have processes
1376d583b39bSJohn Wren Kennedy#  run for a fixed amount of time, yet still pass. Tests that hit STF_TIMEOUT
1377d583b39bSJohn Wren Kennedy#  would be listed as FAIL, which we don't want : we're happy with stress tests
1378d583b39bSJohn Wren Kennedy#  running for a certain amount of time, then finishing.
1379d583b39bSJohn Wren Kennedy#
1380d583b39bSJohn Wren Kennedy# @param $1 the time in seconds after which we should terminate these processes
1381d583b39bSJohn Wren Kennedy# @param $2..$n the processes we wish to terminate.
1382d583b39bSJohn Wren Kennedy# */
1383d583b39bSJohn Wren Kennedyfunction stress_timeout
1384d583b39bSJohn Wren Kennedy{
1385d583b39bSJohn Wren Kennedy	typeset -i TIMEOUT=$1
1386d583b39bSJohn Wren Kennedy	shift
1387d583b39bSJohn Wren Kennedy	typeset cpids="$@"
1388d583b39bSJohn Wren Kennedy
1389d583b39bSJohn Wren Kennedy	log_note "Waiting for child processes($cpids). " \
1390d583b39bSJohn Wren Kennedy		"It could last dozens of minutes, please be patient ..."
1391d583b39bSJohn Wren Kennedy	log_must $SLEEP $TIMEOUT
1392d583b39bSJohn Wren Kennedy
1393d583b39bSJohn Wren Kennedy	log_note "Killing child processes after ${TIMEOUT} stress timeout."
1394d583b39bSJohn Wren Kennedy	typeset pid
1395d583b39bSJohn Wren Kennedy	for pid in $cpids; do
1396d583b39bSJohn Wren Kennedy		$PS -p $pid > /dev/null 2>&1
1397d583b39bSJohn Wren Kennedy		if (($? == 0)); then
1398d583b39bSJohn Wren Kennedy			log_must $KILL -USR1 $pid
1399d583b39bSJohn Wren Kennedy		fi
1400d583b39bSJohn Wren Kennedy	done
1401d583b39bSJohn Wren Kennedy}
1402d583b39bSJohn Wren Kennedy
1403d583b39bSJohn Wren Kennedy#
1404d583b39bSJohn Wren Kennedy# Verify a given hotspare disk is inuse or avail
1405d583b39bSJohn Wren Kennedy#
1406d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise
1407d583b39bSJohn Wren Kennedy#
1408d583b39bSJohn Wren Kennedyfunction check_hotspare_state # pool disk state{inuse,avail}
1409d583b39bSJohn Wren Kennedy{
1410d583b39bSJohn Wren Kennedy	typeset pool=$1
1411d583b39bSJohn Wren Kennedy	typeset disk=${2#/dev/dsk/}
1412d583b39bSJohn Wren Kennedy	typeset state=$3
1413d583b39bSJohn Wren Kennedy
1414d583b39bSJohn Wren Kennedy	cur_state=$(get_device_state $pool $disk "spares")
1415d583b39bSJohn Wren Kennedy
1416d583b39bSJohn Wren Kennedy	if [[ $state != ${cur_state} ]]; then
1417d583b39bSJohn Wren Kennedy		return 1
1418d583b39bSJohn Wren Kennedy	fi
1419d583b39bSJohn Wren Kennedy	return 0
1420d583b39bSJohn Wren Kennedy}
1421d583b39bSJohn Wren Kennedy
1422d583b39bSJohn Wren Kennedy#
1423d583b39bSJohn Wren Kennedy# Verify a given slog disk is inuse or avail
1424d583b39bSJohn Wren Kennedy#
1425d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise
1426d583b39bSJohn Wren Kennedy#
1427d583b39bSJohn Wren Kennedyfunction check_slog_state # pool disk state{online,offline,unavail}
1428d583b39bSJohn Wren Kennedy{
1429d583b39bSJohn Wren Kennedy	typeset pool=$1
1430d583b39bSJohn Wren Kennedy	typeset disk=${2#/dev/dsk/}
1431d583b39bSJohn Wren Kennedy	typeset state=$3
1432d583b39bSJohn Wren Kennedy
1433d583b39bSJohn Wren Kennedy	cur_state=$(get_device_state $pool $disk "logs")
1434d583b39bSJohn Wren Kennedy
1435d583b39bSJohn Wren Kennedy	if [[ $state != ${cur_state} ]]; then
1436d583b39bSJohn Wren Kennedy		return 1
1437d583b39bSJohn Wren Kennedy	fi
1438d583b39bSJohn Wren Kennedy	return 0
1439d583b39bSJohn Wren Kennedy}
1440d583b39bSJohn Wren Kennedy
1441d583b39bSJohn Wren Kennedy#
1442d583b39bSJohn Wren Kennedy# Verify a given vdev disk is inuse or avail
1443d583b39bSJohn Wren Kennedy#
1444d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise
1445d583b39bSJohn Wren Kennedy#
1446d583b39bSJohn Wren Kennedyfunction check_vdev_state # pool disk state{online,offline,unavail}
1447d583b39bSJohn Wren Kennedy{
1448d583b39bSJohn Wren Kennedy	typeset pool=$1
1449d583b39bSJohn Wren Kennedy	typeset disk=${2#/dev/dsk/}
1450d583b39bSJohn Wren Kennedy	typeset state=$3
1451d583b39bSJohn Wren Kennedy
1452d583b39bSJohn Wren Kennedy	cur_state=$(get_device_state $pool $disk)
1453d583b39bSJohn Wren Kennedy
1454d583b39bSJohn Wren Kennedy	if [[ $state != ${cur_state} ]]; then
1455d583b39bSJohn Wren Kennedy		return 1
1456d583b39bSJohn Wren Kennedy	fi
1457d583b39bSJohn Wren Kennedy	return 0
1458d583b39bSJohn Wren Kennedy}
1459d583b39bSJohn Wren Kennedy
1460d583b39bSJohn Wren Kennedy#
1461d583b39bSJohn Wren Kennedy# Check the output of 'zpool status -v <pool>',
1462d583b39bSJohn Wren Kennedy# and to see if the content of <token> contain the <keyword> specified.
1463d583b39bSJohn Wren Kennedy#
1464d583b39bSJohn Wren Kennedy# Return 0 is contain, 1 otherwise
1465d583b39bSJohn Wren Kennedy#
1466d583b39bSJohn Wren Kennedyfunction check_pool_status # pool token keyword
1467d583b39bSJohn Wren Kennedy{
1468d583b39bSJohn Wren Kennedy	typeset pool=$1
1469d583b39bSJohn Wren Kennedy	typeset token=$2
1470d583b39bSJohn Wren Kennedy	typeset keyword=$3
1471d583b39bSJohn Wren Kennedy
1472d583b39bSJohn Wren Kennedy	$ZPOOL status -v "$pool" 2>/dev/null | $NAWK -v token="$token:" '
1473d583b39bSJohn Wren Kennedy		($1==token) {print $0}' \
1474d583b39bSJohn Wren Kennedy	| $GREP -i "$keyword" > /dev/null 2>&1
1475d583b39bSJohn Wren Kennedy
1476d583b39bSJohn Wren Kennedy	return $?
1477d583b39bSJohn Wren Kennedy}
1478d583b39bSJohn Wren Kennedy
1479d583b39bSJohn Wren Kennedy#
1480d583b39bSJohn Wren Kennedy# These 5 following functions are instance of check_pool_status()
1481d583b39bSJohn Wren Kennedy#	is_pool_resilvering - to check if the pool is resilver in progress
1482d583b39bSJohn Wren Kennedy#	is_pool_resilvered - to check if the pool is resilver completed
1483d583b39bSJohn Wren Kennedy#	is_pool_scrubbing - to check if the pool is scrub in progress
1484d583b39bSJohn Wren Kennedy#	is_pool_scrubbed - to check if the pool is scrub completed
1485d583b39bSJohn Wren Kennedy#	is_pool_scrub_stopped - to check if the pool is scrub stopped
1486d583b39bSJohn Wren Kennedy#
1487d583b39bSJohn Wren Kennedyfunction is_pool_resilvering #pool
1488d583b39bSJohn Wren Kennedy{
1489d583b39bSJohn Wren Kennedy	check_pool_status "$1" "scan" "resilver in progress since "
1490d583b39bSJohn Wren Kennedy	return $?
1491d583b39bSJohn Wren Kennedy}
1492d583b39bSJohn Wren Kennedy
1493d583b39bSJohn Wren Kennedyfunction is_pool_resilvered #pool
1494d583b39bSJohn Wren Kennedy{
1495d583b39bSJohn Wren Kennedy	check_pool_status "$1" "scan" "resilvered "
1496d583b39bSJohn Wren Kennedy	return $?
1497d583b39bSJohn Wren Kennedy}
1498d583b39bSJohn Wren Kennedy
1499d583b39bSJohn Wren Kennedyfunction is_pool_scrubbing #pool
1500d583b39bSJohn Wren Kennedy{
1501d583b39bSJohn Wren Kennedy	check_pool_status "$1" "scan" "scrub in progress since "
1502d583b39bSJohn Wren Kennedy	return $?
1503d583b39bSJohn Wren Kennedy}
1504d583b39bSJohn Wren Kennedy
1505d583b39bSJohn Wren Kennedyfunction is_pool_scrubbed #pool
1506d583b39bSJohn Wren Kennedy{
1507d583b39bSJohn Wren Kennedy	check_pool_status "$1" "scan" "scrub repaired"
1508d583b39bSJohn Wren Kennedy	return $?
1509d583b39bSJohn Wren Kennedy}
1510d583b39bSJohn Wren Kennedy
1511d583b39bSJohn Wren Kennedyfunction is_pool_scrub_stopped #pool
1512d583b39bSJohn Wren Kennedy{
1513d583b39bSJohn Wren Kennedy	check_pool_status "$1" "scan" "scrub canceled"
1514d583b39bSJohn Wren Kennedy	return $?
1515d583b39bSJohn Wren Kennedy}
1516d583b39bSJohn Wren Kennedy
1517d583b39bSJohn Wren Kennedy#
1518d583b39bSJohn Wren Kennedy# Use create_pool()/destroy_pool() to clean up the infomation in
1519d583b39bSJohn Wren Kennedy# in the given disk to avoid slice overlapping.
1520d583b39bSJohn Wren Kennedy#
1521d583b39bSJohn Wren Kennedyfunction cleanup_devices #vdevs
1522d583b39bSJohn Wren Kennedy{
1523d583b39bSJohn Wren Kennedy	typeset pool="foopool$$"
1524d583b39bSJohn Wren Kennedy
1525d583b39bSJohn Wren Kennedy	if poolexists $pool ; then
1526d583b39bSJohn Wren Kennedy		destroy_pool $pool
1527d583b39bSJohn Wren Kennedy	fi
1528d583b39bSJohn Wren Kennedy
1529d583b39bSJohn Wren Kennedy	create_pool $pool $@
1530d583b39bSJohn Wren Kennedy	destroy_pool $pool
1531d583b39bSJohn Wren Kennedy
1532d583b39bSJohn Wren Kennedy	return 0
1533d583b39bSJohn Wren Kennedy}
1534d583b39bSJohn Wren Kennedy
1535d583b39bSJohn Wren Kennedy#
1536d583b39bSJohn Wren Kennedy# Verify the rsh connectivity to each remote host in RHOSTS.
1537d583b39bSJohn Wren Kennedy#
1538d583b39bSJohn Wren Kennedy# Return 0 if remote host is accessible; otherwise 1.
1539d583b39bSJohn Wren Kennedy# $1 remote host name
1540d583b39bSJohn Wren Kennedy# $2 username
1541d583b39bSJohn Wren Kennedy#
1542d583b39bSJohn Wren Kennedyfunction verify_rsh_connect #rhost, username
1543d583b39bSJohn Wren Kennedy{
1544d583b39bSJohn Wren Kennedy	typeset rhost=$1
1545d583b39bSJohn Wren Kennedy	typeset username=$2
1546d583b39bSJohn Wren Kennedy	typeset rsh_cmd="$RSH -n"
1547d583b39bSJohn Wren Kennedy	typeset cur_user=
1548d583b39bSJohn Wren Kennedy
1549d583b39bSJohn Wren Kennedy	$GETENT hosts $rhost >/dev/null 2>&1
1550d583b39bSJohn Wren Kennedy	if (($? != 0)); then
1551d583b39bSJohn Wren Kennedy		log_note "$rhost cannot be found from" \
1552d583b39bSJohn Wren Kennedy			"administrative database."
1553d583b39bSJohn Wren Kennedy		return 1
1554d583b39bSJohn Wren Kennedy	fi
1555d583b39bSJohn Wren Kennedy
1556d583b39bSJohn Wren Kennedy	$PING $rhost 3 >/dev/null 2>&1
1557d583b39bSJohn Wren Kennedy	if (($? != 0)); then
1558d583b39bSJohn Wren Kennedy		log_note "$rhost is not reachable."
1559d583b39bSJohn Wren Kennedy		return 1
1560d583b39bSJohn Wren Kennedy	fi
1561d583b39bSJohn Wren Kennedy
1562d583b39bSJohn Wren Kennedy	if ((${#username} != 0)); then
1563d583b39bSJohn Wren Kennedy		rsh_cmd="$rsh_cmd -l $username"
1564d583b39bSJohn Wren Kennedy		cur_user="given user \"$username\""
1565d583b39bSJohn Wren Kennedy	else
1566d583b39bSJohn Wren Kennedy		cur_user="current user \"`$LOGNAME`\""
1567d583b39bSJohn Wren Kennedy	fi
1568d583b39bSJohn Wren Kennedy
1569d583b39bSJohn Wren Kennedy	 if ! $rsh_cmd $rhost $TRUE; then
1570d583b39bSJohn Wren Kennedy		log_note "$RSH to $rhost is not accessible" \
1571d583b39bSJohn Wren Kennedy			"with $cur_user."
1572d583b39bSJohn Wren Kennedy		return 1
1573d583b39bSJohn Wren Kennedy	fi
1574d583b39bSJohn Wren Kennedy
1575d583b39bSJohn Wren Kennedy	return 0
1576d583b39bSJohn Wren Kennedy}
1577d583b39bSJohn Wren Kennedy
1578d583b39bSJohn Wren Kennedy#
1579d583b39bSJohn Wren Kennedy# Verify the remote host connection via rsh after rebooting
1580d583b39bSJohn Wren Kennedy# $1 remote host
1581d583b39bSJohn Wren Kennedy#
1582d583b39bSJohn Wren Kennedyfunction verify_remote
1583d583b39bSJohn Wren Kennedy{
1584d583b39bSJohn Wren Kennedy	rhost=$1
1585d583b39bSJohn Wren Kennedy
1586d583b39bSJohn Wren Kennedy	#
1587d583b39bSJohn Wren Kennedy	# The following loop waits for the remote system rebooting.
1588d583b39bSJohn Wren Kennedy	# Each iteration will wait for 150 seconds. there are
1589d583b39bSJohn Wren Kennedy	# total 5 iterations, so the total timeout value will
1590d583b39bSJohn Wren Kennedy	# be 12.5  minutes for the system rebooting. This number
1591d583b39bSJohn Wren Kennedy	# is an approxiate number.
1592d583b39bSJohn Wren Kennedy	#
1593d583b39bSJohn Wren Kennedy	typeset -i count=0
1594d583b39bSJohn Wren Kennedy	while ! verify_rsh_connect $rhost; do
1595d583b39bSJohn Wren Kennedy		sleep 150
1596d583b39bSJohn Wren Kennedy		((count = count + 1))
1597d583b39bSJohn Wren Kennedy		if ((count > 5)); then
1598d583b39bSJohn Wren Kennedy			return 1
1599d583b39bSJohn Wren Kennedy		fi
1600d583b39bSJohn Wren Kennedy	done
1601d583b39bSJohn Wren Kennedy	return 0
1602d583b39bSJohn Wren Kennedy}
1603d583b39bSJohn Wren Kennedy
1604d583b39bSJohn Wren Kennedy#
1605d583b39bSJohn Wren Kennedy# Replacement function for /usr/bin/rsh. This function will include
1606d583b39bSJohn Wren Kennedy# the /usr/bin/rsh and meanwhile return the execution status of the
1607d583b39bSJohn Wren Kennedy# last command.
1608d583b39bSJohn Wren Kennedy#
1609d583b39bSJohn Wren Kennedy# $1 usrname passing down to -l option of /usr/bin/rsh
1610d583b39bSJohn Wren Kennedy# $2 remote machine hostname
1611d583b39bSJohn Wren Kennedy# $3... command string
1612d583b39bSJohn Wren Kennedy#
1613d583b39bSJohn Wren Kennedy
1614d583b39bSJohn Wren Kennedyfunction rsh_status
1615d583b39bSJohn Wren Kennedy{
1616d583b39bSJohn Wren Kennedy	typeset ruser=$1
1617d583b39bSJohn Wren Kennedy	typeset rhost=$2
1618d583b39bSJohn Wren Kennedy	typeset -i ret=0
1619d583b39bSJohn Wren Kennedy	typeset cmd_str=""
1620d583b39bSJohn Wren Kennedy	typeset rsh_str=""
1621d583b39bSJohn Wren Kennedy
1622d583b39bSJohn Wren Kennedy	shift; shift
1623d583b39bSJohn Wren Kennedy	cmd_str="$@"
1624d583b39bSJohn Wren Kennedy
1625d583b39bSJohn Wren Kennedy	err_file=/tmp/${rhost}.$$.err
1626d583b39bSJohn Wren Kennedy	if ((${#ruser} == 0)); then
1627d583b39bSJohn Wren Kennedy		rsh_str="$RSH -n"
1628d583b39bSJohn Wren Kennedy	else
1629d583b39bSJohn Wren Kennedy		rsh_str="$RSH -n -l $ruser"
1630d583b39bSJohn Wren Kennedy	fi
1631d583b39bSJohn Wren Kennedy
1632d583b39bSJohn Wren Kennedy	$rsh_str $rhost /usr/bin/ksh -c "'$cmd_str; \
1633d583b39bSJohn Wren Kennedy		print -u 2 \"status=\$?\"'" \
1634d583b39bSJohn Wren Kennedy		>/dev/null 2>$err_file
1635d583b39bSJohn Wren Kennedy	ret=$?
1636d583b39bSJohn Wren Kennedy	if (($ret != 0)); then
1637d583b39bSJohn Wren Kennedy		$CAT $err_file
1638d583b39bSJohn Wren Kennedy		$RM -f $std_file $err_file
1639d583b39bSJohn Wren Kennedy		log_fail  "$RSH itself failed with exit code $ret..."
1640d583b39bSJohn Wren Kennedy	fi
1641d583b39bSJohn Wren Kennedy
1642d583b39bSJohn Wren Kennedy	 ret=$($GREP -v 'print -u 2' $err_file | $GREP 'status=' | \
1643d583b39bSJohn Wren Kennedy		$CUT -d= -f2)
1644d583b39bSJohn Wren Kennedy	(($ret != 0)) && $CAT $err_file >&2
1645d583b39bSJohn Wren Kennedy
1646d583b39bSJohn Wren Kennedy	$RM -f $err_file >/dev/null 2>&1
1647d583b39bSJohn Wren Kennedy	return $ret
1648d583b39bSJohn Wren Kennedy}
1649d583b39bSJohn Wren Kennedy
1650d583b39bSJohn Wren Kennedy#
1651d583b39bSJohn Wren Kennedy# Get the SUNWstc-fs-zfs package installation path in a remote host
1652d583b39bSJohn Wren Kennedy# $1 remote host name
1653d583b39bSJohn Wren Kennedy#
1654d583b39bSJohn Wren Kennedyfunction get_remote_pkgpath
1655d583b39bSJohn Wren Kennedy{
1656d583b39bSJohn Wren Kennedy	typeset rhost=$1
1657d583b39bSJohn Wren Kennedy	typeset pkgpath=""
1658d583b39bSJohn Wren Kennedy
1659d583b39bSJohn Wren Kennedy	pkgpath=$($RSH -n $rhost "$PKGINFO -l SUNWstc-fs-zfs | $GREP BASEDIR: |\
1660d583b39bSJohn Wren Kennedy			$CUT -d: -f2")
1661d583b39bSJohn Wren Kennedy
1662d583b39bSJohn Wren Kennedy	$ECHO $pkgpath
1663d583b39bSJohn Wren Kennedy}
1664d583b39bSJohn Wren Kennedy
1665d583b39bSJohn Wren Kennedy#/**
1666d583b39bSJohn Wren Kennedy# A function to find and locate free disks on a system or from given
1667d583b39bSJohn Wren Kennedy# disks as the parameter. It works by locating disks that are in use
1668d583b39bSJohn Wren Kennedy# as swap devices, SVM devices, and dump devices, and also disks
1669d583b39bSJohn Wren Kennedy# listed in /etc/vfstab
1670d583b39bSJohn Wren Kennedy#
1671d583b39bSJohn Wren Kennedy# $@ given disks to find which are free, default is all disks in
1672d583b39bSJohn Wren Kennedy# the test system
1673d583b39bSJohn Wren Kennedy#
1674d583b39bSJohn Wren Kennedy# @return a string containing the list of available disks
1675d583b39bSJohn Wren Kennedy#*/
1676d583b39bSJohn Wren Kennedyfunction find_disks
1677d583b39bSJohn Wren Kennedy{
1678d583b39bSJohn Wren Kennedy	sfi=/tmp/swaplist.$$
1679d583b39bSJohn Wren Kennedy	msi=/tmp/metastat.$$
1680d583b39bSJohn Wren Kennedy	dmpi=/tmp/dumpdev.$$
1681d583b39bSJohn Wren Kennedy	max_finddisksnum=${MAX_FINDDISKSNUM:-6}
1682d583b39bSJohn Wren Kennedy
1683d583b39bSJohn Wren Kennedy	$SWAP -l > $sfi
1684d583b39bSJohn Wren Kennedy	$METASTAT -c > $msi 2>/dev/null
1685d583b39bSJohn Wren Kennedy	$DUMPADM > $dmpi 2>/dev/null
1686d583b39bSJohn Wren Kennedy
1687d583b39bSJohn Wren Kennedy# write an awk script that can process the output of format
1688d583b39bSJohn Wren Kennedy# to produce a list of disks we know about. Note that we have
1689d583b39bSJohn Wren Kennedy# to escape "$2" so that the shell doesn't interpret it while
1690d583b39bSJohn Wren Kennedy# we're creating the awk script.
1691d583b39bSJohn Wren Kennedy# -------------------
1692d583b39bSJohn Wren Kennedy	$CAT > /tmp/find_disks.awk <<EOF
1693d583b39bSJohn Wren Kennedy#!/bin/nawk -f
1694d583b39bSJohn Wren Kennedy	BEGIN { FS="."; }
1695d583b39bSJohn Wren Kennedy
1696d583b39bSJohn Wren Kennedy	/^Specify disk/{
1697d583b39bSJohn Wren Kennedy		searchdisks=0;
1698d583b39bSJohn Wren Kennedy	}
1699d583b39bSJohn Wren Kennedy
1700d583b39bSJohn Wren Kennedy	{
1701d583b39bSJohn Wren Kennedy		if (searchdisks && \$2 !~ "^$"){
1702d583b39bSJohn Wren Kennedy			split(\$2,arr," ");
1703d583b39bSJohn Wren Kennedy			print arr[1];
1704d583b39bSJohn Wren Kennedy		}
1705d583b39bSJohn Wren Kennedy	}
1706d583b39bSJohn Wren Kennedy
1707d583b39bSJohn Wren Kennedy	/^AVAILABLE DISK SELECTIONS:/{
1708d583b39bSJohn Wren Kennedy		searchdisks=1;
1709d583b39bSJohn Wren Kennedy	}
1710d583b39bSJohn Wren KennedyEOF
1711d583b39bSJohn Wren Kennedy#---------------------
1712d583b39bSJohn Wren Kennedy
1713d583b39bSJohn Wren Kennedy	$CHMOD 755 /tmp/find_disks.awk
1714d583b39bSJohn Wren Kennedy	disks=${@:-$($ECHO "" | $FORMAT -e 2>/dev/null | /tmp/find_disks.awk)}
1715d583b39bSJohn Wren Kennedy	$RM /tmp/find_disks.awk
1716d583b39bSJohn Wren Kennedy
1717d583b39bSJohn Wren Kennedy	unused=""
1718d583b39bSJohn Wren Kennedy	for disk in $disks; do
1719d583b39bSJohn Wren Kennedy	# Check for mounted
1720d583b39bSJohn Wren Kennedy		$GREP "${disk}[sp]" /etc/mnttab >/dev/null
1721d583b39bSJohn Wren Kennedy		(($? == 0)) && continue
1722d583b39bSJohn Wren Kennedy	# Check for swap
1723d583b39bSJohn Wren Kennedy		$GREP "${disk}[sp]" $sfi >/dev/null
1724d583b39bSJohn Wren Kennedy		(($? == 0)) && continue
1725d583b39bSJohn Wren Kennedy	# Check for SVM
1726d583b39bSJohn Wren Kennedy		$GREP "${disk}" $msi >/dev/null
1727d583b39bSJohn Wren Kennedy		(($? == 0)) && continue
1728d583b39bSJohn Wren Kennedy	# check for dump device
1729d583b39bSJohn Wren Kennedy		$GREP "${disk}[sp]" $dmpi >/dev/null
1730d583b39bSJohn Wren Kennedy		(($? == 0)) && continue
1731d583b39bSJohn Wren Kennedy	# check to see if this disk hasn't been explicitly excluded
1732d583b39bSJohn Wren Kennedy	# by a user-set environment variable
1733d583b39bSJohn Wren Kennedy		$ECHO "${ZFS_HOST_DEVICES_IGNORE}" | $GREP "${disk}" > /dev/null
1734d583b39bSJohn Wren Kennedy		(($? == 0)) && continue
1735d583b39bSJohn Wren Kennedy		unused_candidates="$unused_candidates $disk"
1736d583b39bSJohn Wren Kennedy	done
1737d583b39bSJohn Wren Kennedy	$RM $sfi
1738d583b39bSJohn Wren Kennedy	$RM $msi
1739d583b39bSJohn Wren Kennedy	$RM $dmpi
1740d583b39bSJohn Wren Kennedy
1741d583b39bSJohn Wren Kennedy# now just check to see if those disks do actually exist
1742d583b39bSJohn Wren Kennedy# by looking for a device pointing to the first slice in
1743d583b39bSJohn Wren Kennedy# each case. limit the number to max_finddisksnum
1744d583b39bSJohn Wren Kennedy	count=0
1745d583b39bSJohn Wren Kennedy	for disk in $unused_candidates; do
1746d583b39bSJohn Wren Kennedy		if [ -b /dev/dsk/${disk}s0 ]; then
1747d583b39bSJohn Wren Kennedy		if [ $count -lt $max_finddisksnum ]; then
1748d583b39bSJohn Wren Kennedy			unused="$unused $disk"
1749d583b39bSJohn Wren Kennedy			# do not impose limit if $@ is provided
1750d583b39bSJohn Wren Kennedy			[[ -z $@ ]] && ((count = count + 1))
1751d583b39bSJohn Wren Kennedy		fi
1752d583b39bSJohn Wren Kennedy		fi
1753d583b39bSJohn Wren Kennedy	done
1754d583b39bSJohn Wren Kennedy
1755d583b39bSJohn Wren Kennedy# finally, return our disk list
1756d583b39bSJohn Wren Kennedy	$ECHO $unused
1757d583b39bSJohn Wren Kennedy}
1758d583b39bSJohn Wren Kennedy
1759d583b39bSJohn Wren Kennedy#
1760d583b39bSJohn Wren Kennedy# Add specified user to specified group
1761d583b39bSJohn Wren Kennedy#
1762d583b39bSJohn Wren Kennedy# $1 group name
1763d583b39bSJohn Wren Kennedy# $2 user name
1764d583b39bSJohn Wren Kennedy# $3 base of the homedir (optional)
1765d583b39bSJohn Wren Kennedy#
1766d583b39bSJohn Wren Kennedyfunction add_user #<group_name> <user_name> <basedir>
1767d583b39bSJohn Wren Kennedy{
1768d583b39bSJohn Wren Kennedy	typeset gname=$1
1769d583b39bSJohn Wren Kennedy	typeset uname=$2
1770d583b39bSJohn Wren Kennedy	typeset basedir=${3:-"/var/tmp"}
1771d583b39bSJohn Wren Kennedy
1772d583b39bSJohn Wren Kennedy	if ((${#gname} == 0 || ${#uname} == 0)); then
1773d583b39bSJohn Wren Kennedy		log_fail "group name or user name are not defined."
1774d583b39bSJohn Wren Kennedy	fi
1775d583b39bSJohn Wren Kennedy
1776d583b39bSJohn Wren Kennedy	log_must $USERADD -g $gname -d $basedir/$uname -m $uname
1777d583b39bSJohn Wren Kennedy
1778d583b39bSJohn Wren Kennedy	return 0
1779d583b39bSJohn Wren Kennedy}
1780d583b39bSJohn Wren Kennedy
1781d583b39bSJohn Wren Kennedy#
1782d583b39bSJohn Wren Kennedy# Delete the specified user.
1783d583b39bSJohn Wren Kennedy#
1784d583b39bSJohn Wren Kennedy# $1 login name
1785d583b39bSJohn Wren Kennedy# $2 base of the homedir (optional)
1786d583b39bSJohn Wren Kennedy#
1787d583b39bSJohn Wren Kennedyfunction del_user #<logname> <basedir>
1788d583b39bSJohn Wren Kennedy{
1789d583b39bSJohn Wren Kennedy	typeset user=$1
1790d583b39bSJohn Wren Kennedy	typeset basedir=${2:-"/var/tmp"}
1791d583b39bSJohn Wren Kennedy
1792d583b39bSJohn Wren Kennedy	if ((${#user} == 0)); then
1793d583b39bSJohn Wren Kennedy		log_fail "login name is necessary."
1794d583b39bSJohn Wren Kennedy	fi
1795d583b39bSJohn Wren Kennedy
1796d583b39bSJohn Wren Kennedy	if $ID $user > /dev/null 2>&1; then
1797d583b39bSJohn Wren Kennedy		log_must $USERDEL $user
1798d583b39bSJohn Wren Kennedy	fi
1799d583b39bSJohn Wren Kennedy
1800d583b39bSJohn Wren Kennedy	[[ -d $basedir/$user ]] && $RM -fr $basedir/$user
1801d583b39bSJohn Wren Kennedy
1802d583b39bSJohn Wren Kennedy	return 0
1803d583b39bSJohn Wren Kennedy}
1804d583b39bSJohn Wren Kennedy
1805d583b39bSJohn Wren Kennedy#
1806d583b39bSJohn Wren Kennedy# Select valid gid and create specified group.
1807d583b39bSJohn Wren Kennedy#
1808d583b39bSJohn Wren Kennedy# $1 group name
1809d583b39bSJohn Wren Kennedy#
1810d583b39bSJohn Wren Kennedyfunction add_group #<group_name>
1811d583b39bSJohn Wren Kennedy{
1812d583b39bSJohn Wren Kennedy	typeset group=$1
1813d583b39bSJohn Wren Kennedy
1814d583b39bSJohn Wren Kennedy	if ((${#group} == 0)); then
1815d583b39bSJohn Wren Kennedy		log_fail "group name is necessary."
1816d583b39bSJohn Wren Kennedy	fi
1817d583b39bSJohn Wren Kennedy
1818d583b39bSJohn Wren Kennedy	# Assign 100 as the base gid
1819d583b39bSJohn Wren Kennedy	typeset -i gid=100
1820d583b39bSJohn Wren Kennedy	while true; do
1821d583b39bSJohn Wren Kennedy		$GROUPADD -g $gid $group > /dev/null 2>&1
1822d583b39bSJohn Wren Kennedy		typeset -i ret=$?
1823d583b39bSJohn Wren Kennedy		case $ret in
1824d583b39bSJohn Wren Kennedy			0) return 0 ;;
1825d583b39bSJohn Wren Kennedy			# The gid is not  unique
1826d583b39bSJohn Wren Kennedy			4) ((gid += 1)) ;;
1827d583b39bSJohn Wren Kennedy			*) return 1 ;;
1828d583b39bSJohn Wren Kennedy		esac
1829d583b39bSJohn Wren Kennedy	done
1830d583b39bSJohn Wren Kennedy}
1831d583b39bSJohn Wren Kennedy
1832d583b39bSJohn Wren Kennedy#
1833d583b39bSJohn Wren Kennedy# Delete the specified group.
1834d583b39bSJohn Wren Kennedy#
1835d583b39bSJohn Wren Kennedy# $1 group name
1836d583b39bSJohn Wren Kennedy#
1837d583b39bSJohn Wren Kennedyfunction del_group #<group_name>
1838d583b39bSJohn Wren Kennedy{
1839d583b39bSJohn Wren Kennedy	typeset grp=$1
1840d583b39bSJohn Wren Kennedy	if ((${#grp} == 0)); then
1841d583b39bSJohn Wren Kennedy		log_fail "group name is necessary."
1842d583b39bSJohn Wren Kennedy	fi
1843d583b39bSJohn Wren Kennedy
1844d583b39bSJohn Wren Kennedy	$GROUPMOD -n $grp $grp > /dev/null 2>&1
1845d583b39bSJohn Wren Kennedy	typeset -i ret=$?
1846d583b39bSJohn Wren Kennedy	case $ret in
1847d583b39bSJohn Wren Kennedy		# Group does not exist.
1848d583b39bSJohn Wren Kennedy		6) return 0 ;;
1849d583b39bSJohn Wren Kennedy		# Name already exists as a group name
1850d583b39bSJohn Wren Kennedy		9) log_must $GROUPDEL $grp ;;
1851d583b39bSJohn Wren Kennedy		*) return 1 ;;
1852d583b39bSJohn Wren Kennedy	esac
1853d583b39bSJohn Wren Kennedy
1854d583b39bSJohn Wren Kennedy	return 0
1855d583b39bSJohn Wren Kennedy}
1856d583b39bSJohn Wren Kennedy
1857d583b39bSJohn Wren Kennedy#
1858d583b39bSJohn Wren Kennedy# This function will return true if it's safe to destroy the pool passed
1859d583b39bSJohn Wren Kennedy# as argument 1. It checks for pools based on zvols and files, and also
1860d583b39bSJohn Wren Kennedy# files contained in a pool that may have a different mountpoint.
1861d583b39bSJohn Wren Kennedy#
1862d583b39bSJohn Wren Kennedyfunction safe_to_destroy_pool { # $1 the pool name
1863d583b39bSJohn Wren Kennedy
1864d583b39bSJohn Wren Kennedy	typeset pool=""
1865d583b39bSJohn Wren Kennedy	typeset DONT_DESTROY=""
1866d583b39bSJohn Wren Kennedy
1867d583b39bSJohn Wren Kennedy	# We check that by deleting the $1 pool, we're not
1868d583b39bSJohn Wren Kennedy	# going to pull the rug out from other pools. Do this
1869d583b39bSJohn Wren Kennedy	# by looking at all other pools, ensuring that they
1870d583b39bSJohn Wren Kennedy	# aren't built from files or zvols contained in this pool.
1871d583b39bSJohn Wren Kennedy
1872d583b39bSJohn Wren Kennedy	for pool in $($ZPOOL list -H -o name)
1873d583b39bSJohn Wren Kennedy	do
1874d583b39bSJohn Wren Kennedy		ALTMOUNTPOOL=""
1875d583b39bSJohn Wren Kennedy
1876d583b39bSJohn Wren Kennedy		# this is a list of the top-level directories in each of the
1877d583b39bSJohn Wren Kennedy		# files that make up the path to the files the pool is based on
1878d583b39bSJohn Wren Kennedy		FILEPOOL=$($ZPOOL status -v $pool | $GREP /$1/ | \
1879d583b39bSJohn Wren Kennedy			$AWK '{print $1}')
1880d583b39bSJohn Wren Kennedy
1881d583b39bSJohn Wren Kennedy		# this is a list of the zvols that make up the pool
1882d583b39bSJohn Wren Kennedy		ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/dsk/$1$" \
1883d583b39bSJohn Wren Kennedy		    | $AWK '{print $1}')
1884d583b39bSJohn Wren Kennedy
1885d583b39bSJohn Wren Kennedy		# also want to determine if it's a file-based pool using an
1886d583b39bSJohn Wren Kennedy		# alternate mountpoint...
1887d583b39bSJohn Wren Kennedy		POOL_FILE_DIRS=$($ZPOOL status -v $pool | \
1888d583b39bSJohn Wren Kennedy					$GREP / | $AWK '{print $1}' | \
1889d583b39bSJohn Wren Kennedy					$AWK -F/ '{print $2}' | $GREP -v "dev")
1890d583b39bSJohn Wren Kennedy
1891d583b39bSJohn Wren Kennedy		for pooldir in $POOL_FILE_DIRS
1892d583b39bSJohn Wren Kennedy		do
1893d583b39bSJohn Wren Kennedy			OUTPUT=$($ZFS list -H -r -o mountpoint $1 | \
1894d583b39bSJohn Wren Kennedy					$GREP "${pooldir}$" | $AWK '{print $1}')
1895d583b39bSJohn Wren Kennedy
1896d583b39bSJohn Wren Kennedy			ALTMOUNTPOOL="${ALTMOUNTPOOL}${OUTPUT}"
1897d583b39bSJohn Wren Kennedy		done
1898d583b39bSJohn Wren Kennedy
1899d583b39bSJohn Wren Kennedy
1900d583b39bSJohn Wren Kennedy		if [ ! -z "$ZVOLPOOL" ]
1901d583b39bSJohn Wren Kennedy		then
1902d583b39bSJohn Wren Kennedy			DONT_DESTROY="true"
1903d583b39bSJohn Wren Kennedy			log_note "Pool $pool is built from $ZVOLPOOL on $1"
1904d583b39bSJohn Wren Kennedy		fi
1905d583b39bSJohn Wren Kennedy
1906d583b39bSJohn Wren Kennedy		if [ ! -z "$FILEPOOL" ]
1907d583b39bSJohn Wren Kennedy		then
1908d583b39bSJohn Wren Kennedy			DONT_DESTROY="true"
1909d583b39bSJohn Wren Kennedy			log_note "Pool $pool is built from $FILEPOOL on $1"
1910d583b39bSJohn Wren Kennedy		fi
1911d583b39bSJohn Wren Kennedy
1912d583b39bSJohn Wren Kennedy		if [ ! -z "$ALTMOUNTPOOL" ]
1913d583b39bSJohn Wren Kennedy		then
1914d583b39bSJohn Wren Kennedy			DONT_DESTROY="true"
1915d583b39bSJohn Wren Kennedy			log_note "Pool $pool is built from $ALTMOUNTPOOL on $1"
1916d583b39bSJohn Wren Kennedy		fi
1917d583b39bSJohn Wren Kennedy	done
1918d583b39bSJohn Wren Kennedy
1919d583b39bSJohn Wren Kennedy	if [ -z "${DONT_DESTROY}" ]
1920d583b39bSJohn Wren Kennedy	then
1921d583b39bSJohn Wren Kennedy		return 0
1922d583b39bSJohn Wren Kennedy	else
1923d583b39bSJohn Wren Kennedy		log_note "Warning: it is not safe to destroy $1!"
1924d583b39bSJohn Wren Kennedy		return 1
1925d583b39bSJohn Wren Kennedy	fi
1926d583b39bSJohn Wren Kennedy}
1927d583b39bSJohn Wren Kennedy
1928d583b39bSJohn Wren Kennedy#
1929d583b39bSJohn Wren Kennedy# Get IP address of hostname
1930d583b39bSJohn Wren Kennedy# $1 hostname
1931d583b39bSJohn Wren Kennedy#
1932d583b39bSJohn Wren Kennedyfunction getipbyhost
1933d583b39bSJohn Wren Kennedy{
1934d583b39bSJohn Wren Kennedy	typeset ip
1935d583b39bSJohn Wren Kennedy	ip=`$ARP $1 2>/dev/null | $AWK -F\) '{print $1}' \
1936d583b39bSJohn Wren Kennedy		| $AWK -F\('{print $2}'`
1937d583b39bSJohn Wren Kennedy	$ECHO $ip
1938d583b39bSJohn Wren Kennedy}
1939d583b39bSJohn Wren Kennedy
1940d583b39bSJohn Wren Kennedy#
1941d583b39bSJohn Wren Kennedy# Setup iSCSI initiator to target
1942d583b39bSJohn Wren Kennedy# $1 target hostname
1943d583b39bSJohn Wren Kennedy#
1944d583b39bSJohn Wren Kennedyfunction iscsi_isetup
1945d583b39bSJohn Wren Kennedy{
1946d583b39bSJohn Wren Kennedy	# check svc:/network/iscsi_initiator:default state, try to enable it
1947d583b39bSJohn Wren Kennedy	# if the state is not ON
1948d583b39bSJohn Wren Kennedy	typeset ISCSII_FMRI="svc:/network/iscsi_initiator:default"
1949d583b39bSJohn Wren Kennedy	if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then
1950d583b39bSJohn Wren Kennedy		log_must $SVCADM enable $ISCSII_FMRI
1951d583b39bSJohn Wren Kennedy
1952d583b39bSJohn Wren Kennedy		typeset -i retry=20
1953d583b39bSJohn Wren Kennedy		while [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) && \
1954d583b39bSJohn Wren Kennedy			($retry -ne 0) ]]
1955d583b39bSJohn Wren Kennedy		do
1956d583b39bSJohn Wren Kennedy			((retry = retry - 1))
1957d583b39bSJohn Wren Kennedy			$SLEEP 1
1958d583b39bSJohn Wren Kennedy		done
1959d583b39bSJohn Wren Kennedy
1960d583b39bSJohn Wren Kennedy		if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then
1961d583b39bSJohn Wren Kennedy			log_fail "$ISCSII_FMRI service can not be enabled!"
1962d583b39bSJohn Wren Kennedy		fi
1963d583b39bSJohn Wren Kennedy	fi
1964d583b39bSJohn Wren Kennedy
1965d583b39bSJohn Wren Kennedy	log_must $ISCSIADM add discovery-address $(getipbyhost $1)
1966d583b39bSJohn Wren Kennedy	log_must $ISCSIADM modify discovery --sendtargets enable
1967d583b39bSJohn Wren Kennedy	log_must $DEVFSADM -i iscsi
1968d583b39bSJohn Wren Kennedy}
1969d583b39bSJohn Wren Kennedy
1970d583b39bSJohn Wren Kennedy#
1971d583b39bSJohn Wren Kennedy# Check whether iscsi parameter is set as remote
1972d583b39bSJohn Wren Kennedy#
1973d583b39bSJohn Wren Kennedy# return 0 if iscsi is set as remote, otherwise 1
1974d583b39bSJohn Wren Kennedy#
1975d583b39bSJohn Wren Kennedyfunction check_iscsi_remote
1976d583b39bSJohn Wren Kennedy{
1977d583b39bSJohn Wren Kennedy	if [[ $iscsi == "remote" ]] ; then
1978d583b39bSJohn Wren Kennedy		return 0
1979d583b39bSJohn Wren Kennedy	else
1980d583b39bSJohn Wren Kennedy		return 1
1981d583b39bSJohn Wren Kennedy	fi
1982d583b39bSJohn Wren Kennedy}
1983d583b39bSJohn Wren Kennedy
1984d583b39bSJohn Wren Kennedy#
1985d583b39bSJohn Wren Kennedy# Check if a volume is a valide iscsi target
1986d583b39bSJohn Wren Kennedy# $1 volume name
1987d583b39bSJohn Wren Kennedy# return 0 if suceeds, otherwise, return 1
1988d583b39bSJohn Wren Kennedy#
1989d583b39bSJohn Wren Kennedyfunction is_iscsi_target
1990d583b39bSJohn Wren Kennedy{
1991d583b39bSJohn Wren Kennedy	typeset dataset=$1
1992d583b39bSJohn Wren Kennedy	typeset target targets
1993d583b39bSJohn Wren Kennedy
1994d583b39bSJohn Wren Kennedy	[[ -z $dataset ]] && return 1
1995d583b39bSJohn Wren Kennedy
1996d583b39bSJohn Wren Kennedy	targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}')
1997d583b39bSJohn Wren Kennedy	[[ -z $targets ]] && return 1
1998d583b39bSJohn Wren Kennedy
1999d583b39bSJohn Wren Kennedy	for target in $targets; do
2000d583b39bSJohn Wren Kennedy		[[ $dataset == $target ]] && return 0
2001d583b39bSJohn Wren Kennedy	done
2002d583b39bSJohn Wren Kennedy
2003d583b39bSJohn Wren Kennedy	return 1
2004d583b39bSJohn Wren Kennedy}
2005d583b39bSJohn Wren Kennedy
2006d583b39bSJohn Wren Kennedy#
2007d583b39bSJohn Wren Kennedy# Get the iSCSI name of a target
2008d583b39bSJohn Wren Kennedy# $1 target name
2009d583b39bSJohn Wren Kennedy#
2010d583b39bSJohn Wren Kennedyfunction iscsi_name
2011d583b39bSJohn Wren Kennedy{
2012d583b39bSJohn Wren Kennedy	typeset target=$1
2013d583b39bSJohn Wren Kennedy	typeset name
2014d583b39bSJohn Wren Kennedy
2015d583b39bSJohn Wren Kennedy	[[ -z $target ]] && log_fail "No parameter."
2016d583b39bSJohn Wren Kennedy
2017d583b39bSJohn Wren Kennedy	if ! is_iscsi_target $target ; then
2018d583b39bSJohn Wren Kennedy		log_fail "Not a target."
2019d583b39bSJohn Wren Kennedy	fi
2020d583b39bSJohn Wren Kennedy
2021d583b39bSJohn Wren Kennedy	name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \
2022d583b39bSJohn Wren Kennedy		| $AWK '{print $2}')
2023d583b39bSJohn Wren Kennedy
2024d583b39bSJohn Wren Kennedy	return $name
2025d583b39bSJohn Wren Kennedy}
2026d583b39bSJohn Wren Kennedy
2027d583b39bSJohn Wren Kennedy#
2028d583b39bSJohn Wren Kennedy# check svc:/system/iscsitgt:default state, try to enable it if the state
2029d583b39bSJohn Wren Kennedy# is not ON
2030d583b39bSJohn Wren Kennedy#
2031d583b39bSJohn Wren Kennedyfunction iscsitgt_setup
2032d583b39bSJohn Wren Kennedy{
2033d583b39bSJohn Wren Kennedy	log_must $RM -f $ISCSITGTFILE
2034d583b39bSJohn Wren Kennedy	if [[ "ON" == $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then
2035d583b39bSJohn Wren Kennedy		log_note "iscsitgt is already enabled"
2036d583b39bSJohn Wren Kennedy		return
2037d583b39bSJohn Wren Kennedy	fi
2038d583b39bSJohn Wren Kennedy
2039d583b39bSJohn Wren Kennedy	log_must $SVCADM enable -t $ISCSITGT_FMRI
2040d583b39bSJohn Wren Kennedy
2041d583b39bSJohn Wren Kennedy	typeset -i retry=20
2042d583b39bSJohn Wren Kennedy	while [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) && \
2043d583b39bSJohn Wren Kennedy		($retry -ne 0) ]]
2044d583b39bSJohn Wren Kennedy	do
2045d583b39bSJohn Wren Kennedy		$SLEEP 1
2046d583b39bSJohn Wren Kennedy		((retry = retry - 1))
2047d583b39bSJohn Wren Kennedy	done
2048d583b39bSJohn Wren Kennedy
2049d583b39bSJohn Wren Kennedy	if [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then
2050d583b39bSJohn Wren Kennedy		log_fail "$ISCSITGT_FMRI service can not be enabled!"
2051d583b39bSJohn Wren Kennedy	fi
2052d583b39bSJohn Wren Kennedy
2053d583b39bSJohn Wren Kennedy	log_must $TOUCH $ISCSITGTFILE
2054d583b39bSJohn Wren Kennedy}
2055d583b39bSJohn Wren Kennedy
2056d583b39bSJohn Wren Kennedy#
2057d583b39bSJohn Wren Kennedy# set DISABLED state of svc:/system/iscsitgt:default
2058d583b39bSJohn Wren Kennedy# which is the most suiteable state if $ISCSITGTFILE exists
2059d583b39bSJohn Wren Kennedy#
2060d583b39bSJohn Wren Kennedyfunction iscsitgt_cleanup
2061d583b39bSJohn Wren Kennedy{
2062d583b39bSJohn Wren Kennedy	if [[ -e $ISCSITGTFILE ]]; then
2063d583b39bSJohn Wren Kennedy		log_must $SVCADM disable $ISCSITGT_FMRI
2064d583b39bSJohn Wren Kennedy		log_must $RM -f $ISCSITGTFILE
2065d583b39bSJohn Wren Kennedy	fi
2066d583b39bSJohn Wren Kennedy}
2067d583b39bSJohn Wren Kennedy
2068d583b39bSJohn Wren Kennedy#
2069d583b39bSJohn Wren Kennedy# Close iSCSI initiator to target
2070d583b39bSJohn Wren Kennedy# $1 target hostname
2071d583b39bSJohn Wren Kennedy#
2072d583b39bSJohn Wren Kennedyfunction iscsi_iclose
2073d583b39bSJohn Wren Kennedy{
2074d583b39bSJohn Wren Kennedy	log_must $ISCSIADM modify discovery --sendtargets disable
2075d583b39bSJohn Wren Kennedy	log_must $ISCSIADM remove discovery-address $(getipbyhost $1)
2076d583b39bSJohn Wren Kennedy	$DEVFSADM -Cv
2077d583b39bSJohn Wren Kennedy}
2078d583b39bSJohn Wren Kennedy
2079d583b39bSJohn Wren Kennedy#
2080d583b39bSJohn Wren Kennedy# Get the available ZFS compression options
2081d583b39bSJohn Wren Kennedy# $1 option type zfs_set|zfs_compress
2082d583b39bSJohn Wren Kennedy#
2083d583b39bSJohn Wren Kennedyfunction get_compress_opts
2084d583b39bSJohn Wren Kennedy{
2085d583b39bSJohn Wren Kennedy	typeset COMPRESS_OPTS
2086d583b39bSJohn Wren Kennedy	typeset GZIP_OPTS="gzip gzip-1 gzip-2 gzip-3 gzip-4 gzip-5 \
2087d583b39bSJohn Wren Kennedy			gzip-6 gzip-7 gzip-8 gzip-9"
2088d583b39bSJohn Wren Kennedy
2089d583b39bSJohn Wren Kennedy	if [[ $1 == "zfs_compress" ]] ; then
2090d583b39bSJohn Wren Kennedy		COMPRESS_OPTS="on lzjb"
2091d583b39bSJohn Wren Kennedy	elif [[ $1 == "zfs_set" ]] ; then
2092d583b39bSJohn Wren Kennedy		COMPRESS_OPTS="on off lzjb"
2093d583b39bSJohn Wren Kennedy	fi
2094d583b39bSJohn Wren Kennedy	typeset valid_opts="$COMPRESS_OPTS"
2095d583b39bSJohn Wren Kennedy	$ZFS get 2>&1 | $GREP gzip >/dev/null 2>&1
2096d583b39bSJohn Wren Kennedy	if [[ $? -eq 0 ]]; then
2097d583b39bSJohn Wren Kennedy		valid_opts="$valid_opts $GZIP_OPTS"
2098d583b39bSJohn Wren Kennedy	fi
2099d583b39bSJohn Wren Kennedy	$ECHO "$valid_opts"
2100d583b39bSJohn Wren Kennedy}
2101d583b39bSJohn Wren Kennedy
2102d583b39bSJohn Wren Kennedy#
2103d583b39bSJohn Wren Kennedy# Verify zfs operation with -p option work as expected
2104d583b39bSJohn Wren Kennedy# $1 operation, value could be create, clone or rename
2105d583b39bSJohn Wren Kennedy# $2 dataset type, value could be fs or vol
2106d583b39bSJohn Wren Kennedy# $3 dataset name
2107d583b39bSJohn Wren Kennedy# $4 new dataset name
2108d583b39bSJohn Wren Kennedy#
2109d583b39bSJohn Wren Kennedyfunction verify_opt_p_ops
2110d583b39bSJohn Wren Kennedy{
2111d583b39bSJohn Wren Kennedy	typeset ops=$1
2112d583b39bSJohn Wren Kennedy	typeset datatype=$2
2113d583b39bSJohn Wren Kennedy	typeset dataset=$3
2114d583b39bSJohn Wren Kennedy	typeset newdataset=$4
2115d583b39bSJohn Wren Kennedy
2116d583b39bSJohn Wren Kennedy	if [[ $datatype != "fs" && $datatype != "vol" ]]; then
2117d583b39bSJohn Wren Kennedy		log_fail "$datatype is not supported."
2118d583b39bSJohn Wren Kennedy	fi
2119d583b39bSJohn Wren Kennedy
2120d583b39bSJohn Wren Kennedy	# check parameters accordingly
2121d583b39bSJohn Wren Kennedy	case $ops in
2122d583b39bSJohn Wren Kennedy		create)
2123d583b39bSJohn Wren Kennedy			newdataset=$dataset
2124d583b39bSJohn Wren Kennedy			dataset=""
2125d583b39bSJohn Wren Kennedy			if [[ $datatype == "vol" ]]; then
2126d583b39bSJohn Wren Kennedy				ops="create -V $VOLSIZE"
2127d583b39bSJohn Wren Kennedy			fi
2128d583b39bSJohn Wren Kennedy			;;
2129d583b39bSJohn Wren Kennedy		clone)
2130d583b39bSJohn Wren Kennedy			if [[ -z $newdataset ]]; then
2131d583b39bSJohn Wren Kennedy				log_fail "newdataset should not be empty" \
2132d583b39bSJohn Wren Kennedy					"when ops is $ops."
2133d583b39bSJohn Wren Kennedy			fi
2134d583b39bSJohn Wren Kennedy			log_must datasetexists $dataset
2135d583b39bSJohn Wren Kennedy			log_must snapexists $dataset
2136d583b39bSJohn Wren Kennedy			;;
2137d583b39bSJohn Wren Kennedy		rename)
2138d583b39bSJohn Wren Kennedy			if [[ -z $newdataset ]]; then
2139d583b39bSJohn Wren Kennedy				log_fail "newdataset should not be empty" \
2140d583b39bSJohn Wren Kennedy					"when ops is $ops."
2141d583b39bSJohn Wren Kennedy			fi
2142d583b39bSJohn Wren Kennedy			log_must datasetexists $dataset
2143d583b39bSJohn Wren Kennedy			log_mustnot snapexists $dataset
2144d583b39bSJohn Wren Kennedy			;;
2145d583b39bSJohn Wren Kennedy		*)
2146d583b39bSJohn Wren Kennedy			log_fail "$ops is not supported."
2147d583b39bSJohn Wren Kennedy			;;
2148d583b39bSJohn Wren Kennedy	esac
2149d583b39bSJohn Wren Kennedy
2150d583b39bSJohn Wren Kennedy	# make sure the upper level filesystem does not exist
2151d583b39bSJohn Wren Kennedy	if datasetexists ${newdataset%/*} ; then
2152d583b39bSJohn Wren Kennedy		log_must $ZFS destroy -rRf ${newdataset%/*}
2153d583b39bSJohn Wren Kennedy	fi
2154d583b39bSJohn Wren Kennedy
2155d583b39bSJohn Wren Kennedy	# without -p option, operation will fail
2156d583b39bSJohn Wren Kennedy	log_mustnot $ZFS $ops $dataset $newdataset
2157d583b39bSJohn Wren Kennedy	log_mustnot datasetexists $newdataset ${newdataset%/*}
2158d583b39bSJohn Wren Kennedy
2159d583b39bSJohn Wren Kennedy	# with -p option, operation should succeed
2160d583b39bSJohn Wren Kennedy	log_must $ZFS $ops -p $dataset $newdataset
2161d583b39bSJohn Wren Kennedy	if ! datasetexists $newdataset ; then
2162d583b39bSJohn Wren Kennedy		log_fail "-p option does not work for $ops"
2163d583b39bSJohn Wren Kennedy	fi
2164d583b39bSJohn Wren Kennedy
2165d583b39bSJohn Wren Kennedy	# when $ops is create or clone, redo the operation still return zero
2166d583b39bSJohn Wren Kennedy	if [[ $ops != "rename" ]]; then
2167d583b39bSJohn Wren Kennedy		log_must $ZFS $ops -p $dataset $newdataset
2168d583b39bSJohn Wren Kennedy	fi
2169d583b39bSJohn Wren Kennedy
2170d583b39bSJohn Wren Kennedy	return 0
2171d583b39bSJohn Wren Kennedy}
2172d583b39bSJohn Wren Kennedy
2173d583b39bSJohn Wren Kennedy#
2174d583b39bSJohn Wren Kennedy# Get configuration of pool
2175d583b39bSJohn Wren Kennedy# $1 pool name
2176d583b39bSJohn Wren Kennedy# $2 config name
2177d583b39bSJohn Wren Kennedy#
2178d583b39bSJohn Wren Kennedyfunction get_config
2179d583b39bSJohn Wren Kennedy{
2180d583b39bSJohn Wren Kennedy	typeset pool=$1
2181d583b39bSJohn Wren Kennedy	typeset config=$2
2182d583b39bSJohn Wren Kennedy	typeset alt_root
2183d583b39bSJohn Wren Kennedy
2184d583b39bSJohn Wren Kennedy	if ! poolexists "$pool" ; then
2185d583b39bSJohn Wren Kennedy		return 1
2186d583b39bSJohn Wren Kennedy	fi
2187d583b39bSJohn Wren Kennedy	alt_root=$($ZPOOL list -H $pool | $AWK '{print $NF}')
2188d583b39bSJohn Wren Kennedy	if [[ $alt_root == "-" ]]; then
2189d583b39bSJohn Wren Kennedy		value=$($ZDB -C $pool | $GREP "$config:" | $AWK -F: \
2190d583b39bSJohn Wren Kennedy		    '{print $2}')
2191d583b39bSJohn Wren Kennedy	else
2192d583b39bSJohn Wren Kennedy		value=$($ZDB -e $pool | $GREP "$config:" | $AWK -F: \
2193d583b39bSJohn Wren Kennedy		    '{print $2}')
2194d583b39bSJohn Wren Kennedy	fi
2195d583b39bSJohn Wren Kennedy	if [[ -n $value ]] ; then
2196d583b39bSJohn Wren Kennedy		value=${value#'}
2197d583b39bSJohn Wren Kennedy		value=${value%'}
2198d583b39bSJohn Wren Kennedy	fi
2199d583b39bSJohn Wren Kennedy	echo $value
2200d583b39bSJohn Wren Kennedy
2201d583b39bSJohn Wren Kennedy	return 0
2202d583b39bSJohn Wren Kennedy}
2203d583b39bSJohn Wren Kennedy
2204d583b39bSJohn Wren Kennedy#
2205d583b39bSJohn Wren Kennedy# Privated function. Random select one of items from arguments.
2206d583b39bSJohn Wren Kennedy#
2207d583b39bSJohn Wren Kennedy# $1 count
2208d583b39bSJohn Wren Kennedy# $2-n string
2209d583b39bSJohn Wren Kennedy#
2210d583b39bSJohn Wren Kennedyfunction _random_get
2211d583b39bSJohn Wren Kennedy{
2212d583b39bSJohn Wren Kennedy	typeset cnt=$1
2213d583b39bSJohn Wren Kennedy	shift
2214d583b39bSJohn Wren Kennedy
2215d583b39bSJohn Wren Kennedy	typeset str="$@"
2216d583b39bSJohn Wren Kennedy	typeset -i ind
2217d583b39bSJohn Wren Kennedy	((ind = RANDOM % cnt + 1))
2218d583b39bSJohn Wren Kennedy
2219d583b39bSJohn Wren Kennedy	typeset ret=$($ECHO "$str" | $CUT -f $ind -d ' ')
2220d583b39bSJohn Wren Kennedy	$ECHO $ret
2221d583b39bSJohn Wren Kennedy}
2222d583b39bSJohn Wren Kennedy
2223d583b39bSJohn Wren Kennedy#
2224d583b39bSJohn Wren Kennedy# Random select one of item from arguments which include NONE string
2225d583b39bSJohn Wren Kennedy#
2226d583b39bSJohn Wren Kennedyfunction random_get_with_non
2227d583b39bSJohn Wren Kennedy{
2228d583b39bSJohn Wren Kennedy	typeset -i cnt=$#
2229d583b39bSJohn Wren Kennedy	((cnt =+ 1))
2230d583b39bSJohn Wren Kennedy
2231d583b39bSJohn Wren Kennedy	_random_get "$cnt" "$@"
2232d583b39bSJohn Wren Kennedy}
2233d583b39bSJohn Wren Kennedy
2234d583b39bSJohn Wren Kennedy#
2235d583b39bSJohn Wren Kennedy# Random select one of item from arguments which doesn't include NONE string
2236d583b39bSJohn Wren Kennedy#
2237d583b39bSJohn Wren Kennedyfunction random_get
2238d583b39bSJohn Wren Kennedy{
2239d583b39bSJohn Wren Kennedy	_random_get "$#" "$@"
2240d583b39bSJohn Wren Kennedy}
2241d583b39bSJohn Wren Kennedy
2242d583b39bSJohn Wren Kennedy#
2243d583b39bSJohn Wren Kennedy# Detect if the current system support slog
2244d583b39bSJohn Wren Kennedy#
2245d583b39bSJohn Wren Kennedyfunction verify_slog_support
2246d583b39bSJohn Wren Kennedy{
2247d583b39bSJohn Wren Kennedy	typeset dir=/tmp/disk.$$
2248d583b39bSJohn Wren Kennedy	typeset pool=foo.$$
2249d583b39bSJohn Wren Kennedy	typeset vdev=$dir/a
2250d583b39bSJohn Wren Kennedy	typeset sdev=$dir/b
2251d583b39bSJohn Wren Kennedy
2252d583b39bSJohn Wren Kennedy	$MKDIR -p $dir
2253d583b39bSJohn Wren Kennedy	$MKFILE 64M $vdev $sdev
2254d583b39bSJohn Wren Kennedy
2255d583b39bSJohn Wren Kennedy	typeset -i ret=0
2256d583b39bSJohn Wren Kennedy	if ! $ZPOOL create -n $pool $vdev log $sdev > /dev/null 2>&1; then
2257d583b39bSJohn Wren Kennedy		ret=1
2258d583b39bSJohn Wren Kennedy	fi
2259d583b39bSJohn Wren Kennedy	$RM -r $dir
2260d583b39bSJohn Wren Kennedy
2261d583b39bSJohn Wren Kennedy	return $ret
2262d583b39bSJohn Wren Kennedy}
2263d583b39bSJohn Wren Kennedy
2264d583b39bSJohn Wren Kennedy#
2265d583b39bSJohn Wren Kennedy# The function will generate a dataset name with specific length
2266d583b39bSJohn Wren Kennedy# $1, the length of the name
2267d583b39bSJohn Wren Kennedy# $2, the base string to construct the name
2268d583b39bSJohn Wren Kennedy#
2269d583b39bSJohn Wren Kennedyfunction gen_dataset_name
2270d583b39bSJohn Wren Kennedy{
2271d583b39bSJohn Wren Kennedy	typeset -i len=$1
2272d583b39bSJohn Wren Kennedy	typeset basestr="$2"
2273d583b39bSJohn Wren Kennedy	typeset -i baselen=${#basestr}
2274d583b39bSJohn Wren Kennedy	typeset -i iter=0
2275d583b39bSJohn Wren Kennedy	typeset l_name=""
2276d583b39bSJohn Wren Kennedy
2277d583b39bSJohn Wren Kennedy	if ((len % baselen == 0)); then
2278d583b39bSJohn Wren Kennedy		((iter = len / baselen))
2279d583b39bSJohn Wren Kennedy	else
2280d583b39bSJohn Wren Kennedy		((iter = len / baselen + 1))
2281d583b39bSJohn Wren Kennedy	fi
2282d583b39bSJohn Wren Kennedy	while ((iter > 0)); do
2283d583b39bSJohn Wren Kennedy		l_name="${l_name}$basestr"
2284d583b39bSJohn Wren Kennedy
2285d583b39bSJohn Wren Kennedy		((iter -= 1))
2286d583b39bSJohn Wren Kennedy	done
2287d583b39bSJohn Wren Kennedy
2288d583b39bSJohn Wren Kennedy	$ECHO $l_name
2289d583b39bSJohn Wren Kennedy}
2290d583b39bSJohn Wren Kennedy
2291d583b39bSJohn Wren Kennedy#
2292d583b39bSJohn Wren Kennedy# Get cksum tuple of dataset
2293d583b39bSJohn Wren Kennedy# $1 dataset name
2294d583b39bSJohn Wren Kennedy#
2295d583b39bSJohn Wren Kennedy# sample zdb output:
2296d583b39bSJohn Wren Kennedy# Dataset data/test [ZPL], ID 355, cr_txg 2413856, 31.0K, 7 objects, rootbp
2297d583b39bSJohn Wren Kennedy# DVA[0]=<0:803046400:200> DVA[1]=<0:81199000:200> [L0 DMU objset] fletcher4
2298d583b39bSJohn Wren Kennedy# lzjb LE contiguous unique double size=800L/200P birth=2413856L/2413856P
2299d583b39bSJohn Wren Kennedy# fill=7 cksum=11ce125712:643a9c18ee2:125e25238fca0:254a3f74b59744
2300d583b39bSJohn Wren Kennedyfunction datasetcksum
2301d583b39bSJohn Wren Kennedy{
2302d583b39bSJohn Wren Kennedy	typeset cksum
2303d583b39bSJohn Wren Kennedy	$SYNC
2304d583b39bSJohn Wren Kennedy	cksum=$($ZDB -vvv $1 | $GREP "^Dataset $1 \[" | $GREP "cksum" \
2305d583b39bSJohn Wren Kennedy		| $AWK -F= '{print $7}')
2306d583b39bSJohn Wren Kennedy	$ECHO $cksum
2307d583b39bSJohn Wren Kennedy}
2308d583b39bSJohn Wren Kennedy
2309d583b39bSJohn Wren Kennedy#
2310d583b39bSJohn Wren Kennedy# Get cksum of file
2311d583b39bSJohn Wren Kennedy# #1 file path
2312d583b39bSJohn Wren Kennedy#
2313d583b39bSJohn Wren Kennedyfunction checksum
2314d583b39bSJohn Wren Kennedy{
2315d583b39bSJohn Wren Kennedy	typeset cksum
2316d583b39bSJohn Wren Kennedy	cksum=$($CKSUM $1 | $AWK '{print $1}')
2317d583b39bSJohn Wren Kennedy	$ECHO $cksum
2318d583b39bSJohn Wren Kennedy}
2319d583b39bSJohn Wren Kennedy
2320d583b39bSJohn Wren Kennedy#
2321d583b39bSJohn Wren Kennedy# Get the given disk/slice state from the specific field of the pool
2322d583b39bSJohn Wren Kennedy#
2323d583b39bSJohn Wren Kennedyfunction get_device_state #pool disk field("", "spares","logs")
2324d583b39bSJohn Wren Kennedy{
2325d583b39bSJohn Wren Kennedy	typeset pool=$1
2326d583b39bSJohn Wren Kennedy	typeset disk=${2#/dev/dsk/}
2327d583b39bSJohn Wren Kennedy	typeset field=${3:-$pool}
2328d583b39bSJohn Wren Kennedy
2329d583b39bSJohn Wren Kennedy	state=$($ZPOOL status -v "$pool" 2>/dev/null | \
2330d583b39bSJohn Wren Kennedy		$NAWK -v device=$disk -v pool=$pool -v field=$field \
2331d583b39bSJohn Wren Kennedy		'BEGIN {startconfig=0; startfield=0; }
2332d583b39bSJohn Wren Kennedy		/config:/ {startconfig=1}
2333d583b39bSJohn Wren Kennedy		(startconfig==1) && ($1==field) {startfield=1; next;}
2334d583b39bSJohn Wren Kennedy		(startfield==1) && ($1==device) {print $2; exit;}
2335d583b39bSJohn Wren Kennedy		(startfield==1) &&
2336d583b39bSJohn Wren Kennedy		($1==field || $1 ~ "^spares$" || $1 ~ "^logs$") {startfield=0}')
2337d583b39bSJohn Wren Kennedy	echo $state
2338d583b39bSJohn Wren Kennedy}
2339d583b39bSJohn Wren Kennedy
2340d583b39bSJohn Wren Kennedy
2341d583b39bSJohn Wren Kennedy#
2342d583b39bSJohn Wren Kennedy# print the given directory filesystem type
2343d583b39bSJohn Wren Kennedy#
2344d583b39bSJohn Wren Kennedy# $1 directory name
2345d583b39bSJohn Wren Kennedy#
2346d583b39bSJohn Wren Kennedyfunction get_fstype
2347d583b39bSJohn Wren Kennedy{
2348d583b39bSJohn Wren Kennedy	typeset dir=$1
2349d583b39bSJohn Wren Kennedy
2350d583b39bSJohn Wren Kennedy	if [[ -z $dir ]]; then
2351d583b39bSJohn Wren Kennedy		log_fail "Usage: get_fstype <directory>"
2352d583b39bSJohn Wren Kennedy	fi
2353d583b39bSJohn Wren Kennedy
2354d583b39bSJohn Wren Kennedy	#
2355d583b39bSJohn Wren Kennedy	#  $ df -n /
2356d583b39bSJohn Wren Kennedy	#  /		  : ufs
2357d583b39bSJohn Wren Kennedy	#
2358d583b39bSJohn Wren Kennedy	$DF -n $dir | $AWK '{print $3}'
2359d583b39bSJohn Wren Kennedy}
2360d583b39bSJohn Wren Kennedy
2361d583b39bSJohn Wren Kennedy#
2362d583b39bSJohn Wren Kennedy# Given a disk, label it to VTOC regardless what label was on the disk
2363d583b39bSJohn Wren Kennedy# $1 disk
2364d583b39bSJohn Wren Kennedy#
2365d583b39bSJohn Wren Kennedyfunction labelvtoc
2366d583b39bSJohn Wren Kennedy{
2367d583b39bSJohn Wren Kennedy	typeset disk=$1
2368d583b39bSJohn Wren Kennedy	if [[ -z $disk ]]; then
2369d583b39bSJohn Wren Kennedy		log_fail "The disk name is unspecified."
2370d583b39bSJohn Wren Kennedy	fi
2371d583b39bSJohn Wren Kennedy	typeset label_file=/var/tmp/labelvtoc.$$
2372d583b39bSJohn Wren Kennedy	typeset arch=$($UNAME -p)
2373d583b39bSJohn Wren Kennedy
2374d583b39bSJohn Wren Kennedy	if [[ $arch == "i386" ]]; then
2375d583b39bSJohn Wren Kennedy		$ECHO "label" > $label_file
2376d583b39bSJohn Wren Kennedy		$ECHO "0" >> $label_file
2377d583b39bSJohn Wren Kennedy		$ECHO "" >> $label_file
2378d583b39bSJohn Wren Kennedy		$ECHO "q" >> $label_file
2379d583b39bSJohn Wren Kennedy		$ECHO "q" >> $label_file
2380d583b39bSJohn Wren Kennedy
2381d583b39bSJohn Wren Kennedy		$FDISK -B $disk >/dev/null 2>&1
2382d583b39bSJohn Wren Kennedy		# wait a while for fdisk finishes
2383d583b39bSJohn Wren Kennedy		$SLEEP 60
2384d583b39bSJohn Wren Kennedy	elif [[ $arch == "sparc" ]]; then
2385d583b39bSJohn Wren Kennedy		$ECHO "label" > $label_file
2386d583b39bSJohn Wren Kennedy		$ECHO "0" >> $label_file
2387d583b39bSJohn Wren Kennedy		$ECHO "" >> $label_file
2388d583b39bSJohn Wren Kennedy		$ECHO "" >> $label_file
2389d583b39bSJohn Wren Kennedy		$ECHO "" >> $label_file
2390d583b39bSJohn Wren Kennedy		$ECHO "q" >> $label_file
2391d583b39bSJohn Wren Kennedy	else
2392d583b39bSJohn Wren Kennedy		log_fail "unknown arch type"
2393d583b39bSJohn Wren Kennedy	fi
2394d583b39bSJohn Wren Kennedy
2395d583b39bSJohn Wren Kennedy	$FORMAT -e -s -d $disk -f $label_file
2396d583b39bSJohn Wren Kennedy	typeset -i ret_val=$?
2397d583b39bSJohn Wren Kennedy	$RM -f $label_file
2398d583b39bSJohn Wren Kennedy	#
2399d583b39bSJohn Wren Kennedy	# wait the format to finish
2400d583b39bSJohn Wren Kennedy	#
2401d583b39bSJohn Wren Kennedy	$SLEEP 60
2402d583b39bSJohn Wren Kennedy	if ((ret_val != 0)); then
2403d583b39bSJohn Wren Kennedy		log_fail "unable to label $disk as VTOC."
2404d583b39bSJohn Wren Kennedy	fi
2405d583b39bSJohn Wren Kennedy
2406d583b39bSJohn Wren Kennedy	return 0
2407d583b39bSJohn Wren Kennedy}
2408d583b39bSJohn Wren Kennedy
2409d583b39bSJohn Wren Kennedy#
2410d583b39bSJohn Wren Kennedy# check if the system was installed as zfsroot or not
2411d583b39bSJohn Wren Kennedy# return: 0 ture, otherwise false
2412d583b39bSJohn Wren Kennedy#
2413d583b39bSJohn Wren Kennedyfunction is_zfsroot
2414d583b39bSJohn Wren Kennedy{
2415d583b39bSJohn Wren Kennedy	$DF -n / | $GREP zfs > /dev/null 2>&1
2416d583b39bSJohn Wren Kennedy	return $?
2417d583b39bSJohn Wren Kennedy}
2418d583b39bSJohn Wren Kennedy
2419d583b39bSJohn Wren Kennedy#
2420d583b39bSJohn Wren Kennedy# get the root filesystem name if it's zfsroot system.
2421d583b39bSJohn Wren Kennedy#
2422d583b39bSJohn Wren Kennedy# return: root filesystem name
2423d583b39bSJohn Wren Kennedyfunction get_rootfs
2424d583b39bSJohn Wren Kennedy{
2425d583b39bSJohn Wren Kennedy	typeset rootfs=""
2426d583b39bSJohn Wren Kennedy	rootfs=$($AWK '{if ($2 == "/" && $3 == "zfs") print $1}' \
2427d583b39bSJohn Wren Kennedy		/etc/mnttab)
2428d583b39bSJohn Wren Kennedy	if [[ -z "$rootfs" ]]; then
2429d583b39bSJohn Wren Kennedy		log_fail "Can not get rootfs"
2430d583b39bSJohn Wren Kennedy	fi
2431d583b39bSJohn Wren Kennedy	$ZFS list $rootfs > /dev/null 2>&1
2432d583b39bSJohn Wren Kennedy	if (($? == 0)); then
2433d583b39bSJohn Wren Kennedy		$ECHO $rootfs
2434d583b39bSJohn Wren Kennedy	else
2435d583b39bSJohn Wren Kennedy		log_fail "This is not a zfsroot system."
2436d583b39bSJohn Wren Kennedy	fi
2437d583b39bSJohn Wren Kennedy}
2438d583b39bSJohn Wren Kennedy
2439d583b39bSJohn Wren Kennedy#
2440d583b39bSJohn Wren Kennedy# get the rootfs's pool name
2441d583b39bSJohn Wren Kennedy# return:
2442d583b39bSJohn Wren Kennedy#       rootpool name
2443d583b39bSJohn Wren Kennedy#
2444d583b39bSJohn Wren Kennedyfunction get_rootpool
2445d583b39bSJohn Wren Kennedy{
2446d583b39bSJohn Wren Kennedy	typeset rootfs=""
2447d583b39bSJohn Wren Kennedy	typeset rootpool=""
2448d583b39bSJohn Wren Kennedy	rootfs=$($AWK '{if ($2 == "/" && $3 =="zfs") print $1}' \
2449d583b39bSJohn Wren Kennedy		 /etc/mnttab)
2450d583b39bSJohn Wren Kennedy	if [[ -z "$rootfs" ]]; then
2451d583b39bSJohn Wren Kennedy		log_fail "Can not get rootpool"
2452d583b39bSJohn Wren Kennedy	fi
2453d583b39bSJohn Wren Kennedy	$ZFS list $rootfs > /dev/null 2>&1
2454d583b39bSJohn Wren Kennedy	if (($? == 0)); then
2455d583b39bSJohn Wren Kennedy		rootpool=`$ECHO $rootfs | awk -F\/ '{print $1}'`
2456d583b39bSJohn Wren Kennedy		$ECHO $rootpool
2457d583b39bSJohn Wren Kennedy	else
2458d583b39bSJohn Wren Kennedy		log_fail "This is not a zfsroot system."
2459d583b39bSJohn Wren Kennedy	fi
2460d583b39bSJohn Wren Kennedy}
2461d583b39bSJohn Wren Kennedy
2462d583b39bSJohn Wren Kennedy#
2463d583b39bSJohn Wren Kennedy# Get the sub string from specified source string
2464d583b39bSJohn Wren Kennedy#
2465d583b39bSJohn Wren Kennedy# $1 source string
2466d583b39bSJohn Wren Kennedy# $2 start position. Count from 1
2467d583b39bSJohn Wren Kennedy# $3 offset
2468d583b39bSJohn Wren Kennedy#
2469d583b39bSJohn Wren Kennedyfunction get_substr #src_str pos offset
2470d583b39bSJohn Wren Kennedy{
2471d583b39bSJohn Wren Kennedy	typeset pos offset
2472d583b39bSJohn Wren Kennedy
2473d583b39bSJohn Wren Kennedy	$ECHO $1 | \
2474d583b39bSJohn Wren Kennedy		$NAWK -v pos=$2 -v offset=$3 '{print substr($0, pos, offset)}'
2475d583b39bSJohn Wren Kennedy}
2476d583b39bSJohn Wren Kennedy
2477d583b39bSJohn Wren Kennedy#
2478d583b39bSJohn Wren Kennedy# Check if the given device is physical device
2479d583b39bSJohn Wren Kennedy#
2480d583b39bSJohn Wren Kennedyfunction is_physical_device #device
2481d583b39bSJohn Wren Kennedy{
2482d583b39bSJohn Wren Kennedy	typeset device=${1#/dev/dsk/}
2483d583b39bSJohn Wren Kennedy	device=${device#/dev/rdsk/}
2484d583b39bSJohn Wren Kennedy
2485d583b39bSJohn Wren Kennedy	$ECHO $device | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1
2486d583b39bSJohn Wren Kennedy	return $?
2487d583b39bSJohn Wren Kennedy}
2488d583b39bSJohn Wren Kennedy
2489d583b39bSJohn Wren Kennedy#
2490d583b39bSJohn Wren Kennedy# Get the directory path of given device
2491d583b39bSJohn Wren Kennedy#
2492d583b39bSJohn Wren Kennedyfunction get_device_dir #device
2493d583b39bSJohn Wren Kennedy{
2494d583b39bSJohn Wren Kennedy	typeset device=$1
2495d583b39bSJohn Wren Kennedy
2496d583b39bSJohn Wren Kennedy	if ! $(is_physical_device $device) ; then
2497d583b39bSJohn Wren Kennedy		if [[ $device != "/" ]]; then
2498d583b39bSJohn Wren Kennedy			device=${device%/*}
2499d583b39bSJohn Wren Kennedy		fi
2500d583b39bSJohn Wren Kennedy		$ECHO $device
2501d583b39bSJohn Wren Kennedy	else
2502d583b39bSJohn Wren Kennedy		$ECHO "/dev/dsk"
2503d583b39bSJohn Wren Kennedy	fi
2504d583b39bSJohn Wren Kennedy}
2505d583b39bSJohn Wren Kennedy
2506d583b39bSJohn Wren Kennedy#
2507d583b39bSJohn Wren Kennedy# Get the package name
2508d583b39bSJohn Wren Kennedy#
2509d583b39bSJohn Wren Kennedyfunction get_package_name
2510d583b39bSJohn Wren Kennedy{
2511d583b39bSJohn Wren Kennedy	typeset dirpath=${1:-$STC_NAME}
2512d583b39bSJohn Wren Kennedy
2513d583b39bSJohn Wren Kennedy	echo "SUNWstc-${dirpath}" | /usr/bin/sed -e "s/\//-/g"
2514d583b39bSJohn Wren Kennedy}
2515d583b39bSJohn Wren Kennedy
2516d583b39bSJohn Wren Kennedy#
2517d583b39bSJohn Wren Kennedy# Get the word numbers from a string separated by white space
2518d583b39bSJohn Wren Kennedy#
2519d583b39bSJohn Wren Kennedyfunction get_word_count
2520d583b39bSJohn Wren Kennedy{
2521d583b39bSJohn Wren Kennedy	$ECHO $1 | $WC -w
2522d583b39bSJohn Wren Kennedy}
2523d583b39bSJohn Wren Kennedy
2524d583b39bSJohn Wren Kennedy#
2525d583b39bSJohn Wren Kennedy# To verify if the require numbers of disks is given
2526d583b39bSJohn Wren Kennedy#
2527d583b39bSJohn Wren Kennedyfunction verify_disk_count
2528d583b39bSJohn Wren Kennedy{
2529d583b39bSJohn Wren Kennedy	typeset -i min=${2:-1}
2530d583b39bSJohn Wren Kennedy
2531d583b39bSJohn Wren Kennedy	typeset -i count=$(get_word_count "$1")
2532d583b39bSJohn Wren Kennedy
2533d583b39bSJohn Wren Kennedy	if ((count < min)); then
2534d583b39bSJohn Wren Kennedy		log_untested "A minimum of $min disks is required to run." \
2535d583b39bSJohn Wren Kennedy			" You specified $count disk(s)"
2536d583b39bSJohn Wren Kennedy	fi
2537d583b39bSJohn Wren Kennedy}
2538d583b39bSJohn Wren Kennedy
2539d583b39bSJohn Wren Kennedyfunction ds_is_volume
2540d583b39bSJohn Wren Kennedy{
2541d583b39bSJohn Wren Kennedy	typeset type=$(get_prop type $1)
2542d583b39bSJohn Wren Kennedy	[[ $type = "volume" ]] && return 0
2543d583b39bSJohn Wren Kennedy	return 1
2544d583b39bSJohn Wren Kennedy}
2545d583b39bSJohn Wren Kennedy
2546d583b39bSJohn Wren Kennedyfunction ds_is_filesystem
2547d583b39bSJohn Wren Kennedy{
2548d583b39bSJohn Wren Kennedy	typeset type=$(get_prop type $1)
2549d583b39bSJohn Wren Kennedy	[[ $type = "filesystem" ]] && return 0
2550d583b39bSJohn Wren Kennedy	return 1
2551d583b39bSJohn Wren Kennedy}
2552d583b39bSJohn Wren Kennedy
2553d583b39bSJohn Wren Kennedyfunction ds_is_snapshot
2554d583b39bSJohn Wren Kennedy{
2555d583b39bSJohn Wren Kennedy	typeset type=$(get_prop type $1)
2556d583b39bSJohn Wren Kennedy	[[ $type = "snapshot" ]] && return 0
2557d583b39bSJohn Wren Kennedy	return 1
2558d583b39bSJohn Wren Kennedy}
2559d583b39bSJohn Wren Kennedy
2560d583b39bSJohn Wren Kennedy#
2561d583b39bSJohn Wren Kennedy# Check if Trusted Extensions are installed and enabled
2562d583b39bSJohn Wren Kennedy#
2563d583b39bSJohn Wren Kennedyfunction is_te_enabled
2564d583b39bSJohn Wren Kennedy{
2565d583b39bSJohn Wren Kennedy	$SVCS -H -o state labeld 2>/dev/null | $GREP "enabled"
2566d583b39bSJohn Wren Kennedy	if (($? != 0)); then
2567d583b39bSJohn Wren Kennedy		return 1
2568d583b39bSJohn Wren Kennedy	else
2569d583b39bSJohn Wren Kennedy		return 0
2570d583b39bSJohn Wren Kennedy	fi
2571d583b39bSJohn Wren Kennedy}
2572f38cb554SJohn Wren Kennedy
2573f38cb554SJohn Wren Kennedy# Utility function to determine if a system has multiple cpus.
2574f38cb554SJohn Wren Kennedyfunction is_mp
2575f38cb554SJohn Wren Kennedy{
2576*52244c09SJohn Wren Kennedy	(($($PSRINFO | $WC -l) > 1))
2577f38cb554SJohn Wren Kennedy}
2578f38cb554SJohn Wren Kennedy
2579f38cb554SJohn Wren Kennedy# Run the given command as the user provided.
2580f38cb554SJohn Wren Kennedyfunction user_run
2581f38cb554SJohn Wren Kennedy{
2582f38cb554SJohn Wren Kennedy	typeset user=$1
2583f38cb554SJohn Wren Kennedy	shift
2584f38cb554SJohn Wren Kennedy
2585f38cb554SJohn Wren Kennedy	eval \$SU \$user -c \"$@\" > /tmp/out 2>/tmp/err
2586f38cb554SJohn Wren Kennedy	return $?
2587f38cb554SJohn Wren Kennedy}
2588*52244c09SJohn Wren Kennedy
2589*52244c09SJohn Wren Kennedy#
2590*52244c09SJohn Wren Kennedy# Check if the pool contains the specified vdevs
2591*52244c09SJohn Wren Kennedy#
2592*52244c09SJohn Wren Kennedy# $1 pool
2593*52244c09SJohn Wren Kennedy# $2..n <vdev> ...
2594*52244c09SJohn Wren Kennedy#
2595*52244c09SJohn Wren Kennedy# Return 0 if the vdevs are contained in the pool, 1 if any of the specified
2596*52244c09SJohn Wren Kennedy# vdevs is not in the pool, and 2 if pool name is missing.
2597*52244c09SJohn Wren Kennedy#
2598*52244c09SJohn Wren Kennedyfunction vdevs_in_pool
2599*52244c09SJohn Wren Kennedy{
2600*52244c09SJohn Wren Kennedy	typeset pool=$1
2601*52244c09SJohn Wren Kennedy	typeset vdev
2602*52244c09SJohn Wren Kennedy
2603*52244c09SJohn Wren Kennedy        if [[ -z $pool ]]; then
2604*52244c09SJohn Wren Kennedy                log_note "Missing pool name."
2605*52244c09SJohn Wren Kennedy                return 2
2606*52244c09SJohn Wren Kennedy        fi
2607*52244c09SJohn Wren Kennedy
2608*52244c09SJohn Wren Kennedy	shift
2609*52244c09SJohn Wren Kennedy
2610*52244c09SJohn Wren Kennedy	typeset tmpfile=$($MKTEMP)
2611*52244c09SJohn Wren Kennedy	$ZPOOL list -Hv "$pool" >$tmpfile
2612*52244c09SJohn Wren Kennedy	for vdev in $@; do
2613*52244c09SJohn Wren Kennedy		$GREP -w ${vdev##*/} $tmpfile >/dev/null 2>&1
2614*52244c09SJohn Wren Kennedy		[[ $? -ne 0 ]] && return 1
2615*52244c09SJohn Wren Kennedy	done
2616*52244c09SJohn Wren Kennedy
2617*52244c09SJohn Wren Kennedy	$RM -f $tmpfile
2618*52244c09SJohn Wren Kennedy
2619*52244c09SJohn Wren Kennedy	return 0;
2620*52244c09SJohn Wren Kennedy}
2621