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) 2016 by Delphix. All rights reserved. 29# 30 31. $STF_SUITE/include/libtest.shlib 32 33# 34# For zfs create. 35# 36set -A zpl_create_versions 3 4 5 37set -A spa_create_versions 9 15 24 38 39# 40# For zfs upgrade 41# 42set -A zpl_upgrade_versions 3 4 5 43set -A spa_upgrade_versions 9 15 24 44 45function default_setup_datasets #rootfs 46{ 47 typeset rootfs=$1 48 typeset pool=${rootfs%%/*} 49 typeset -i vp=$(get_pool_prop version $pool) 50 typeset -i version 51 typeset -i m 52 typeset -i spa_version 53 typeset -i zpl_version 54 55 for version in $ZFS_ALL_VERSIONS ; do 56 typeset verfs 57 eval verfs=\$ZFS_VERSION_$version 58 typeset current_fs=$rootfs/$verfs 59 typeset current_snap=${current_fs}@snap 60 typeset current_clone=$rootfs/clone$verfs 61 62 (( m=0 )) 63 (( spa_version=0 )) 64 while (( m < ${#zpl_create_versions[@]} )); do 65 (( zpl_version=${zpl_create_versions[m]} )) 66 if (( version == zpl_version )); then 67 (( spa_version=${spa_create_versions[m]} )) 68 break 69 fi 70 (( m+=1 )) 71 done 72 if (( spa_version != 0 )) && (( vp < spa_version )); then 73 log_mustnot zfs create -o version=${version} ${current_fs} 74 continue 75 fi 76 log_must zfs create -o version=${version} ${current_fs} 77 log_must zfs snapshot ${current_snap} 78 log_must zfs clone ${current_snap} ${current_clone} 79 80 for subversion in $ZFS_ALL_VERSIONS ; do 81 typeset subverfs 82 eval subverfs=\$ZFS_VERSION_$subversion 83 84 (( m=0 )) 85 (( spa_version=0 )) 86 while (( m < ${#zpl_create_versions[@]} )); do 87 (( zpl_version=${zpl_create_versions[m]} )) 88 if (( subversion == zpl_version )); then 89 (( spa_version=${spa_create_versions[m]} )) 90 break 91 fi 92 (( m+=1 )) 93 done 94 if (( spa_version != 0 )) && (( vp < spa_version )); then 95 log_mustnot zfs create -o \ 96 version=${subversion} ${current_fs}/$subverfs 97 else 98 log_must zfs create -o \ 99 version=${subversion} ${current_fs}/$subverfs 100 fi 101 done 102 done 103} 104 105function default_cleanup_datasets #rootfs 106{ 107 typeset rootfs=$1 108 109 if datasetexists $rootfs ; then 110 log_must zfs destroy -Rf $rootfs 111 fi 112 113 if datasetnonexists $rootfs ; then 114 log_must zfs create $rootfs 115 fi 116} 117 118function default_check_zfs_upgrade #rootfs 119{ 120 typeset rootfs=$1 121 typeset pool=${rootfs%%/*} 122 typeset -i vp=$(get_pool_prop version $pool) 123 typeset -i m 124 typeset -i spa_version 125 typeset -i zpl_version 126 typeset newv 127 typeset -i df_ret 128 129 df -F zfs / > /dev/null 2>&1 130 df_ret=$? 131 132 for newv in "" $ZFS_VERSION; do 133 default_setup_datasets $rootfs 134 if [[ -n $newv ]]; then 135 opt="-V $newv" 136 else 137 newv=$ZFS_VERSION 138 fi 139 140 (( m=0 )) 141 (( spa_version=0 )) 142 while (( m < ${#zpl_upgrade_versions[@]} )); do 143 (( zpl_version=${zpl_upgrade_versions[m]} )) 144 if (( newv == zpl_version )); then 145 (( spa_version=${spa_upgrade_versions[m]} )) 146 break 147 fi 148 (( m+=1 )) 149 done 150 151 if (( df_ret != 0 )); then 152 if (( spa_version != 0 )) && (( vp < spa_version )); then 153 log_mustnot eval 'zfs upgrade $opt -a > /dev/null 2>&1' 154 log_must eval 'zpool upgrade $pool > /dev/null 2>&1' 155 vp=$(get_pool_prop version $pool) 156 fi 157 158 log_must eval 'zfs upgrade $opt -a > /dev/null 2>&1' 159 160 for fs in $(zfs list -rH -t filesystem -o name $rootfs) ; do 161 log_must check_fs_version $fs $newv 162 done 163 fi 164 165 default_cleanup_datasets $rootfs 166 done 167} 168 169function check_fs_version #filesystem version 170{ 171 typeset fs=$1 172 typeset -i version=${2:-$ZFS_VERSION} 173 174 if [[ -z $fs ]]; then 175 log_fail "No filesystem specified." 176 fi 177 178 typeset -i curv=$(get_prop version $fs) 179 if (( curv != version )); then 180 return 1 181 fi 182 return 0 183} 184