f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER START
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# The contents of this file are subject to the terms of the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Common Development and Distribution License (the "License").
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You may not use this file except in compliance with the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# or http://www.opensolaris.org/os/licensing.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# See the License for the specific language governing permissions
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# and limitations under the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER END
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Use is subject to license terms.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/include/libtest.shlib
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyexport USEDTEST=$TESTPOOL/$TESTFS/usedtest-snapused
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction _check_used # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy used=$(get_prop used $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbychildren=$(get_prop usedbychildren $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbydataset=$(get_prop usedbydataset $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbyrefreservation=$(get_prop usedbyrefreservation $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbysnapshots=$(get_prop usedbysnapshots $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((used_sum = usedbychildren + usedbydataset + \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbyrefreservation + usedbysnapshots))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((used != used_sum)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset: used($used) is not the sum($used_sum) of usedby*"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction check_used # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy for child in $(zfs list -rH -t filesystem,volume -o name $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy _check_used $child
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction check_usedbychildren # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i usedbychildren_sum=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i parent_usedbychildren=0
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy for child in $(zfs list -rH -t filesystem,volume -o name $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$(get_prop type $child)" == "snapshot" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy continue
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # parent
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$child" == "$dataset" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy parent_usedbychildren=$(get_prop usedbychildren $child)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else #child
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy reservation=$(get_prop reservation $child)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy used=$(get_prop used $child)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((reservation > used)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((usedbychildren_sum += reservation))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((usedbychildren_sum += used))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((parent_usedbychildren != usedbychildren_sum)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset: usedbychildren($parent_usedbychildren) is not the sum($usedbychildren_sum) of used by children"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction _check_usedbydataset # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbydataset=$(get_prop usedbydataset $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy referenced=$(get_prop referenced $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy is_cloned=$(get_prop is:cloned $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$is_cloned" == "yes" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((usedbydataset > referenced)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset(cloned): usedbydataset($usedbydataset) is more than referenced($referenced)"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # if non-clones, should usedbydataset == referenced
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((usedbydataset != referenced)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset: usedbydataset($usedbydataset) is not equal to referenced($referenced)"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction check_usedbydataset # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy for child in $(zfs list -rH -t filesystem,volume -o name $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy _check_usedbydataset $child
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction _check_usedbyrefreservation # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbyrefreservation=$(get_prop usedbyrefreservation $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy referenced=$(get_prop referenced $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy refreservation=$(get_prop refreservation $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((diff_ref = refreservation - referenced))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((usedbyrefreservation > refreservation || \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy usedbyrefreservation < diff_ref)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset: usedbyrefreservation($usedbyrefreservation) checking is not ok"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction check_usedbyrefreservation # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy for child in $(zfs list -rH -t filesystem,volume -o name $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy _check_usedbyrefreservation $child
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction check_usedbysnapshots # dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dataset=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i usedbysnapshots_sum=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i parent_usedbysnapshots=0
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy for child in $(zfs list -rH -t filesystem,volume,snapshot -o name $dataset)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # parent
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$child" == "$dataset" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy parent_usedbysnapshots=$(get_prop usedbysnapshots $child)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy continue
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$(get_prop type $child)" != "snapshot" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy continue
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$child" != "$dataset@"* ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy continue
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # snapshot
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy used=$(get_prop used $child)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((usedbysnapshots_sum += used))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((parent_usedbysnapshots < usedbysnapshots_sum)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$dataset: usedbysnapshots($parent_usedbysnapshots) is not more than or equal to" \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy "the sum($usedbysnapshots_sum) of used of snapshots"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}