1 # 2 # CDDL HEADER START 3 # 4 # The contents of this file are subject to the terms of the 5 # Common Development and Distribution License (the "License"). 6 # You may not use this file except in compliance with the License. 7 # 8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 # or http://www.opensolaris.org/os/licensing. 10 # See the License for the specific language governing permissions 11 # and limitations under the License. 12 # 13 # When distributing Covered Code, include this CDDL HEADER in each 14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 # If applicable, add the following below this CDDL HEADER, with the 16 # fields enclosed by brackets "[]" replaced with your own identifying 17 # information: Portions Copyright [yyyy] [name of copyright owner] 18 # 19 # CDDL HEADER END 20 # 21 22 # 23 # Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 # Use is subject to license terms. 25 # 26 27 # 28 # Copyright (c) 2013 by Delphix. All rights reserved. 29 # 30 31 . $STF_SUITE/include/libtest.shlib 32 33 export USEDTEST=$TESTPOOL/$TESTFS/usedtest-snapused 34 35 function _check_used # dataset 36 { 37 typeset dataset=$1 38 39 if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then 40 return 41 fi 42 43 used=$(get_prop used $dataset) 44 usedbychildren=$(get_prop usedbychildren $dataset) 45 usedbydataset=$(get_prop usedbydataset $dataset) 46 usedbyrefreservation=$(get_prop usedbyrefreservation $dataset) 47 usedbysnapshots=$(get_prop usedbysnapshots $dataset) 48 ((used_sum = usedbychildren + usedbydataset + \ 49 usedbyrefreservation + usedbysnapshots)) 50 if ((used != used_sum)); then 51 log_fail "$dataset: used($used) is not the sum($used_sum) of usedby*" 52 fi 53 } 54 55 function check_used # dataset 56 { 57 typeset dataset=$1 58 for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) 59 do 60 _check_used $child 61 done 62 } 63 64 function check_usedbychildren # dataset 65 { 66 typeset dataset=$1 67 typeset -i usedbychildren_sum=0 68 typeset -i parent_usedbychildren=0 69 for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) 70 do 71 if [[ "$(get_prop type $child)" == "snapshot" ]]; then 72 continue 73 fi 74 75 # parent 76 if [[ "$child" == "$dataset" ]]; then 77 parent_usedbychildren=$(get_prop usedbychildren $child) 78 else #child 79 reservation=$(get_prop reservation $child) 80 used=$(get_prop used $child) 81 if ((reservation > used)); then 82 ((usedbychildren_sum += reservation)) 83 else 84 ((usedbychildren_sum += used)) 85 fi 86 fi 87 done 88 89 if ((parent_usedbychildren != usedbychildren_sum)); then 90 log_fail "$dataset: usedbychildren($parent_usedbychildren) is not the sum($usedbychildren_sum) of used by children" 91 fi 92 } 93 94 function _check_usedbydataset # dataset 95 { 96 typeset dataset=$1 97 if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then 98 return 99 fi 100 101 usedbydataset=$(get_prop usedbydataset $dataset) 102 referenced=$(get_prop referenced $dataset) 103 104 is_cloned=$(get_prop is:cloned $dataset) 105 106 if [[ "$is_cloned" == "yes" ]]; then 107 if ((usedbydataset > referenced)); then 108 log_fail "$dataset(cloned): usedbydataset($usedbydataset) is more than referenced($referenced)" 109 fi 110 else 111 # 112 # if non-clones, should usedbydataset == referenced 113 # 114 if ((usedbydataset != referenced)); then 115 log_fail "$dataset: usedbydataset($usedbydataset) is not equal to referenced($referenced)" 116 fi 117 fi 118 } 119 120 function check_usedbydataset # dataset 121 { 122 typeset dataset=$1 123 for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) 124 do 125 _check_usedbydataset $child 126 done 127 } 128 129 function _check_usedbyrefreservation # dataset 130 { 131 typeset dataset=$1 132 if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then 133 return 134 fi 135 136 usedbyrefreservation=$(get_prop usedbyrefreservation $dataset) 137 referenced=$(get_prop referenced $dataset) 138 refreservation=$(get_prop refreservation $dataset) 139 ((diff_ref = refreservation - referenced)) 140 if ((usedbyrefreservation > refreservation || \ 141 usedbyrefreservation < diff_ref)); then 142 log_fail "$dataset: usedbyrefreservation($usedbyrefreservation) checking is not ok" 143 fi 144 } 145 146 function check_usedbyrefreservation # dataset 147 { 148 typeset dataset=$1 149 for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) 150 do 151 _check_usedbyrefreservation $child 152 done 153 } 154 155 function check_usedbysnapshots # dataset 156 { 157 typeset dataset=$1 158 typeset -i usedbysnapshots_sum=0 159 typeset -i parent_usedbysnapshots=0 160 for child in $($ZFS list -rH -t filesystem,volume,snapshot -o name $dataset) 161 do 162 # parent 163 if [[ "$child" == "$dataset" ]]; then 164 parent_usedbysnapshots=$(get_prop usedbysnapshots $child) 165 continue 166 fi 167 168 if [[ "$(get_prop type $child)" != "snapshot" ]]; then 169 continue 170 fi 171 172 if [[ "$child" != "$dataset@"* ]]; then 173 continue 174 fi 175 176 # snapshot 177 used=$(get_prop used $child) 178 ((usedbysnapshots_sum += used)) 179 done 180 181 if ((parent_usedbysnapshots < usedbysnapshots_sum)); then 182 log_fail "$dataset: usedbysnapshots($parent_usedbysnapshots) is not more than or equal to" \ 183 "the sum($usedbysnapshots_sum) of used of snapshots" 184 fi 185 }