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