# # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # . $STF_SUITE/include/libtest.shlib # # For zfs create. # set -A zpl_create_versions 3 4 5 set -A spa_create_versions 9 15 24 # # For zfs upgrade # set -A zpl_upgrade_versions 3 4 5 set -A spa_upgrade_versions 9 15 24 function default_setup_datasets #rootfs { typeset rootfs=$1 typeset pool=${rootfs%%/*} typeset -i vp=$(get_pool_prop version $pool) typeset -i version typeset -i m typeset -i spa_version typeset -i zpl_version for version in $ZFS_ALL_VERSIONS ; do typeset verfs eval verfs=\$ZFS_VERSION_$version typeset current_fs=$rootfs/$verfs typeset current_snap=${current_fs}@snap typeset current_clone=$rootfs/clone$verfs (( m=0 )) (( spa_version=0 )) while (( m < ${#zpl_create_versions[@]} )); do (( zpl_version=${zpl_create_versions[m]} )) if (( version == zpl_version )); then (( spa_version=${spa_create_versions[m]} )) break fi (( m+=1 )) done if (( spa_version != 0 )) && (( vp < spa_version )); then log_mustnot $ZFS create -o version=${version} ${current_fs} continue fi log_must $ZFS create -o version=${version} ${current_fs} log_must $ZFS snapshot ${current_snap} log_must $ZFS clone ${current_snap} ${current_clone} for subversion in $ZFS_ALL_VERSIONS ; do typeset subverfs eval subverfs=\$ZFS_VERSION_$subversion (( m=0 )) (( spa_version=0 )) while (( m < ${#zpl_create_versions[@]} )); do (( zpl_version=${zpl_create_versions[m]} )) if (( subversion == zpl_version )); then (( spa_version=${spa_create_versions[m]} )) break fi (( m+=1 )) done if (( spa_version != 0 )) && (( vp < spa_version )); then log_mustnot $ZFS create -o \ version=${subversion} ${current_fs}/$subverfs else log_must $ZFS create -o \ version=${subversion} ${current_fs}/$subverfs fi done done } function default_cleanup_datasets #rootfs { typeset rootfs=$1 if datasetexists $rootfs ; then log_must $ZFS destroy -Rf $rootfs fi if datasetnonexists $rootfs ; then log_must $ZFS create $rootfs fi } function default_check_zfs_upgrade #rootfs { typeset rootfs=$1 typeset pool=${rootfs%%/*} typeset -i vp=$(get_pool_prop version $pool) typeset -i m typeset -i spa_version typeset -i zpl_version typeset newv typeset -i df_ret $DF -F zfs / > /dev/null 2>&1 df_ret=$? for newv in "" $ZFS_VERSION; do default_setup_datasets $rootfs if [[ -n $newv ]]; then opt="-V $newv" else newv=$ZFS_VERSION fi (( m=0 )) (( spa_version=0 )) while (( m < ${#zpl_upgrade_versions[@]} )); do (( zpl_version=${zpl_upgrade_versions[m]} )) if (( newv == zpl_version )); then (( spa_version=${spa_upgrade_versions[m]} )) break fi (( m+=1 )) done if (( df_ret != 0 )); then if (( spa_version != 0 )) && (( vp < spa_version )); then log_mustnot eval '$ZFS upgrade $opt -a > /dev/null 2>&1' log_must eval '$ZPOOL upgrade $pool > /dev/null 2>&1' vp=$(get_pool_prop version $pool) fi log_must eval '$ZFS upgrade $opt -a > /dev/null 2>&1' for fs in $($ZFS list -rH -t filesystem -o name $rootfs) ; do log_must check_fs_version $fs $newv done fi default_cleanup_datasets $rootfs done } function check_fs_version #filesystem version { typeset fs=$1 typeset -i version=${2:-$ZFS_VERSION} if [[ -z $fs ]]; then log_fail "No filesystem specified." fi typeset -i curv=$(get_prop version $fs) if (( curv != version )); then return 1 fi return 0 }