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