# # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # # Copyright (c) 2012, 2018 by Delphix. All rights reserved. # . $STF_SUITE/include/libtest.shlib . $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg # # Create or recover a set of test environment which include ctr, vol, fs, # snap & clone. It looks like the following. # # pool # |ctr # | |fs # | | |fssnap # | |vol # | |volsnap # |fsclone # |volclone # # $1 indicate which dependent dataset need be created. Such as 'snap', 'clone'. # function setup_testenv #[dtst] { typeset dtst=$1 if ! datasetexists $CTR; then log_must zfs create $CTR fi if ! datasetexists $FS; then log_must zfs create $FS fi # Volume test is only available on global zone if ! datasetexists $VOL && is_global_zone; then log_must zfs create -V $VOLSIZE $VOL block_device_wait log_must new_fs $ZVOL_DEVDIR/$VOL if [[ ! -d $TESTDIR1 ]]; then log_must mkdir $TESTDIR1 fi log_must mount $ZVOL_DEVDIR/$VOL $TESTDIR1 fi if [[ $dtst == snap || $dtst == clone ]]; then if ! datasetexists $FSSNAP; then log_must zfs snapshot $FSSNAP fi if ! datasetexists $VOLSNAP && is_global_zone; then log_must zfs snapshot $VOLSNAP fi fi if [[ $dtst == clone ]]; then if ! datasetexists $FSCLONE; then log_must zfs clone $FSSNAP $FSCLONE fi if ! datasetexists $VOLCLONE && is_global_zone; then log_must zfs clone $VOLSNAP $VOLCLONE block_device_wait fi fi } # Clean up the testing environment # function cleanup_testenv { if is_global_zone && ismounted "$TESTDIR1" "$NEWFS_DEFAULT_FS" ; then log_must umount -f $TESTDIR1 fi if [[ -d $TESTDIR1 ]]; then log_must rm -rf $TESTDIR1 fi pkill mkbusy if datasetexists $CTR; then log_must zfs destroy -Rf $CTR fi } # # Delete volume and related datasets from list, if the test cases was # running in local zone. Then check them are existed or non-exists. # # $1 function name # $2-n datasets name # function check_dataset { typeset funname=$1 typeset newlist="" typeset dtst shift for dtst in "$@"; do # Volume and related stuff are unavailable in local zone if ! is_global_zone; then if [[ $dtst == $VOL || $dtst == $VOLSNAP || \ $dtst == $VOLCLONE ]] then continue fi fi newlist="$newlist $dtst" done if (( ${#newlist} != 0 )); then # Run each item in $newlist individually so on failure, the # problematic dataset is listed in the logs. for i in $newlist; do log_must $funname $i done fi } # Use zdb to see if a livelist exists for a given clone # $1 clone name function check_livelist_exists { zdb -vvvvv $TESTPOOL/$1 | grep "Livelist" || \ log_fail "zdb could not find Livelist" } # Check that a livelist has been removed, waiting for deferred destroy entries # to be cleared from zdb. function check_livelist_gone { log_must zpool wait -t free $TESTPOOL zpool sync zdb -vvvvv $TESTPOOL | grep "Livelist" && \ log_fail "zdb found Livelist after the clone is deleted." } # Create a clone in the testpool based on $TESTFS@snap. Verify that the clone # was created and that it includes a livelist # $1 fs name # $2 snap name # $3 clone name function clone_dataset { log_must zfs clone $TESTPOOL/$1@$2 $TESTPOOL/$3 datasetexists $TESTPOOL/$3 || \ log_fail "zfs clone $TESTPOOL/$3 fail." check_livelist_exists $3 }