aboutsummaryrefslogtreecommitdiffstats
path: root/tests/zfs-tests/include/properties.shlib
blob: cc37e769d3242221c68a2c0fb0d9389952423d66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source.  A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#

#
# Copyright (c) 2012, 2016, Delphix. All rights reserved.
#

typeset -a compress_prop_vals=('off' 'lzjb' 'lz4' 'gzip' 'zle')
typeset -a checksum_prop_vals=('on' 'off' 'fletcher2' 'fletcher4' 'sha256'
    'noparity' 'sha512' 'skein' 'edonr')
typeset -a recsize_prop_vals=('512' '1024' '2048' '4096' '8192' '16384'
    '32768' '65536' '131072' '262144' '524288' '1048576')
typeset -a canmount_prop_vals=('on' 'off' 'noauto')
typeset -a copies_prop_vals=('1' '2' '3')
typeset -a logbias_prop_vals=('latency' 'throughput')
typeset -a primarycache_prop_vals=('all' 'none' 'metadata')
typeset -a redundant_metadata_prop_vals=('all' 'most')
typeset -a secondarycache_prop_vals=('all' 'none' 'metadata')
typeset -a snapdir_prop_vals=('hidden' 'visible')
typeset -a sync_prop_vals=('standard' 'always' 'disabled')

typeset -a fs_props=('compress' 'checksum' 'recsize'
    'canmount' 'copies' 'logbias' 'primarycache' 'redundant_metadata'
    'secondarycache' 'snapdir' 'sync')
typeset -a vol_props=('compress' 'checksum' 'copies' 'logbias' 'primarycache'
    'secondarycache' 'redundant_metadata' 'sync')

#
# Given the property array passed in, return 'num_props' elements to the
# user, excluding any elements below 'start.' This allows us to exclude
# 'off' and 'on' which can be either unwanted, or a duplicate of another
# property respectively.
#
function get_rand_prop
{
	typeset prop_array=($(eval echo \${$1[@]}))
	typeset -i num_props=$2
	typeset -i start=$3
	typeset retstr=""

	[[ -z $prop_array || -z $num_props || -z $start ]] && \
	    log_fail "get_rand_prop: bad arguments"

	typeset prop_max=$((${#prop_array[@]} - 1))
	typeset -i i
	for i in $(shuf -i $start-$prop_max -n $num_props); do
		retstr="${prop_array[$i]} $retstr"
	done
	echo $retstr
}

function get_rand_checksum
{
	get_rand_prop checksum_prop_vals $1 2
}

function get_rand_checksum_any
{
	get_rand_prop checksum_prop_vals $1 0
}

function get_rand_recsize
{
	get_rand_prop recsize_prop_vals $1 0
}

function get_rand_large_recsize
{
	get_rand_prop recsize_prop_vals $1 9
}

#
# Functions to toggle on/off properties
#
typeset -a binary_props=('atime' 'devices' 'exec' 'readonly' 'setuid' 'xattr')

if is_freebsd; then
	binary_props+=('jailed')
else
	binary_props+=('zoned')
fi

if is_linux; then
	# Only older kernels support non-blocking mandatory locks
	if [[ $(linux_version) -lt $(linux_version "4.4") ]]; then
		binary_props+=('nbmand')
	fi
else
	binary_props+=('nbmand')
fi

function toggle_prop
{
	typeset ds=$1
	typeset prop=$2

	datasetexists $ds || log_fail "$ds does not exist"
	typeset val=$(get_prop $prop $ds)
	typeset newval='off'

	[[ $val = $newval ]] && newval='on'
	log_must zfs set $prop=$newval $ds
}

function toggle_binary_props
{
	typeset ds=$1
	typeset prop

	for prop in "${binary_props[@]}"; do
		toggle_prop $ds $prop
	done
}

function randomize_ds_props
{
	typeset ds=$1
	typeset prop proplist val

	datasetexists $ds || log_fail "$ds does not exist"
	if ds_is_volume $ds; then
		toggle_prop $ds readonly
		proplist="${vol_props[@]}"
	elif ds_is_filesystem $ds; then
		toggle_binary_props $ds
		proplist="${fs_props[@]}"
	else
		log_fail "$ds is neither a volume nor a file system"
	fi

	for prop in $proplist; do
		typeset val=$(get_rand_prop "${prop}_prop_vals" 1 0)
		log_must zfs set $prop=$val $ds
	done
}