1 #!/bin/ksh -p 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 28 # 29 # Copyright (c) 2013 by Delphix. All rights reserved. 30 # 31 32 . $STF_SUITE/tests/functional/rsend/rsend.kshlib 33 34 # 35 # DESCRIPTION: 36 # zfs send -R will backup all the filesystem properties correctly. 37 # 38 # STRATEGY: 39 # 1. Setting properties for all the filesystem and volumes randomly 40 # 2. Backup all the data from POOL by send -R 41 # 3. Restore all the data in POOL2 42 # 4. Verify all the perperties in two pools are same 43 # 44 45 verify_runnable "global" 46 47 function rand_set_prop 48 { 49 typeset dtst=$1 50 typeset prop=$2 51 shift 2 52 typeset value=$(random_get $@) 53 54 log_must eval "$ZFS set $prop='$value' $dtst" 55 } 56 57 function edited_prop 58 { 59 typeset behaviour=$1 60 typeset ds=$2 61 typeset backfile=$TESTDIR/edited_prop_$ds 62 63 case $behaviour in 64 "get") 65 typeset props=$($ZFS inherit 2>&1 | \ 66 $AWK '$2=="YES" {print $1}' | \ 67 $EGREP -v "^vol|\.\.\.$") 68 for item in $props ; do 69 if [[ $item == "mlslabel" ]] && \ 70 ! is_te_enabled ; then 71 continue 72 fi 73 $ZFS get -H -o property,value $item $ds >> \ 74 $backfile 75 if (($? != 0)); then 76 log_fail "zfs get -H -o property,value"\ 77 "$item $ds > $backfile" 78 fi 79 done 80 ;; 81 "set") 82 if [[ ! -f $backfile ]] ; then 83 log_fail "$ds need backup properties firstly." 84 fi 85 86 typeset prop value 87 while read prop value ; do 88 eval $ZFS set $prop='$value' $ds 89 if (($? != 0)); then 90 log_fail "$ZFS set $prop=$value $ds" 91 fi 92 done < $backfile 93 ;; 94 *) 95 log_fail "Unrecognized behaviour: $behaviour" 96 esac 97 } 98 99 function cleanup 100 { 101 log_must cleanup_pool $POOL 102 log_must cleanup_pool $POOL2 103 104 log_must edited_prop "set" $POOL 105 log_must edited_prop "set" $POOL2 106 107 typeset prop 108 for prop in $(fs_inherit_prop) ; do 109 log_must $ZFS inherit $prop $POOL 110 log_must $ZFS inherit $prop $POOL2 111 done 112 113 #if is_shared $POOL; then 114 # log_must $ZFS set sharenfs=off $POOL 115 #fi 116 log_must setup_test_model $POOL 117 118 if [[ -d $TESTDIR ]]; then 119 log_must $RM -rf $TESTDIR/* 120 fi 121 } 122 123 log_assert "Verify zfs send -R will backup all the filesystem properties " \ 124 "correctly." 125 log_onexit cleanup 126 127 log_must edited_prop "get" $POOL 128 log_must edited_prop "get" $POOL2 129 130 for fs in "$POOL" "$POOL/pclone" "$POOL/$FS" "$POOL/$FS/fs1" \ 131 "$POOL/$FS/fs1/fs2" "$POOL/$FS/fs1/fclone" ; do 132 rand_set_prop $fs aclinherit "discard" "noallow" "secure" "passthrough" 133 rand_set_prop $fs checksum "on" "off" "fletcher2" "fletcher4" "sha256" 134 rand_set_prop $fs aclmode "discard" "groupmask" "passthrough" 135 rand_set_prop $fs atime "on" "off" 136 rand_set_prop $fs checksum "on" "off" "fletcher2" "fletcher4" "sha256" 137 rand_set_prop $fs compression "on" "off" "lzjb" "gzip" \ 138 "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" "gzip-6" \ 139 "gzip-7" "gzip-8" "gzip-9" 140 rand_set_prop $fs copies "1" "2" "3" 141 rand_set_prop $fs devices "on" "off" 142 rand_set_prop $fs exec "on" "off" 143 rand_set_prop $fs quota "512M" "1024M" 144 rand_set_prop $fs recordsize "512" "2K" "8K" "32K" "128K" 145 rand_set_prop $fs setuid "on" "off" 146 rand_set_prop $fs snapdir "hidden" "visible" 147 rand_set_prop $fs xattr "on" "off" 148 rand_set_prop $fs user:prop "aaa" "bbb" "23421" "()-+?" 149 done 150 151 for vol in "$POOL/vol" "$POOL/$FS/vol" ; do 152 rand_set_prop $vol checksum "on" "off" "fletcher2" "fletcher4" "sha256" 153 rand_set_prop $vol compression "on" "off" "lzjb" "gzip" \ 154 "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" "gzip-6" \ 155 "gzip-7" "gzip-8" "gzip-9" 156 rand_set_prop $vol readonly "on" "off" 157 rand_set_prop $vol copies "1" "2" "3" 158 rand_set_prop $vol user:prop "aaa" "bbb" "23421" "()-+?" 159 done 160 161 162 # Verify inherited property can be received 163 rand_set_prop $POOL sharenfs "on" "off" "rw" 164 165 # 166 # Duplicate POOL2 for testing 167 # 168 log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" 169 log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" 170 171 # 172 # Define all the POOL/POOL2 datasets pair 173 # 174 set -A pair "$POOL" "$POOL2" \ 175 "$POOL/$FS" "$POOL2/$FS" \ 176 "$POOL/$FS/fs1" "$POOL2/$FS/fs1" \ 177 "$POOL/$FS/fs1/fs2" "$POOL2/$FS/fs1/fs2" \ 178 "$POOL/pclone" "$POOL2/pclone" \ 179 "$POOL/$FS/fs1/fclone" "$POOL2/$FS/fs1/fclone" \ 180 "$POOL/vol" "$POOL2/vol" \ 181 "$POOL/$FS/vol" "$POOL2/$FS/vol" 182 183 typeset -i i=0 184 while ((i < ${#pair[@]})); do 185 log_must cmp_ds_prop ${pair[$i]} ${pair[((i+1))]} 186 187 ((i += 2)) 188 done 189 190 191 $ZPOOL upgrade -v | $GREP "Snapshot properties" > /dev/null 2>&1 192 if (( $? == 0 )) ; then 193 i=0 194 while ((i < ${#pair[@]})); do 195 log_must cmp_ds_prop ${pair[$i]}@final ${pair[((i+1))]}@final 196 ((i += 2)) 197 done 198 fi 199 200 log_pass "Verify zfs send -R will backup all the filesystem properties " \ 201 "correctly."