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