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