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 2008 Sun Microsystems, Inc.  All rights reserved.
24d583b39bSJohn Wren Kennedy# Use is subject to license terms.
25d583b39bSJohn Wren Kennedy#
26d583b39bSJohn Wren Kennedy
27d583b39bSJohn Wren Kennedy#
281d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
29d583b39bSJohn Wren Kennedy#
30d583b39bSJohn Wren Kennedy
31d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
32d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg
33d583b39bSJohn Wren Kennedy
34d583b39bSJohn Wren Kennedy# Get file sum
35d583b39bSJohn Wren Kennedy#
36d583b39bSJohn Wren Kennedy# $1 full file name
37d583b39bSJohn Wren Kennedyfunction getsum #fname
38d583b39bSJohn Wren Kennedy{
39d583b39bSJohn Wren Kennedy	(( ${#1} == 0 )) && \
40d583b39bSJohn Wren Kennedy		log_fail "Need give file name."
411d32ba66SJohn Wren Kennedy	return $(sum $1 | awk '{print $1}')
42d583b39bSJohn Wren Kennedy}
43d583b39bSJohn Wren Kennedy
44d583b39bSJohn Wren Kennedy# Define global variable checksum, get the original file sum.
45d583b39bSJohn Wren Kennedy#
46d583b39bSJohn Wren Kennedyorigsum=$(getsum /etc/passwd)
47d583b39bSJohn Wren Kennedy
48d583b39bSJohn Wren Kennedy#
49d583b39bSJohn Wren Kennedy# Setup or recover the test environment. Firstly, copy /etc/passwd to ZFS file
50d583b39bSJohn Wren Kennedy# system or volume, then make a snapshot or clone. Repeat up to three times.
51d583b39bSJohn Wren Kennedy#
52d583b39bSJohn Wren Kennedy# $1 number of snapshot. Note: Currently only support three snapshots.
53d583b39bSJohn Wren Kennedy# $2 indicate if it is necessary to create clone
54d583b39bSJohn Wren Kennedy#
55d583b39bSJohn Wren Kennedyfunction setup_snap_env
56d583b39bSJohn Wren Kennedy{
57d583b39bSJohn Wren Kennedy	typeset -i cnt=${1:-3}
58d583b39bSJohn Wren Kennedy	typeset createclone=${2:-"false"}
59d583b39bSJohn Wren Kennedy
60d583b39bSJohn Wren Kennedy	if datasetnonexists $FS; then
611d32ba66SJohn Wren Kennedy		log_must zfs create $FS
621d32ba66SJohn Wren Kennedy		log_must zfs set mountpoint=$TESTDIR $FS
63d583b39bSJohn Wren Kennedy	fi
64d583b39bSJohn Wren Kennedy	# Volume can't be created in Local Zone.
65d583b39bSJohn Wren Kennedy	if datasetnonexists $VOL && is_global_zone; then
661d32ba66SJohn Wren Kennedy		log_must zfs create -V $VOLSIZE $VOL
67d583b39bSJohn Wren Kennedy	fi
68d583b39bSJohn Wren Kennedy
69d583b39bSJohn Wren Kennedy	# Make sure $VOL is volume
70d583b39bSJohn Wren Kennedy	typeset type=$(get_prop type $VOL)
71d583b39bSJohn Wren Kennedy	if datasetexists $VOL && \
72d583b39bSJohn Wren Kennedy		[[ $type == 'volume' ]]; then
73d583b39bSJohn Wren Kennedy		#
74d583b39bSJohn Wren Kennedy		# At the first time, Make a UFS file system in volume and
75d583b39bSJohn Wren Kennedy		# mount it. Otherwise, only check if this ufs file system
76d583b39bSJohn Wren Kennedy		# was mounted.
77d583b39bSJohn Wren Kennedy		#
781d32ba66SJohn Wren Kennedy		log_must eval "echo "y" | \
791d32ba66SJohn Wren Kennedy			newfs -v /dev/zvol/dsk/$VOL > /dev/null 2>&1"
80d583b39bSJohn Wren Kennedy
811d32ba66SJohn Wren Kennedy		[[ ! -d $TESTDIR1 ]] && log_must mkdir $TESTDIR1
82d583b39bSJohn Wren Kennedy
83d583b39bSJohn Wren Kennedy		# Make sure the ufs filesystem hasn't been mounted,
84d583b39bSJohn Wren Kennedy		# then mount the new ufs filesystem.
851d32ba66SJohn Wren Kennedy		df -lhF ufs "/dev/zvol/dsk/$VOL" > /dev/null 2>&1
86d583b39bSJohn Wren Kennedy		if (( $? != 0 )); then
871d32ba66SJohn Wren Kennedy			log_must mount \
88d583b39bSJohn Wren Kennedy				/dev/zvol/dsk/$TESTPOOL/$TESTVOL $TESTDIR1
89d583b39bSJohn Wren Kennedy		fi
90d583b39bSJohn Wren Kennedy	fi
91d583b39bSJohn Wren Kennedy
92d583b39bSJohn Wren Kennedy	# Separately Create three snapshots for file system & volume
93d583b39bSJohn Wren Kennedy	typeset -i ind=0
94d583b39bSJohn Wren Kennedy	typeset dtst
95d583b39bSJohn Wren Kennedy	for dtst in $FS $VOL; do
96d583b39bSJohn Wren Kennedy		# Volume can be created in Local Zone.
97d583b39bSJohn Wren Kennedy		if [[ $dtst == $VOL ]]; then
98d583b39bSJohn Wren Kennedy			if ! is_global_zone; then
99d583b39bSJohn Wren Kennedy				break
100d583b39bSJohn Wren Kennedy			fi
101d583b39bSJohn Wren Kennedy		fi
102d583b39bSJohn Wren Kennedy
103d583b39bSJohn Wren Kennedy		ind=0
104d583b39bSJohn Wren Kennedy		while (( ind < cnt )); do
105d583b39bSJohn Wren Kennedy			case $dtst in
106d583b39bSJohn Wren Kennedy			$FS)
107d583b39bSJohn Wren Kennedy				eval typeset snap=\$FSSNAP$ind
108d583b39bSJohn Wren Kennedy				eval typeset clone=\$FSCLONE$ind
109d583b39bSJohn Wren Kennedy				eval typeset fname=\$TESTDIR/\$TESTFILE$ind
110d583b39bSJohn Wren Kennedy				;;
111d583b39bSJohn Wren Kennedy			$VOL)
112d583b39bSJohn Wren Kennedy				eval typeset snap=\$VOLSNAP$ind
113d583b39bSJohn Wren Kennedy				eval typeset clone=\$VOLCLONE$ind
114d583b39bSJohn Wren Kennedy				eval typeset fname=\$TESTDIR1/\$TESTFILE$ind
115d583b39bSJohn Wren Kennedy				;;
116d583b39bSJohn Wren Kennedy			esac
117d583b39bSJohn Wren Kennedy
118d583b39bSJohn Wren Kennedy			if datasetnonexists $snap; then
1191d32ba66SJohn Wren Kennedy				log_must cp /etc/passwd $fname
120d583b39bSJohn Wren Kennedy				#
121d583b39bSJohn Wren Kennedy				# using 'lockfs -f' to flush the writes to disk
122d583b39bSJohn Wren Kennedy				# before taking a snapshot.
123d583b39bSJohn Wren Kennedy				#
124d583b39bSJohn Wren Kennedy				if [[ $dtst == $VOL ]]; then
125*f5fb56deSJohn Wren Kennedy					log_must lockfs -f $TESTDIR1
126d583b39bSJohn Wren Kennedy				fi
1271d32ba66SJohn Wren Kennedy				log_must zfs snapshot $snap
128d583b39bSJohn Wren Kennedy			fi
129d583b39bSJohn Wren Kennedy			if [[ $createclone == "true" ]]; then
130d583b39bSJohn Wren Kennedy				if datasetnonexists $clone; then
1311d32ba66SJohn Wren Kennedy					log_must zfs clone $snap $clone
132d583b39bSJohn Wren Kennedy				fi
133d583b39bSJohn Wren Kennedy			fi
134d583b39bSJohn Wren Kennedy			(( ind += 1 ))
135d583b39bSJohn Wren Kennedy		done
136d583b39bSJohn Wren Kennedy	done
137d583b39bSJohn Wren Kennedy}
138d583b39bSJohn Wren Kennedy
139d583b39bSJohn Wren Kennedyfunction setup_clone_env
140d583b39bSJohn Wren Kennedy{
141d583b39bSJohn Wren Kennedy	setup_snap_env $1 "true"
142d583b39bSJohn Wren Kennedy}
143d583b39bSJohn Wren Kennedy
144d583b39bSJohn Wren Kennedy#
145d583b39bSJohn Wren Kennedy# Clean up the test environmnet
146d583b39bSJohn Wren Kennedy#
147d583b39bSJohn Wren Kennedy# $1 number of snapshot Note: Currently only support three snapshots.
148d583b39bSJohn Wren Kennedy#
149d583b39bSJohn Wren Kennedyfunction cleanup_env
150d583b39bSJohn Wren Kennedy{
151d583b39bSJohn Wren Kennedy	typeset -i cnt=${1:-3}
152d583b39bSJohn Wren Kennedy	typeset -i ind=0
153d583b39bSJohn Wren Kennedy	typeset dtst
154d583b39bSJohn Wren Kennedy	typeset snap
155d583b39bSJohn Wren Kennedy
1561d32ba66SJohn Wren Kennedy	pkill ${DD##*/}
157d583b39bSJohn Wren Kennedy
1581d32ba66SJohn Wren Kennedy	df -lhF ufs "/dev/zvol/dsk/$VOL" > /dev/null 2>&1
159d583b39bSJohn Wren Kennedy	if (( $? == 0 )); then
1601d32ba66SJohn Wren Kennedy		log_must umount -f $TESTDIR1
161d583b39bSJohn Wren Kennedy	fi
162d583b39bSJohn Wren Kennedy
1631d32ba66SJohn Wren Kennedy	[[ -d $TESTDIR ]] && log_must rm -rf $TESTDIR/*
1641d32ba66SJohn Wren Kennedy	[[ -d $TESTDIR1 ]] && log_must rm -rf $TESTDIR1/*
165d583b39bSJohn Wren Kennedy
166d583b39bSJohn Wren Kennedy	for dtst in $FS $VOL; do
167d583b39bSJohn Wren Kennedy		for snap in $TESTSNAP $TESTSNAP1 $TESTSNAP2; do
168d583b39bSJohn Wren Kennedy			if snapexists $dtst@$snap; then
1691d32ba66SJohn Wren Kennedy				 log_must zfs destroy -Rf $dtst@$snap
170d583b39bSJohn Wren Kennedy			fi
171d583b39bSJohn Wren Kennedy		done
172d583b39bSJohn Wren Kennedy	done
173d583b39bSJohn Wren Kennedy
174d583b39bSJohn Wren Kennedy	# Restore original test environment
175d583b39bSJohn Wren Kennedy	if datasetnonexists $FS ; then
1761d32ba66SJohn Wren Kennedy		log_must zfs create $FS
177d583b39bSJohn Wren Kennedy	fi
178d583b39bSJohn Wren Kennedy	if datasetnonexists $VOL ; then
179d583b39bSJohn Wren Kennedy		if is_global_zone ; then
1801d32ba66SJohn Wren Kennedy			log_must zfs create -V $VOLSIZE $VOL
181d583b39bSJohn Wren Kennedy		else
1821d32ba66SJohn Wren Kennedy			log_must zfs create $VOL
183d583b39bSJohn Wren Kennedy		fi
184d583b39bSJohn Wren Kennedy	fi
185d583b39bSJohn Wren Kennedy}
186d583b39bSJohn Wren Kennedy
187d583b39bSJohn Wren Kennedy#
188d583b39bSJohn Wren Kennedy# check if the specified files have specified status.
189d583b39bSJohn Wren Kennedy#
190d583b39bSJohn Wren Kennedy# $1 expected status
191d583b39bSJohn Wren Kennedy# $2-n full file name
192d583b39bSJohn Wren Kennedy# If it is true return 0, else return 1
193d583b39bSJohn Wren Kennedy#
194d583b39bSJohn Wren Kennedyfunction file_status
195d583b39bSJohn Wren Kennedy{
196d583b39bSJohn Wren Kennedy	(( $# == 0 )) && \
197d583b39bSJohn Wren Kennedy		log_fail "The file name is not defined."
198d583b39bSJohn Wren Kennedy
199d583b39bSJohn Wren Kennedy	typeset opt
200d583b39bSJohn Wren Kennedy	case $1 in
201d583b39bSJohn Wren Kennedy		exist)	opt="-e" ;;
202d583b39bSJohn Wren Kennedy		nonexist) opt="! -e" ;;
203d583b39bSJohn Wren Kennedy		*)	log_fail "Unsupported file status." ;;
204d583b39bSJohn Wren Kennedy	esac
205d583b39bSJohn Wren Kennedy
206d583b39bSJohn Wren Kennedy	shift
207d583b39bSJohn Wren Kennedy	while (( $# > 0 )); do
208d583b39bSJohn Wren Kennedy		eval [[ $opt $1 ]] || return 1
209d583b39bSJohn Wren Kennedy		shift
210d583b39bSJohn Wren Kennedy	done
211d583b39bSJohn Wren Kennedy
212d583b39bSJohn Wren Kennedy	return 0
213d583b39bSJohn Wren Kennedy}
214d583b39bSJohn Wren Kennedy
215d583b39bSJohn Wren Kennedyfunction files_exist
216d583b39bSJohn Wren Kennedy{
217d583b39bSJohn Wren Kennedy	file_status "exist" $@
218d583b39bSJohn Wren Kennedy}
219d583b39bSJohn Wren Kennedy
220d583b39bSJohn Wren Kennedyfunction files_nonexist
221d583b39bSJohn Wren Kennedy{
222d583b39bSJohn Wren Kennedy	file_status "nonexist" $@
223d583b39bSJohn Wren Kennedy}
224d583b39bSJohn Wren Kennedy
225d583b39bSJohn Wren Kennedy#
226d583b39bSJohn Wren Kennedy# According to snapshot check if the file system was recovered to the right
227d583b39bSJohn Wren Kennedy# point.
228d583b39bSJohn Wren Kennedy#
229d583b39bSJohn Wren Kennedy# $1 snapshot. fs@snap or vol@snap
230d583b39bSJohn Wren Kennedy#
231d583b39bSJohn Wren Kennedyfunction check_files
232d583b39bSJohn Wren Kennedy{
233d583b39bSJohn Wren Kennedy	typeset dtst=$1
234d583b39bSJohn Wren Kennedy
235d583b39bSJohn Wren Kennedy	if [[ $(get_prop type $dtst) != snapshot ]]; then
236d583b39bSJohn Wren Kennedy		log_fail "Parameter must be a snapshot."
237d583b39bSJohn Wren Kennedy	fi
238d583b39bSJohn Wren Kennedy
239d583b39bSJohn Wren Kennedy	typeset fsvol=${dtst%%@*}
240d583b39bSJohn Wren Kennedy	typeset snap=${dtst##*@}
241d583b39bSJohn Wren Kennedy	if [[ $(get_prop type $fsvol) == "filesystem" ]]; then
242d583b39bSJohn Wren Kennedy		ind=""
243d583b39bSJohn Wren Kennedy	else
244d583b39bSJohn Wren Kennedy		ind="1"
245d583b39bSJohn Wren Kennedy	fi
246d583b39bSJohn Wren Kennedy
247d583b39bSJohn Wren Kennedy	eval typeset file0=\$TESTDIR$ind/\$TESTFILE0
248d583b39bSJohn Wren Kennedy	eval typeset file1=\$TESTDIR$ind/\$TESTFILE1
249d583b39bSJohn Wren Kennedy	eval typeset file2=\$TESTDIR$ind/\$TESTFILE2
250d583b39bSJohn Wren Kennedy
251d583b39bSJohn Wren Kennedy	case $snap in
252d583b39bSJohn Wren Kennedy		$TESTSNAP2)
253d583b39bSJohn Wren Kennedy			log_must files_exist $file0 $file1 $file2
254d583b39bSJohn Wren Kennedy
255d583b39bSJohn Wren Kennedy			typeset sum0=$(getsum $file0)
256d583b39bSJohn Wren Kennedy			typeset sum1=$(getsum $file1)
257d583b39bSJohn Wren Kennedy			typeset sum2=$(getsum $file2)
258d583b39bSJohn Wren Kennedy			if [[ $sum0 != $origsum || \
259d583b39bSJohn Wren Kennedy				$sum1 != $origsum || sum2 != $origsum ]]
260d583b39bSJohn Wren Kennedy			then
261d583b39bSJohn Wren Kennedy				log_fail "After rollback, file sum is changed."
262d583b39bSJohn Wren Kennedy			fi
263d583b39bSJohn Wren Kennedy			;;
264d583b39bSJohn Wren Kennedy		$TESTSNAP1)
265d583b39bSJohn Wren Kennedy			log_must files_exist $file0 $file1
266d583b39bSJohn Wren Kennedy			log_must files_nonexist $file2
267d583b39bSJohn Wren Kennedy
268d583b39bSJohn Wren Kennedy			typeset sum0=$(getsum $file0)
269d583b39bSJohn Wren Kennedy			typeset sum1=$(getsum $file1)
270d583b39bSJohn Wren Kennedy			if [[ $sum0 != $origsum || $sum1 != $origsum ]]
271d583b39bSJohn Wren Kennedy			then
272d583b39bSJohn Wren Kennedy				log_fail "After rollback, file sum is changed."
273d583b39bSJohn Wren Kennedy			fi
274d583b39bSJohn Wren Kennedy			;;
275d583b39bSJohn Wren Kennedy		$TESTSNAP)
276d583b39bSJohn Wren Kennedy			log_must files_exist $file0
277d583b39bSJohn Wren Kennedy			log_must files_nonexist $file1 $file2
278d583b39bSJohn Wren Kennedy
279d583b39bSJohn Wren Kennedy			typeset sum0=$(getsum $file0)
280d583b39bSJohn Wren Kennedy			if [[ $sum0 != $origsum ]]; then
281d583b39bSJohn Wren Kennedy				log_fail "After rollback, file sum is changed."
282d583b39bSJohn Wren Kennedy			fi
283d583b39bSJohn Wren Kennedy			;;
284d583b39bSJohn Wren Kennedy	esac
285d583b39bSJohn Wren Kennedy}
286d583b39bSJohn Wren Kennedy
287d583b39bSJohn Wren Kennedy# According to dataset type, write file to different directories.
288d583b39bSJohn Wren Kennedy#
289d583b39bSJohn Wren Kennedy# $1 dataset
290d583b39bSJohn Wren Kennedy#
291d583b39bSJohn Wren Kennedyfunction write_mountpoint_dir
292d583b39bSJohn Wren Kennedy{
293d583b39bSJohn Wren Kennedy	typeset dtst=$1
294d583b39bSJohn Wren Kennedy	typeset dir
295d583b39bSJohn Wren Kennedy
296d583b39bSJohn Wren Kennedy	if [[ $dtst == $FS ]]; then
297d583b39bSJohn Wren Kennedy		dir=$TESTDIR
298d583b39bSJohn Wren Kennedy		log_must ismounted $dir
299d583b39bSJohn Wren Kennedy	else
300d583b39bSJohn Wren Kennedy		dir=$TESTDIR1
301d583b39bSJohn Wren Kennedy		log_must ismounted $dir "ufs"
302d583b39bSJohn Wren Kennedy	fi
3031d32ba66SJohn Wren Kennedy	dd if=/dev/urandom of=$dir/$TESTFILE1 &
3041d32ba66SJohn Wren Kennedy	log_must sleep 3
305d583b39bSJohn Wren Kennedy}
306