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