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