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# ident "@(#)zfs_upgrade.kshlib 1.3 09/06/22 SMI" 28# 29 30. $STF_SUITE/include/libtest.kshlib 31 32# 33# For zfs create. 34# When pool version is 15, fs whose version is 4 can be created. 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 typeset pool=$1 48 typeset vs=$(get_pool_prop version $pool) 49 if [ "$vs" = "-" ]; then 50 echo 5000 51 else 52 echo "$vs" 53 fi 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 $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 -t 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 2>&1' 165 log_must eval '$ZPOOL upgrade $pool > /dev/null 2>&1' 166 vp="$(get_pool_version $pool)" 167 fi 168 169 log_must eval '$ZFS upgrade $opt -a > /dev/null 2>&1' 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