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