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