Index: head/tests/sys/cddl/zfs/bin/devname2devid.c =================================================================== --- head/tests/sys/cddl/zfs/bin/devname2devid.c (revision 331612) +++ head/tests/sys/cddl/zfs/bin/devname2devid.c (revision 331613) @@ -1,123 +1,123 @@ /* * 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 * $FreeBSD$ */ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "@(#)devname2devid.c 1.3 07/05/25 SMI" #include #include #include #include #include #include #include /* * Usage: devname2devid * * Examples: - * # ./devname2devid /dev/dsk/c1t4d0s0 + * # ./devname2devid /dev/c1t4d0s0 * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/a - * # ./devname2devid /dev/dsk/c1t4d0 + * # ./devname2devid /dev/c1t4d0 * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/wd - * # ./devname2devid /dev/dsk/c1t4d0s1 + * # ./devname2devid /dev/c1t4d0s1 * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/b * # * * This program accepts a disk or disk slice path and prints a * device id. * * Exit values: * 0 - means success * 1 - means failure * */ int main(int argc, char *argv[]) { int fd; ddi_devid_t devid; char *minor_name, *devidstr, *device; #ifdef DEBUG devid_nmlist_t *list = NULL; char *search_path; int i; #endif if (argc == 1) { (void) printf("%s [search path]\n", argv[0]); exit(1); } device = argv[1]; if ((fd = open(device, O_RDONLY|O_NDELAY)) < 0) { perror(device); exit(1); } if (devid_get(fd, &devid) != 0) { perror("devid_get"); exit(1); } if (devid_get_minor_name(fd, &minor_name) != 0) { perror("devid_get_minor_name"); exit(1); } if ((devidstr = devid_str_encode(devid, minor_name)) == 0) { perror("devid_str_encode"); exit(1); } (void) printf("devid %s\n", devidstr); devid_str_free(devidstr); #ifdef DEBUG if (argc == 3) { search_path = argv[2]; } else { - search_path = "/dev/rdsk"; + search_path = "/dev/"; } if (devid_deviceid_to_nmlist(search_path, devid, DEVID_MINOR_NAME_ALL, &list)) { perror("devid_deviceid_to_nmlist"); exit(1); } /* loop through list and process device names and numbers */ for (i = 0; list[i].devname != NULL; i++) { (void) printf("devname: %s %p\n", list[i].devname, list[i].dev); } devid_free_nmlist(list); #endif /* DEBUG */ devid_str_free(minor_name); devid_free(devid); return (0); } Index: head/tests/sys/cddl/zfs/bin/zpool_bsd.ksh =================================================================== --- head/tests/sys/cddl/zfs/bin/zpool_bsd.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/bin/zpool_bsd.ksh (revision 331613) @@ -1,42 +1,42 @@ #!/usr/local/bin/ksh93 -p # # $FreeBSD$ cmd=$1 if [[ -z $cmd ]]; then return 0 fi shift typeset option case $cmd in create|add|attach|detach|replace|remove|online|offline|clear) for arg in $@; do - if [[ $arg == "/dev/dsk/"* ]]; then - arg=${arg#/dev/dsk/} + if [[ $arg == "/dev/"* ]]; then + arg=${arg#/dev/} arg="/dev/"$arg fi if [[ $arg == "/dev/"* ]]; then echo $arg | egrep "*s[0-9]$" > /dev/null 2>&1 if [ $? -eq 0 ] then n=`echo $arg| wc -c` set -A map a b c d e f g h i j s=`echo $arg | cut -c $((n-1))` arg=${arg%s[0-9]}${map[$s]} fi fi option="${option} $arg" done ;; *) option="$@" ;; esac echo $cmd $option Index: head/tests/sys/cddl/zfs/bin/zpool_smi.ksh =================================================================== --- head/tests/sys/cddl/zfs/bin/zpool_smi.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/bin/zpool_smi.ksh (revision 331613) @@ -1,138 +1,138 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zpool_smi.ksh 1.2 09/01/13 SMI" # function labelvtoc { typeset disk=$1 if [[ -z $disk ]]; then print "no disk is given." return 1 fi /usr/sbin/format $disk << _EOF >/dev/null 2>&1 label yes _EOF - labeltype=$(/usr/sbin/prtvtoc -fh /dev/rdsk/${disk}s2 | \ + labeltype=$(/usr/sbin/prtvtoc -fh /dev/${disk}s2 | \ awk '{print $1}' | awk -F= '{print $2}' ) if [[ -z $labeltype ]]; then print "${disk} not exist." return 1 fi if [[ $labeltype == "34" ]]; then typeset label_file=$TMPDIR/labelvtoc.${TESTCASE_ID:-$$} typeset arch=$(uname -p) if [[ $arch == "i386" ]]; then print "label" > $label_file print "0" >> $label_file print "" >> $label_file print "q" >> $label_file print "q" >> $label_file - fdisk -B /dev/rdsk/${disk}p0 >/dev/null 2>&1 + fdisk -B /dev/${disk}p0 >/dev/null 2>&1 # wait a while for fdisk finishes /usr/sbin/devfsadm > /dev/null 2>&1 elif [[ $arch == "sparc" ]]; then print "label" > $label_file print "0" >> $label_file print "" >> $label_file print "" >> $label_file print "" >> $label_file print "q" >> $label_file else print "unknow arch type : $arch" return 1 fi format -e -s -d $disk -f $label_file typeset -i ret_val=$? rm -f $label_file # # wait the format to finish # /usr/sbin/devfsadm > /dev/null 2>&1 if (( ret_val != 0 )); then print "unable to label $disk as VTOC." return 1 fi fi return 0 } cmd=$1 if [[ -z $cmd ]]; then return 0 fi shift typeset option case $cmd in create|add|attach|detach|replace|remove|online|offline|clear) for arg in $@; do - if [[ $arg == "/dev/dsk/"* ]]; then - arg=${arg#/dev/dsk/} + if [[ $arg == "/dev/"* ]]; then + arg=${arg#/dev/} fi print $arg | egrep "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 if [[ $? -eq 0 ]] ; then labelvtoc $arg if [[ $? -eq 0 ]] ; then arg=${arg}s2 fi fi option="${option} $arg" done ;; *) option="$@" ;; esac case $cmd in create|add|attach|replace) if [[ $option != *"-f"* ]]; then cmd="${cmd} -f" fi ;; *) ;; esac print $cmd $option Index: head/tests/sys/cddl/zfs/include/libtest.kshlib =================================================================== --- head/tests/sys/cddl/zfs/include/libtest.kshlib (revision 331612) +++ head/tests/sys/cddl/zfs/include/libtest.kshlib (revision 331613) @@ -1,3480 +1,3480 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)libtest.kshlib 1.15 09/08/06 SMI" # . ${STF_SUITE}/include/logapi.kshlib ZFS=${ZFS:-/sbin/zfs} ZPOOL=${ZPOOL:-/sbin/zpool} os_name=`uname -s` # Determine if a test has the necessary requirements to run function test_requires { integer unsupported=0 unsupported_list="" until [[ $# -eq 0 ]];do var_name=$1 cmd=$(eval echo \$${1}) if [[ ! "$cmd" != "" ]] ; then print $var_name is not set unsupported_list="$var_name $unsupported_list" ((unsupported=unsupported+1)) fi shift done if [[ unsupported -gt 0 ]] ; then log_unsupported "$unsupported_list commands are unsupported" else log_note "All commands are supported" fi } # Determine whether a dataset is mounted # # $1 dataset name # $2 filesystem type; optional - defaulted to zfs # # Return 0 if dataset is mounted; 1 if unmounted; 2 on error function ismounted { typeset fstype=$2 [[ -z $fstype ]] && fstype=zfs typeset out dir name ret case $fstype in zfs) if [[ "$1" == "/"* ]] ; then for out in $($ZFS mount | $AWK '{print $2}') ; do [[ $1 == $out ]] && return 0 done else for out in $($ZFS mount | $AWK '{print $1}') ; do [[ $1 == $out ]] && return 0 done fi ;; ufs|nfs) # a = device, b = "on", c = mount point", d = flags $MOUNT | $GREP $fstype | while read a b c d do [[ "$1" == "$a" || "$1" == "$c" ]] && return 0 done ;; esac return 1 } # Return 0 if a dataset is mounted; 1 otherwise # # $1 dataset name # $2 filesystem type; optional - defaulted to zfs function mounted { ismounted $1 $2 (( $? == 0 )) && return 0 return 1 } # Return 0 if a dataset is unmounted; 1 otherwise # # $1 dataset name # $2 filesystem type; optional - defaulted to zfs function unmounted { ismounted $1 $2 (( $? == 1 )) && return 0 return 1 } # split line on "," # # $1 - line to split function splitline { $ECHO $1 | $SED "s/,/ /g" } function default_setup { default_setup_noexit "$@" log_pass } # # Given a list of disks, setup storage pools and datasets. # function default_setup_noexit { typeset disklist=$1 typeset container=$2 typeset volume=$3 if is_global_zone; then if poolexists $TESTPOOL ; then destroy_pool $TESTPOOL fi [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL log_must $ZPOOL create -f $TESTPOOL $disklist else reexport_pool fi $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR log_must $ZFS create $TESTPOOL/$TESTFS log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS if [[ -n $container ]]; then $RM -rf $TESTDIR1 || \ log_unresolved Could not remove $TESTDIR1 $MKDIR -p $TESTDIR1 || \ log_unresolved Could not create $TESTDIR1 log_must $ZFS create $TESTPOOL/$TESTCTR log_must $ZFS set canmount=off $TESTPOOL/$TESTCTR log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 log_must $ZFS set mountpoint=$TESTDIR1 \ $TESTPOOL/$TESTCTR/$TESTFS1 fi if [[ -n $volume ]]; then if is_global_zone ; then log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL else log_must $ZFS create $TESTPOOL/$TESTVOL fi fi } # # Given a list of disks, setup a storage pool, file system and # a container. # function default_container_setup { typeset disklist=$1 default_setup "$disklist" "true" } # # Given a list of disks, setup a storage pool,file system # and a volume. # function default_volume_setup { typeset disklist=$1 default_setup "$disklist" "" "true" } # # Given a list of disks, setup a storage pool,file system, # a container and a volume. # function default_container_volume_setup { typeset disklist=$1 default_setup "$disklist" "true" "true" } # # Create a snapshot on a filesystem or volume. Defaultly create a snapshot on # filesystem # # $1 Existing filesystem or volume name. Default, $TESTFS # $2 snapshot name. Default, $TESTSNAP # function create_snapshot { typeset fs_vol=${1:-$TESTFS} typeset snap=${2:-$TESTSNAP} [[ -z $fs_vol ]] && log_fail "Filesystem or volume's name is undefined." [[ -z $snap ]] && log_fail "Snapshot's name is undefined." if snapexists $fs_vol@$snap; then log_fail "$fs_vol@$snap already exists." fi datasetexists $fs_vol || \ log_fail "$fs_vol must exist." log_must $ZFS snapshot $fs_vol@$snap } # # Create a clone from a snapshot, default clone name is $TESTCLONE. # # $1 Existing snapshot, $TESTPOOL/$TESTFS@$TESTSNAP is default. # $2 Clone name, $TESTPOOL/$TESTCLONE is default. # function create_clone # snapshot clone { typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} typeset clone=${2:-$TESTPOOL/$TESTCLONE} [[ -z $snap ]] && \ log_fail "Snapshot name is undefined." [[ -z $clone ]] && \ log_fail "Clone name is undefined." log_must $ZFS clone $snap $clone } function default_mirror_setup { default_mirror_setup_noexit $1 $2 $3 log_pass } # # Given a pair of disks, set up a storage pool and dataset for the mirror # @parameters: $1 the primary side of the mirror # $2 the secondary side of the mirror # @uses: ZPOOL ZFS TESTPOOL TESTFS function default_mirror_setup_noexit { readonly func="default_mirror_setup_noexit" typeset primary=$1 typeset secondary=$2 [[ -z $primary ]] && \ log_fail "$func: No parameters passed" [[ -z $secondary ]] && \ log_fail "$func: No secondary partition passed" [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL log_must $ZPOOL create -f $TESTPOOL mirror $@ log_must $ZFS create $TESTPOOL/$TESTFS log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS } # # create a number of mirrors. # We create a number($1) of 2 way mirrors using the pairs of disks named # on the command line. These mirrors are *not* mounted # @parameters: $1 the number of mirrors to create # $... the devices to use to create the mirrors on # @uses: ZPOOL ZFS TESTPOOL function setup_mirrors { typeset -i nmirrors=$1 shift while (( nmirrors > 0 )); do log_must test -n "$1" -a -n "$2" [[ -d /$TESTPOOL$nmirrors ]] && $RM -rf /$TESTPOOL$nmirrors log_must $ZPOOL create -f $TESTPOOL$nmirrors mirror $1 $2 shift 2 (( nmirrors = nmirrors - 1 )) done } # # create a number of raidz pools. # We create a number($1) of 2 raidz pools using the pairs of disks named # on the command line. These pools are *not* mounted # @parameters: $1 the number of pools to create # $... the devices to use to create the pools on # @uses: ZPOOL ZFS TESTPOOL function setup_raidzs { typeset -i nraidzs=$1 shift while (( nraidzs > 0 )); do log_must test -n "$1" -a -n "$2" [[ -d /$TESTPOOL$nraidzs ]] && $RM -rf /$TESTPOOL$nraidzs log_must $ZPOOL create -f $TESTPOOL$nraidzs raidz $1 $2 shift 2 (( nraidzs = nraidzs - 1 )) done } # # Destroy the configured testpool mirrors. # the mirrors are of the form ${TESTPOOL}{number} # @uses: ZPOOL ZFS TESTPOOL function destroy_mirrors { default_cleanup_noexit log_pass } # # Given a minimum of two disks, set up a storage pool and dataset for the raid-z # $1 the list of disks # function default_raidz_setup { typeset disklist="$*" set -A disks $disklist if [[ ${#disks[*]} -lt 2 ]]; then log_fail "A raid-z requires a minimum of two disks." fi [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL log_must $ZPOOL create -f $TESTPOOL raidz $1 $2 $3 log_must $ZFS create $TESTPOOL/$TESTFS log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS log_pass } # # Common function used to cleanup storage pools and datasets. # # Invoked at the start of the test suite to ensure the system # is in a known state, and also at the end of each set of # sub-tests to ensure errors from one set of tests doesn't # impact the execution of the next set. function default_cleanup { default_cleanup_noexit log_pass } function all_pools { cmd="$ZPOOL list -H -o name | $GREP 'testpool'" eval $cmd } # # Returns 0 if the system contains any pools that must not be modified by the # ZFS tests. # function other_pools_exist { typeset pool_count=`$ZPOOL list -H | $GREP -v '^testpool' | $WC -l` [ "$pool_count" -ne 0 ] } function default_cleanup_noexit { typeset exclude="" typeset pool="" # # Destroying the pool will also destroy any # filesystems it contains. # if is_global_zone; then # Here, we loop through the pools we're allowed to # destroy, only destroying them if it's safe to do # so. for pool in $(all_pools); do if safe_to_destroy_pool $pool; then destroy_pool $pool fi done else typeset fs="" for fs in $($ZFS list -H -o name \ | $GREP "^$ZONE_POOL/$ZONE_CTR[01234]/"); do datasetexists $fs && \ log_must $ZFS destroy -Rf $fs done # Need cleanup here to avoid garbage dir left. for fs in $($ZFS list -H -o name \ ); do [[ $fs == /$ZONE_POOL ]] && continue [[ -d $fs ]] && log_must $RM -rf $fs/* done # # Reset the $ZONE_POOL/$ZONE_CTR[01234] file systems property to # the default value # for fs in $($ZFS list -H -o name \ ); do if [[ $fs == $ZONE_POOL/$ZONE_CTR[01234] ]]; then log_must $ZFS set reservation=none $fs log_must $ZFS set recordsize=128K $fs log_must $ZFS set mountpoint=/$fs $fs typeset enc="" enc=$(get_prop encryption $fs) if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || \ [[ "$enc" == "off" ]]; then log_must $ZFS set checksum=on $fs fi log_must $ZFS set compression=off $fs log_must $ZFS set atime=on $fs log_must $ZFS set devices=off $fs log_must $ZFS set exec=on $fs log_must $ZFS set setuid=on $fs log_must $ZFS set readonly=off $fs log_must $ZFS set snapdir=hidden $fs log_must $ZFS set aclmode=groupmask $fs log_must $ZFS set aclinherit=secure $fs fi done fi [[ -d $TESTDIR ]] && \ log_must $RM -rf $TESTDIR } # # Common function used to cleanup storage pools, file systems # and containers. # function default_container_cleanup { if ! is_global_zone; then reexport_pool fi ismounted $TESTPOOL/$TESTCTR/$TESTFS1 [[ $? -eq 0 ]] && \ log_must $ZFS unmount $TESTPOOL/$TESTCTR/$TESTFS1 datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ log_must $ZFS destroy -R $TESTPOOL/$TESTCTR/$TESTFS1 datasetexists $TESTPOOL/$TESTCTR && \ log_must $ZFS destroy -Rf $TESTPOOL/$TESTCTR [[ -e $TESTDIR1 ]] && \ log_must $RM -rf $TESTDIR1 > /dev/null 2>&1 default_cleanup } # # Common function used to cleanup snapshot of file system or volume. Default to # delete the file system's snapshot # # $1 snapshot name # function destroy_snapshot { typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} if ! snapexists $snap; then log_fail "'$snap' does not existed." fi # # For the sake of the value which come from 'get_prop' is not equal # to the really mountpoint when the snapshot is unmounted. So, firstly # check and make sure this snapshot's been mounted in current system. # typeset mtpt="" if ismounted $snap; then mtpt=$(get_prop mountpoint $snap) (( $? != 0 )) && \ log_fail "get_prop mountpoint $snap failed." fi log_must $ZFS destroy $snap [[ $mtpt != "" && -d $mtpt ]] && \ log_must $RM -rf $mtpt } # # Common function used to cleanup clone. # # $1 clone name # function destroy_clone { typeset clone=${1:-$TESTPOOL/$TESTCLONE} if ! datasetexists $clone; then log_fail "'$clone' does not existed." fi # With the same reason in destroy_snapshot typeset mtpt="" if ismounted $clone; then mtpt=$(get_prop mountpoint $clone) (( $? != 0 )) && \ log_fail "get_prop mountpoint $clone failed." fi log_must $ZFS destroy $clone [[ $mtpt != "" && -d $mtpt ]] && \ log_must $RM -rf $mtpt } # Return 0 if a snapshot exists; $? otherwise # # $1 - snapshot name function snapexists { $ZFS list -H -t snapshot "$1" > /dev/null 2>&1 return $? } # # Set a property to a certain value on a dataset. # Sets a property of the dataset to the value as passed in. # @param: # $1 dataset who's property is being set # $2 property to set # $3 value to set property to # @return: # 0 if the property could be set. # non-zero otherwise. # @use: ZFS # function dataset_setprop { typeset fn=dataset_setprop if (( $# < 3 )); then log_note "$fn: Insufficient parameters (need 3, had $#)" return 1 fi typeset output= output=$($ZFS set $2=$3 $1 2>&1) typeset rv=$? if (( rv != 0 )); then log_note "Setting property on $1 failed." log_note "property $2=$3" log_note "Return Code: $rv" log_note "Output: $output" return $rv fi return 0 } # # Assign suite defined dataset properties. # This function is used to apply the suite's defined default set of # properties to a dataset. # @parameters: $1 dataset to use # @uses: ZFS COMPRESSION_PROP CHECKSUM_PROP # @returns: # 0 if the dataset has been altered. # 1 if no pool name was passed in. # 2 if the dataset could not be found. # 3 if the dataset could not have it's properties set. # function dataset_set_defaultproperties { typeset dataset="$1" [[ -z $dataset ]] && return 1 typeset confset= typeset -i found=0 for confset in $($ZFS list); do if [[ $dataset = $confset ]]; then found=1 break fi done [[ $found -eq 0 ]] && return 2 if [[ -n $COMPRESSION_PROP ]]; then dataset_setprop $dataset compression $COMPRESSION_PROP || \ return 3 log_note "Compression set to '$COMPRESSION_PROP' on $dataset" fi if [[ -n $CHECKSUM_PROP && $WRAPPER != *"crypto"* ]]; then dataset_setprop $dataset checksum $CHECKSUM_PROP || \ return 3 log_note "Checksum set to '$CHECKSUM_PROP' on $dataset" fi return 0 } # # Check a numeric assertion # @parameter: $@ the assertion to check # @output: big loud notice if assertion failed # @use: log_fail # function assert { (( $@ )) || log_fail $@ } function wipe_partition_table # [ ...] { while [[ -n $* ]]; do typeset diskname=$1 [ ! -e $diskname ] && log_fail "ERROR: $diskname doesn't exist" if gpart list ${diskname#/dev/} >/dev/null 2>&1; then wait_for 5 1 $GPART destroy -F $diskname else log_note "No GPT partitions detected on $diskname" fi log_must $GPART create -s gpt $diskname shift done } # # Given a slice, size and disk, this function # formats the slice to the specified size. # Size should be specified with units as per # the `format` command requirements eg. 100mb 3gb # function set_partition # { typeset -i slicenum=$1 typeset start=$2 typeset size=$3 typeset disk=$4 set -A devmap a b c d e f g h [[ -z $slicenum || -z $size || -z $disk ]] && \ log_fail "The slice, size or disk name is unspecified." size=`$ECHO $size| sed s/mb/M/` size=`$ECHO $size| sed s/m/M/` size=`$ECHO $size| sed s/gb/G/` size=`$ECHO $size| sed s/g/G/` [[ -n $start ]] && start="-b $start" log_must $GPART add -t efi $start -s $size -i $slicenum $disk return 0 } function get_disk_size # { typeset disk=$1 diskinfo $disk | awk '{print $3}' } function get_available_disk_size # { typeset disk=$1 raw_size=`get_disk_size $disk` (( available_size = raw_size * 95 / 100 )) echo $available_size } # # Get the end cyl of the given slice # #TODO: fix this to be GPT-compatible if we want to use the SMI WRAPPER. This # function is not necessary on FreeBSD # function get_endslice # { log_fail "get_endslice has not been updated for GPT partitions" } # # Get the first LBA that is beyond the end of the given partition function get_partition_end # { typeset disk=$1 typeset partition_index=$2 export partition_index $GPART show $disk | $AWK \ '/^[ \t]/ && $3 ~ ENVIRON["partition_index"] {print $1 + $2}' } # # Given a size,disk and total number of partitions, this function formats the # disk partitions from 0 to the total partition number with the same specified # size. # function partition_disk # { typeset -i i=1 typeset part_size=$1 typeset disk_name=$2 typeset total_parts=$3 typeset cyl wipe_partition_table $disk_name while (( i <= $total_parts )); do set_partition $i "" $part_size $disk_name (( i = i+1 )) done } function size_of_file # fname { typeset fname=$1 sz=`stat -f '%z' $fname` [[ -z "$sz" ]] && log_fail "stat($fname) failed" $ECHO $sz return 0 } # # This function continues to write to a filenum number of files into dirnum # number of directories until either $FILE_WRITE returns an error or the # maximum number of files per directory have been written. # # Usage: # fill_fs [destdir] [dirnum] [filenum] [bytes] [num_writes] [data] # # Return value: 0 on success # non 0 on error # # Where : # destdir: is the directory where everything is to be created under # dirnum: the maximum number of subdirectories to use, -1 no limit # filenum: the maximum number of files per subdirectory # blocksz: number of bytes per block # num_writes: number of blocks to write # data: the data that will be written # # E.g. # file_fs /testdir 20 25 1024 256 0 # # Note: blocksz * num_writes equals the size of the testfile # function fill_fs # destdir dirnum filenum blocksz num_writes data { typeset destdir=${1:-$TESTDIR} typeset -i dirnum=${2:-50} typeset -i filenum=${3:-50} typeset -i blocksz=${4:-8192} typeset -i num_writes=${5:-10240} typeset -i data=${6:-0} typeset -i retval=0 typeset -i dn=0 # current dir number typeset -i fn=0 # current file number while (( retval == 0 )); do (( dirnum >= 0 && dn >= dirnum )) && break typeset curdir=$destdir/$dn log_must $MKDIR -p $curdir for (( fn = 0; $fn < $filenum && $retval == 0; fn++ )); do log_cmd $FILE_WRITE -o create -f $curdir/$TESTFILE.$fn \ -b $blocksz -c $num_writes -d $data retval=$? done (( dn = dn + 1 )) done return $retval } # # Simple function to get the specified property. If unable to # get the property then exits. # # Note property is in 'parsable' format (-p) # function get_prop # property dataset { typeset prop_val typeset prop=$1 typeset dataset=$2 prop_val=$($ZFS get -pH -o value $prop $dataset 2>/dev/null) if [[ $? -ne 0 ]]; then log_note "Unable to get $prop property for dataset $dataset" return 1 fi $ECHO $prop_val return 0 } # # Simple function to return the lesser of two values. # function min { typeset first_arg=$1 typeset second_arg=$2 if (( first_arg < second_arg )); then $ECHO $first_arg else $ECHO $second_arg fi return 0 } # # Simple function to get the specified property of pool. If unable to # get the property then exits. # function get_pool_prop # property pool { typeset prop_val typeset prop=$1 typeset pool=$2 if poolexists $pool ; then prop_val=$($ZPOOL get $prop $pool 2>/dev/null | $TAIL -1 | \ $AWK '{print $3}') if [[ $? -ne 0 ]]; then log_note "Unable to get $prop property for pool " \ "$pool" return 1 fi else log_note "Pool $pool not exists." return 1 fi $ECHO $prop_val return 0 } # Return 0 if a pool exists; $? otherwise # # $1 - pool name function poolexists { typeset pool=$1 if [[ -z $pool ]]; then log_note "No pool name given." return 1 fi $ZPOOL list -H "$pool" > /dev/null 2>&1 return $? } # Return 0 if all the specified datasets exist; $? otherwise # # $1-n dataset name function datasetexists { if (( $# == 0 )); then log_note "No dataset name given." return 1 fi while (( $# > 0 )); do $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 || \ return $? shift done return 0 } # return 0 if none of the specified datasets exists, otherwise return 1. # # $1-n dataset name function datasetnonexists { if (( $# == 0 )); then log_note "No dataset name given." return 1 fi while (( $# > 0 )); do $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 && \ return 1 shift done return 0 } # # Given a mountpoint, or a dataset name, determine if it is shared. # # Returns 0 if shared, 1 otherwise. # function is_shared { typeset fs=$1 typeset mtpt if [[ $fs != "/"* ]] ; then if datasetnonexists "$fs" ; then return 1 else mtpt=$(get_prop mountpoint "$fs") case $mtpt in none|legacy|-) return 1 ;; *) fs=$mtpt ;; esac fi fi for mtpt in `$SHARE | $AWK '{print $2}'` ; do if [[ $mtpt == $fs ]] ; then return 0 fi done typeset stat=$($SVCS -H -o STA nfs/server:default) if [[ $stat != "ON" ]]; then log_note "Current nfs/server status: $stat" fi return 1 } # # Given a mountpoint, determine if it is not shared. # # Returns 0 if not shared, 1 otherwise. # function not_shared { typeset fs=$1 is_shared $fs if (( $? == 0)); then return 1 fi return 0 } # # Helper function to unshare a mountpoint. # function unshare_fs #fs { typeset fs=$1 is_shared $fs if (( $? == 0 )); then log_must $ZFS unshare $fs fi return 0 } # # Check NFS server status and trigger it online. # function setup_nfs_server { # Cannot share directory in non-global zone. # if ! is_global_zone; then log_note "Cannot trigger NFS server by sharing in LZ." return fi typeset nfs_fmri="svc:/network/nfs/server:default" if [[ $($SVCS -Ho STA $nfs_fmri) != "ON" ]]; then # # Only really sharing operation can enable NFS server # to online permanently. # typeset dummy=$TMPDIR/dummy if [[ -d $dummy ]]; then log_must $RM -rf $dummy fi log_must $MKDIR $dummy log_must $SHARE $dummy # # Waiting for fmri's status to be the final status. # Otherwise, in transition, an asterisk (*) is appended for # instances, unshare will reverse status to 'DIS' again. # # Waiting for 1's at least. # log_must $SLEEP 1 timeout=10 while [[ timeout -ne 0 && $($SVCS -Ho STA $nfs_fmri) == *'*' ]] do log_must $SLEEP 1 (( timeout -= 1 )) done log_must $UNSHARE $dummy log_must $RM -rf $dummy fi log_note "Current NFS status: '$($SVCS -Ho STA,FMRI $nfs_fmri)'" } # # To verify whether calling process is in global zone # # Return 0 if in global zone, 1 in non-global zone # function is_global_zone { typeset cur_zone=$($ZONENAME 2>/dev/null) # Zones are not supported on FreeBSD. if [[ $os_name == "FreeBSD" ]]; then return 0 fi if [[ $cur_zone != "global" ]]; then return 1 fi return 0 } # # Verify whether test is permit to run from # global zone, local zone, or both # # $1 zone limit, could be "global", "local", or "both"(no limit) # # Return 0 if permit, otherwise exit with log_unsupported # function verify_runnable # zone limit { typeset limit=$1 [[ -z $limit ]] && return 0 if is_global_zone ; then case $limit in global|both) break ;; local) log_unsupported "Test is unable to run from \ global zone." break ;; *) log_note "Warning: unknown limit $limit - use both." ;; esac else case $limit in local|both) break ;; global) log_unsupported "Test is unable to run from \ local zone." break ;; *) log_note "Warning: unknown limit $limit - use both." ;; esac reexport_pool fi return 0 } # Return 0 if create successfully or the pool exists; $? otherwise # Note: In local zones, this function should return 0 silently. # # $1 - pool name # $2-n - [keyword] devs_list function create_pool #pool devs_list { typeset pool=${1%%/*} shift if [[ -z $pool ]]; then log_note "Missing pool name." return 1 fi if poolexists $pool ; then destroy_pool $pool fi if is_global_zone ; then [[ -d /$pool ]] && $RM -rf /$pool log_must $ZPOOL create -f $pool $@ fi return 0 } # Return 0 if destroy successfully or the pool exists; $? otherwise # Note: In local zones, this function should return 0 silently. # # $1 - pool name # Destroy pool with the given parameters. function destroy_pool #pool { typeset pool=${1%%/*} typeset mtpt if [[ -z $pool ]]; then log_note "No pool name given." return 1 fi if is_global_zone ; then if poolexists "$pool" ; then mtpt=$(get_prop mountpoint "$pool") log_must $ZPOOL destroy -f $pool [[ -d $mtpt ]] && \ log_must $RM -rf $mtpt else log_note "Pool $pool does not exist, skipping destroy." return 1 fi fi return 0 } # # Create file vdevs. # By default this generates sparse vdevs 10GB in size, for performance. # function create_vdevs # vdevs { typeset vdsize=10G [ -n "$VDEV_SIZE" ] && vdsize=$VDEV_SIZE rm -f $@ || return 1 truncate -s $vdsize $@ } # # Firstly, create a pool with 5 datasets. Then, create a single zone and # export the 5 datasets to it. In addition, we also add a ZFS filesystem # and a zvol device to the zone. # # $1 zone name # $2 zone root directory prefix # $3 zone ip # function zfs_zones_setup #zone_name zone_root zone_ip { typeset zone_name=${1:-$(hostname)-z} typeset zone_root=${2:-"/zone_root"} typeset zone_ip=${3:-"10.1.1.10"} typeset prefix_ctr=$ZONE_CTR typeset pool_name=$ZONE_POOL typeset -i cntctr=5 typeset -i i=0 # Create pool and 5 container within it # [[ -d /$pool_name ]] && $RM -rf /$pool_name log_must $ZPOOL create -f $pool_name $DISKS while (( i < cntctr )); do log_must $ZFS create $pool_name/$prefix_ctr$i (( i += 1 )) done # create a zvol log_must $ZFS create -V 1g $pool_name/zone_zvol # # If current system support slog, add slog device for pool # typeset sdevs="$TMPDIR/sdev1 $TMPDIR/sdev2" log_must create_vdevs $sdevs log_must $ZPOOL add $pool_name log mirror $sdevs # this isn't supported just yet. # Create a filesystem. In order to add this to # the zone, it must have it's mountpoint set to 'legacy' # log_must $ZFS create $pool_name/zfs_filesystem # log_must $ZFS set mountpoint=legacy $pool_name/zfs_filesystem [[ -d $zone_root ]] && \ log_must $RM -rf $zone_root/$zone_name [[ ! -d $zone_root ]] && \ log_must $MKDIR -p -m 0700 $zone_root/$zone_name # Create zone configure file and configure the zone # typeset zone_conf=$TMPDIR/zone_conf.${TESTCASE_ID} $ECHO "create" > $zone_conf $ECHO "set zonepath=$zone_root/$zone_name" >> $zone_conf $ECHO "set autoboot=true" >> $zone_conf i=0 while (( i < cntctr )); do $ECHO "add dataset" >> $zone_conf $ECHO "set name=$pool_name/$prefix_ctr$i" >> \ $zone_conf $ECHO "end" >> $zone_conf (( i += 1 )) done # add our zvol to the zone $ECHO "add device" >> $zone_conf - $ECHO "set match=/dev/zvol/dsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "set match=/dev/zvol/$pool_name/zone_zvol" >> $zone_conf $ECHO "end" >> $zone_conf - # add a corresponding zvol rdsk to the zone + # add a corresponding zvol to the zone $ECHO "add device" >> $zone_conf - $ECHO "set match=/dev/zvol/rdsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "set match=/dev/zvol/$pool_name/zone_zvol" >> $zone_conf $ECHO "end" >> $zone_conf # once it's supported, we'll add our filesystem to the zone # $ECHO "add fs" >> $zone_conf # $ECHO "set type=zfs" >> $zone_conf # $ECHO "set special=$pool_name/zfs_filesystem" >> $zone_conf # $ECHO "set dir=/export/zfs_filesystem" >> $zone_conf # $ECHO "end" >> $zone_conf $ECHO "verify" >> $zone_conf $ECHO "commit" >> $zone_conf log_must $ZONECFG -z $zone_name -f $zone_conf log_must $RM -f $zone_conf # Install the zone $ZONEADM -z $zone_name install if (( $? == 0 )); then log_note "SUCCESS: $ZONEADM -z $zone_name install" else log_fail "FAIL: $ZONEADM -z $zone_name install" fi # Install sysidcfg file # typeset sysidcfg=$zone_root/$zone_name/root/etc/sysidcfg $ECHO "system_locale=C" > $sysidcfg $ECHO "terminal=dtterm" >> $sysidcfg $ECHO "network_interface=primary {" >> $sysidcfg $ECHO "hostname=$zone_name" >> $sysidcfg $ECHO "}" >> $sysidcfg $ECHO "name_service=NONE" >> $sysidcfg $ECHO "root_password=mo791xfZ/SFiw" >> $sysidcfg $ECHO "security_policy=NONE" >> $sysidcfg $ECHO "timezone=US/Eastern" >> $sysidcfg # Boot this zone log_must $ZONEADM -z $zone_name boot } # # Reexport TESTPOOL & TESTPOOL(1-4) # function reexport_pool { typeset -i cntctr=5 typeset -i i=0 while (( i < cntctr )); do if (( i == 0 )); then TESTPOOL=$ZONE_POOL/$ZONE_CTR$i if ! ismounted $TESTPOOL; then log_must $ZFS mount $TESTPOOL fi else eval TESTPOOL$i=$ZONE_POOL/$ZONE_CTR$i if eval ! ismounted \$TESTPOOL$i; then log_must eval $ZFS mount \$TESTPOOL$i fi fi (( i += 1 )) done } # # Wait for something to return true, checked by the caller. # function wait_for_checked # timeout dt [args...] { typeset timeout=$1 typeset dt=$2 shift; shift typeset -i start=$(date '+%s') typeset -i endtime log_note "Waiting $timeout seconds (checked every $dt seconds) for: $*" ((endtime = start + timeout)) while :; do $* [ $? -eq 0 ] && return curtime=$(date '+%s') [ $curtime -gt $endtime ] && return 1 sleep $dt done return 0 } # # Wait for something to return true. # function wait_for # timeout dt [args...] { typeset timeout=$1 typeset dt=$2 shift; shift wait_for_checked $timeout $dt $* || \ log_fail "ERROR: Timed out waiting for: $*" } # # Verify a given disk is online or offline # # Return 0 is pool/disk matches expected state, 1 otherwise # stateexpr is a regex like ONLINE or REMOVED|UNAVAIL # function check_state # pool disk stateexpr { typeset pool=$1 - typeset disk=${2#/dev/dsk/} - disk=${disk#/dev/rdsk/} + typeset disk=${2#/dev/} disk=${disk#/dev/} + disk=${disk#/dev/} typeset stateexpr=$3 $ZPOOL status -v $pool | grep "$disk" \ | egrep -i "$stateexpr" > /dev/null 2>&1 return $? } # # Wait for a given disk to leave a state # function wait_for_state_exit { typeset pool=$1 typeset disk=$2 typeset state=$3 while check_state "$pool" "$disk" "$state"; do $SLEEP 1 done } # # Wait for a given disk to enter a state # function wait_for_state_enter { typeset -i timeout=$1 typeset pool=$2 typeset disk=$3 typeset state=$4 log_note "Waiting up to $timeout seconds for $disk to become $state ..." for ((; $timeout > 0; timeout=$timeout-1)); do check_state $pool "$disk" "$state" [ $? -eq 0 ] && return $SLEEP 1 done log_must $ZPOOL status $pool log_fail "ERROR: Disk $disk not marked as $state in $pool" } # # Get the mountpoint of snapshot # as its mountpoint # function snapshot_mountpoint { typeset dataset=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} if [[ $dataset != *@* ]]; then log_fail "Error name of snapshot '$dataset'." fi typeset fs=${dataset%@*} typeset snap=${dataset#*@} if [[ -z $fs || -z $snap ]]; then log_fail "Error name of snapshot '$dataset'." fi $ECHO $(get_prop mountpoint $fs)/$(get_snapdir_name)/$snap } function pool_maps_intact # pool { typeset pool="$1" if ! $ZDB -bcv $pool; then return 1 fi return 0 } function filesys_has_zil # filesystem { typeset filesys="$1" if ! $ZDB -ivv $filesys | $GREP "ZIL header"; then return 1 fi return 0 } # # Given a pool and file system, this function will verify the file system # using the zdb internal tool. Note that the pool is exported and imported # to ensure it has consistent state. # function verify_filesys # pool filesystem dir { typeset pool="$1" typeset filesys="$2" typeset zdbout="$TMPDIR/zdbout.${TESTCASE_ID}" shift shift typeset dirs=$@ typeset search_path="" log_note "Calling $ZDB to verify filesystem '$filesys'" log_must $ZPOOL export $pool if [[ -n $dirs ]] ; then for dir in $dirs ; do search_path="$search_path -d $dir" done fi log_must $ZPOOL import $search_path $pool $ZDB -cudi $filesys > $zdbout 2>&1 if [[ $? != 0 ]]; then log_note "Output: $ZDB -cudi $filesys" $CAT $zdbout log_fail "$ZDB detected errors with: '$filesys'" fi log_must $RM -rf $zdbout } # # Given a pool, and this function list all disks in the pool # function get_disklist # pool { typeset disklist="" disklist=$($ZPOOL iostat -v $1 | $NAWK '(NR >4 ) {print $1}' | \ $GREP -v "\-\-\-\-\-" | \ $EGREP -v -e "^(mirror|raidz1|raidz2|spare|log|cache)$" ) $ECHO $disklist } # # Destroy all existing metadevices and state database # function destroy_metas { typeset metad for metad in $($METASTAT -p | $AWK '{print $1}'); do log_must $METACLEAR -rf $metad done for metad in $($METADB | $CUT -f6 | $GREP dev | $UNIQ); do log_must $METADB -fd $metad done } # /** # This function kills a given list of processes after a time period. We use # this in the stress tests instead of STF_TIMEOUT so that we can have processes # run for a fixed amount of time, yet still pass. Tests that hit STF_TIMEOUT # would be listed as FAIL, which we don't want : we're happy with stress tests # running for a certain amount of time, then finishing. # # @param $1 the time in seconds after which we should terminate these processes # @param $2..$n the processes we wish to terminate. # */ function stress_timeout { typeset -i TIMEOUT=$1 shift typeset cpids="$@" log_note "Waiting for child processes($cpids). " \ "It could last dozens of minutes, please be patient ..." log_must $SLEEP $TIMEOUT log_note "Killing child processes after ${TIMEOUT} stress timeout." typeset pid for pid in $cpids; do $PS -p $pid > /dev/null 2>&1 if (( $? == 0 )); then log_must $KILL -USR1 $pid fi done } # # Check whether current OS support a specified feature or not # # return 0 if current OS version is in unsupported list, 1 otherwise # # $1 unsupported target OS versions # function check_version # { typeset unsupported_vers="$@" typeset ver typeset cur_ver=`$UNAME -r` for ver in $unsupported_vers; do [[ "$cur_ver" == "$ver" ]] && return 0 done return 1 } # # Verify a given hotspare disk is inuse or avail # # Return 0 is pool/disk matches expected state, 1 otherwise # function check_hotspare_state # pool disk state{inuse,avail} { typeset pool=$1 - typeset disk=${2#/dev/dsk/} - disk=${disk#/dev/rdsk/} + typeset disk=${2#/dev/} disk=${disk#/dev/} + disk=${disk#/dev/} typeset state=$3 cur_state=$(get_device_state $pool $disk "spares") if [[ $state != ${cur_state} ]]; then return 1 fi return 0 } # # Verify a given slog disk is inuse or avail # # Return 0 is pool/disk matches expected state, 1 otherwise # function check_slog_state # pool disk state{online,offline,unavail} { typeset pool=$1 - typeset disk=${2#/dev/dsk/} - disk=${disk#/dev/rdsk/} + typeset disk=${2#/dev/} disk=${disk#/dev/} + disk=${disk#/dev/} typeset state=$3 cur_state=$(get_device_state $pool $disk "logs") if [[ $state != ${cur_state} ]]; then return 1 fi return 0 } # # Verify a given vdev disk is inuse or avail # # Return 0 is pool/disk matches expected state, 1 otherwise # function check_vdev_state # pool disk state{online,offline,unavail} { typeset pool=$1 - typeset disk=${2#/dev/dsk/} - disk=${disk#/dev/rdsk/} + typeset disk=${2#/dev/} disk=${disk#/dev/} + disk=${disk#/dev/} typeset state=$3 if [[ $WRAPPER == *"smi"* ]]; then $ECHO $disk | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 if (( $? == 0 )); then disk=${disk}s2 fi fi cur_state=$(get_device_state $pool $disk) if [[ $state != ${cur_state} ]]; then return 1 fi return 0 } # # Check the output of 'zpool status -v ', # and to see if the content of contain the specified. # # Return 0 is contain, 1 otherwise # function check_pool_status # pool token keyword { typeset pool=$1 typeset token=$2 typeset keyword=$3 $ZPOOL status -v "$pool" 2>/dev/null | \ $NAWK -v token="$token:" '($1==token) {print $0}' | \ $GREP -i "$keyword" >/dev/null 2>&1 return $? } function vdev_pool_error_count { typeset errs=$1 if [ -z "$2" ]; then test $errs -gt 0; ret=$? else test $errs -eq $2; ret=$? fi log_debug "vdev_pool_error_count: errs='$errs' \$2='$2' ret='$ret'" return $ret } # # Generate a pool status error file suitable for pool_errors_from_file. # If the pool is healthy, returns 0. Otherwise, the caller must handle the # returned temporarily file appropriately. # function pool_error_file # { typeset pool="$1" typeset tmpfile=$TMPDIR/pool_status.${TESTCASE_ID} $ZPOOL status -x $pool > ${tmpfile} echo $tmpfile } # # Evaluates counting the number of errors. If vdev specified, only # that vdev's errors are counted. Returns the total number. will be # deleted on exit. # function pool_errors_from_file # [vdev] { typeset file=$1 shift typeset checkvdev="$2" typeset line typeset -i fetchbegin=1 typeset -i errnum=0 typeset -i c_read=0 typeset -i c_write=0 typeset -i c_cksum=0 cat ${file} | $EGREP -v "pool:" | while read line; do if (( $fetchbegin != 0 )); then $ECHO $line | $GREP "NAME" >/dev/null 2>&1 (( $? == 0 )) && (( fetchbegin = 0 )) continue fi if [[ -n $checkvdev ]]; then $ECHO $line | $GREP $checkvdev >/dev/null 2>&1 (( $? != 0 )) && continue c_read=`$ECHO $line | $AWK '{print $3}'` c_write=`$ECHO $line | $AWK '{print $4}'` c_cksum=`$ECHO $line | $AWK '{print $5}'` if [ $c_read != 0 ] || [ $c_write != 0 ] || \ [ $c_cksum != 0 ] then (( errnum = errnum + 1 )) fi break fi c_read=`$ECHO $line | $AWK '{print $3}'` c_write=`$ECHO $line | $AWK '{print $4}'` c_cksum=`$ECHO $line | $AWK '{print $5}'` if [ $c_read != 0 ] || [ $c_write != 0 ] || \ [ $c_cksum != 0 ] then (( errnum = errnum + 1 )) fi done rm -f $file echo $errnum } # # Returns whether the vdev has the given number of errors. # If the number is unspecified, any non-zero number returns true. # function vdev_has_errors # pool vdev [errors] { typeset pool=$1 typeset vdev=$2 typeset tmpfile=$(pool_error_file $pool) log_note "Original pool status:" cat $tmpfile typeset -i errs=$(pool_errors_from_file $tmpfile $vdev) vdev_pool_error_count $errs $3 } # # Returns whether the pool has the given number of errors. # If the number is unspecified, any non-zero number returns true. # function pool_has_errors # pool [errors] { typeset pool=$1 typeset tmpfile=$(pool_error_file $pool) log_note "Original pool status:" cat $tmpfile typeset -i errs=$(pool_errors_from_file $tmpfile) vdev_pool_error_count $errs $2 } # # Returns whether clearing $pool at $vdev (if given) succeeds. # function pool_clear_succeeds { typeset pool="$1" typeset vdev=$2 $ZPOOL clear $pool $vdev ! pool_has_errors $pool } # # Return whether the pool is healthy # function is_pool_healthy # pool { typeset pool=$1 typeset healthy_output="pool '$pool' is healthy" typeset real_output=$($ZPOOL status -x $pool) if [[ "$real_output" == "$healthy_output" ]]; then return 0 else typeset -i ret $ZPOOL status -x $pool | $GREP "state:" | \ $GREP "FAULTED" >/dev/null 2>&1 ret=$? (( $ret == 0 )) && return 1 typeset l_scan typeset errnum l_scan=$($ZPOOL status -x $pool | $GREP "scan:") l_scan=${l_scan##*"with"} errnum=$($ECHO $l_scan | $AWK '{print $1}') if [ "$errnum" != "0" ]; then return 1 else return 0 fi fi } # # These 5 following functions are instance of check_pool_status() # is_pool_resilvering - to check if the pool is resilver in progress # is_pool_resilvered - to check if the pool is resilver completed # is_pool_scrubbing - to check if the pool is scrub in progress # is_pool_scrubbed - to check if the pool is scrub completed # is_pool_scrub_stopped - to check if the pool is scrub stopped # function is_pool_resilvering #pool { check_pool_status "$1" "scan" "resilver in progress" return $? } function is_pool_resilvered #pool { check_pool_status "$1" "scan" "resilvered" return $? } function resilver_happened # pool { typeset pool=$1 is_pool_resilvering "$pool" || is_pool_resilvered "$pool" } function is_pool_scrubbing #pool { check_pool_status "$1" "scan" "scrub in progress" return $? } function is_pool_scrubbed #pool { check_pool_status "$1" "scan" "scrub repaired" return $? } function is_pool_scrub_stopped #pool { check_pool_status "$1" "scan" "scrub canceled" return $? } function is_pool_state # pool state { check_pool_status "$1" "state" "$2" return $? } # # Erase the partition tables and destroy any zfs labels # function cleanup_devices #vdevs { for device in $@; do # Labelclear must happen first, otherwise it may interfere # with the teardown/setup of GPT labels. $ZPOOL labelclear -f $device # Only wipe partition tables for arguments that are disks, # as opposed to slices (which are valid arguments here). if camcontrol inquiry $device >/dev/null 2>&1; then wipe_partition_table $device fi done return 0 } # # Verify the rsh connectivity to each remote host in RHOSTS. # # Return 0 if remote host is accessible; otherwise 1. # $1 remote host name # $2 username # function verify_rsh_connect #rhost, username { typeset rhost=$1 typeset username=$2 typeset rsh_cmd="$RSH -n" typeset cur_user= $GETENT hosts $rhost >/dev/null 2>&1 if (( $? != 0 )); then log_note "$rhost cannot be found from" \ "administrative database." return 1 fi $PING $rhost 3 >/dev/null 2>&1 if (( $? != 0 )); then log_note "$rhost is not reachable." return 1 fi if (( ${#username} != 0 )); then rsh_cmd="$rsh_cmd -l $username" cur_user="given user \"$username\"" else cur_user="current user \"`$LOGNAME`\"" fi if ! $rsh_cmd $rhost $TRUE; then log_note "$RSH to $rhost is not accessible" \ "with $cur_user." return 1 fi return 0 } # # Verify the remote host connection via rsh after rebooting # $1 remote host # function verify_remote { rhost=$1 # # The following loop waits for the remote system rebooting. # Each iteration will wait for 150 seconds. there are # total 5 iterations, so the total timeout value will # be 12.5 minutes for the system rebooting. This number # is an approxiate number. # typeset -i count=0 while ! verify_rsh_connect $rhost; do sleep 150 (( count = count + 1 )) if (( count > 5 )); then return 1 fi done return 0 } # # Replacement function for /usr/bin/rsh. This function will include # the /usr/bin/rsh and meanwhile return the execution status of the # last command. # # $1 usrname passing down to -l option of /usr/bin/rsh # $2 remote machine hostname # $3... command string # function rsh_status { typeset ruser=$1 typeset rhost=$2 typeset -i ret=0 typeset cmd_str="" typeset rsh_str="" shift; shift cmd_str="$@" err_file=$TMPDIR/${rhost}.${TESTCASE_ID}.err if (( ${#ruser} == 0 )); then rsh_str="$RSH -n" else rsh_str="$RSH -n -l $ruser" fi $rsh_str $rhost /usr/local/bin/ksh93 -c "'$cmd_str; \ print -u 2 \"status=\$?\"'" \ >/dev/null 2>$err_file ret=$? if (( $ret != 0 )); then $CAT $err_file $RM -f $std_file $err_file log_fail "$RSH itself failed with exit code $ret..." fi ret=$($GREP -v 'print -u 2' $err_file | $GREP 'status=' | \ $CUT -d= -f2) (( $ret != 0 )) && $CAT $err_file >&2 $RM -f $err_file >/dev/null 2>&1 return $ret } # # Get the SUNWstc-fs-zfs package installation path in a remote host # $1 remote host name # function get_remote_pkgpath { typeset rhost=$1 typeset pkgpath="" pkgpath=$($RSH -n $rhost "$PKGINFO -l SUNWstc-fs-zfs | $GREP BASEDIR: |\ $CUT -d: -f2") $ECHO $pkgpath } #/** # A function to find and locate free disks on a system or from given # disks as the parameter. Since the conversion to ATF, this function is # superfluous; it is assumed that the user will supply an accurate list of # disks to use. So we just return the arguments. # # $@ given disks to find which are free # # @return a string containing the list of available disks #*/ function find_disks { (( first=0 )) for disk in $@; do [[ $first == 1 ]] && echo -n " " (( first=1 )) case $disk in /dev/*) echo -n "$disk" ;; *) echo -n "/dev/$disk" ;; esac done } # A function to set convenience variables for disks. function set_disks { set -A disk_array $(find_disks $DISKS) [[ -z "$DISK_ARRAY_LIMIT" ]] && typeset -i DISK_ARRAY_LIMIT=5 export DISK="" typeset -i i=0 while (( i < ${#disk_array[*]} && i <= $DISK_ARRAY_LIMIT )); do export DISK${i}="${disk_array[$i]}" DISKSARRAY="$DISKSARRAY ${disk_array[$i]}" (( i = i + 1 )) done export DISK_ARRAY_NUM=$i export DISKSARRAY export disk=$DISK0 } # # Add specified user to specified group # # $1 group name # $2 user name # function add_user # { typeset gname=$1 typeset uname=$2 if (( ${#gname} == 0 || ${#uname} == 0 )); then log_fail "group name or user name are not defined." fi # Check to see if the user exists. $ID $uname > /dev/null 2>&1 && return 0 # Assign 1000 as the base uid typeset -i uid=1000 while true; do typeset -i ret $USERADD -u $uid -g $gname -d /var/tmp/$uname -m $uname ret=$? case $ret in 0) return 0 ;; # The uid is not unique 65) ((uid += 1)) ;; *) return 1 ;; esac if [[ $uid == 65000 ]]; then log_fail "No user id available under 65000 for $uname" fi done return 0 } # # Delete the specified user. # # $1 login name # function del_user # { typeset user=$1 if (( ${#user} == 0 )); then log_fail "login name is necessary." fi if $ID $user > /dev/null 2>&1; then log_must $USERDEL $user fi return 0 } # # Select valid gid and create specified group. # # $1 group name # function add_group # { typeset group=$1 if (( ${#group} == 0 )); then log_fail "group name is necessary." fi # See if the group already exists. $GROUPSHOW $group >/dev/null 2>&1 [[ $? == 0 ]] && return 0 # Assign 100 as the base gid typeset -i gid=100 while true; do $GROUPADD -g $gid $group > /dev/null 2>&1 typeset -i ret=$? case $ret in 0) return 0 ;; # The gid is not unique 65) ((gid += 1)) ;; *) return 1 ;; esac if [[ $gid == 65000 ]]; then log_fail "No user id available under 65000 for $group" fi done } # # Delete the specified group. # # $1 group name # function del_group # { typeset grp=$1 if (( ${#grp} == 0 )); then log_fail "group name is necessary." fi $GROUPDEL -n $grp > /dev/null 2>&1 typeset -i ret=$? case $ret in # Group does not exist, or was deleted successfully. 0|6|65) return 0 ;; # Name already exists as a group name 9) log_must $GROUPDEL $grp ;; *) return 1 ;; esac return 0 } # # This function will return true if it's safe to destroy the pool passed # as argument 1. It checks for pools based on zvols and files, and also # files contained in a pool that may have a different mountpoint. # function safe_to_destroy_pool { # $1 the pool name typeset pool="" typeset DONT_DESTROY="" # We check that by deleting the $1 pool, we're not # going to pull the rug out from other pools. Do this # by looking at all other pools, ensuring that they # aren't built from files or zvols contained in this pool. for pool in $($ZPOOL list -H -o name) do ALTMOUNTPOOL="" # this is a list of the top-level directories in each of the files # that make up the path to the files the pool is based on FILEPOOL=$($ZPOOL status -v $pool | $GREP /$1/ | \ $AWK '{print $1}') # this is a list of the zvols that make up the pool - ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/dsk/$1$" | \ + ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/$1$" | \ $AWK '{print $1}') # also want to determine if it's a file-based pool using an # alternate mountpoint... POOL_FILE_DIRS=$($ZPOOL status -v $pool | \ $GREP / | $AWK '{print $1}' | \ $AWK -F/ '{print $2}' | $GREP -v "dev") for pooldir in $POOL_FILE_DIRS do OUTPUT=$($ZFS list -H -r -o mountpoint $1 | \ $GREP "${pooldir}$" | $AWK '{print $1}') ALTMOUNTPOOL="${ALTMOUNTPOOL}${OUTPUT}" done if [ ! -z "$ZVOLPOOL" ] then DONT_DESTROY="true" log_note "Pool $pool is built from $ZVOLPOOL on $1" fi if [ ! -z "$FILEPOOL" ] then DONT_DESTROY="true" log_note "Pool $pool is built from $FILEPOOL on $1" fi if [ ! -z "$ALTMOUNTPOOL" ] then DONT_DESTROY="true" log_note "Pool $pool is built from $ALTMOUNTPOOL on $1" fi done if [ -z "${DONT_DESTROY}" ] then return 0 else log_note "Warning: it is not safe to destroy $1!" return 1 fi } # # Get IP address of hostname # $1 hostname # function getipbyhost { typeset ip ip=`$ARP $1 2>/dev/null | $AWK -F\) '{print $1}' \ | $AWK -F\( '{print $2}'` $ECHO $ip } # # Setup iSCSI initiator to target # $1 target hostname # function iscsi_isetup { # check svc:/network/iscsi_initiator:default state, try to enable it # if the state is not ON typeset ISCSII_FMRI="svc:/network/iscsi_initiator:default" if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then log_must $SVCADM enable $ISCSII_FMRI typeset -i retry=20 while [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) && \ ( $retry -ne 0 ) ]] do (( retry = retry - 1 )) $SLEEP 1 done if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then log_fail "$ISCSII_FMRI service can not be enabled!" fi fi log_must $ISCSIADM add discovery-address $(getipbyhost $1) log_must $ISCSIADM modify discovery --sendtargets enable log_must $DEVFSADM -i iscsi } # # Check whether iscsi parameter is set as remote # # return 0 if iscsi is set as remote, otherwise 1 # function check_iscsi_remote { if [[ $iscsi == "remote" ]] ; then return 0 else return 1 fi } # # Check if a volume is a valide iscsi target # $1 volume name # return 0 if suceeds, otherwise, return 1 # function is_iscsi_target { typeset dataset=$1 typeset target targets [[ -z $dataset ]] && return 1 targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}') [[ -z $targets ]] && return 1 for target in $targets; do [[ $dataset == $target ]] && return 0 done return 1 } # # Get the iSCSI name of a target # $1 target name # function iscsi_name { typeset target=$1 typeset name [[ -z $target ]] && log_fail "No parameter." if ! is_iscsi_target $target ; then log_fail "Not a target." fi name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \ | $AWK '{print $2}') return $name } # # check svc:/system/iscsitgt:default state, try to enable it if the state # is not ON # function iscsitgt_setup { log_must $RM -f $ISCSITGTFILE if [[ "ON" == $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then log_note "iscsitgt is already enabled" return fi log_must $SVCADM enable -t $ISCSITGT_FMRI typeset -i retry=20 while [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) && \ ( $retry -ne 0 ) ]] do $SLEEP 1 (( retry = retry - 1 )) done if [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then log_fail "$ISCSITGT_FMRI service can not be enabled!" fi log_must $TOUCH $ISCSITGTFILE } # # set DISABLED state of svc:/system/iscsitgt:default # which is the most suiteable state if $ISCSITGTFILE exists # function iscsitgt_cleanup { if [[ -e $ISCSITGTFILE ]]; then log_must $SVCADM disable $ISCSITGT_FMRI log_must $RM -f $ISCSITGTFILE fi } # # Close iSCSI initiator to target # $1 target hostname # function iscsi_iclose { log_must $ISCSIADM modify discovery --sendtargets disable log_must $ISCSIADM remove discovery-address $(getipbyhost $1) $DEVFSADM -Cv } # # Get the available ZFS compression options # $1 option type zfs_set|zfs_compress # function get_compress_opts { typeset COMPRESS_OPTS typeset GZIP_OPTS="gzip gzip-1 gzip-2 gzip-3 gzip-4 gzip-5 \ gzip-6 gzip-7 gzip-8 gzip-9" if [[ $1 == "zfs_compress" ]] ; then COMPRESS_OPTS="on lzjb" elif [[ $1 == "zfs_set" ]] ; then COMPRESS_OPTS="on off lzjb" fi typeset valid_opts="$COMPRESS_OPTS" $ZFS get 2>&1 | $GREP gzip >/dev/null 2>&1 if [[ $? -eq 0 ]]; then valid_opts="$valid_opts $GZIP_OPTS" fi $ECHO "$valid_opts" } # # Check the subcommand/option is supported # function check_opt_support #command, option { typeset command=$1 typeset option=$2 if [[ -z $command ]]; then return 0 elif [[ -z $option ]]; then eval "$ZFS 2>&1 | $GREP '$command' > /dev/null 2>&1" else eval "$ZFS $command 2>&1 | $GREP -- '$option' | \ $GREP -v -- 'User-defined' > /dev/null 2>&1" fi return $? } # # Check the zpool subcommand/option is supported # function check_zpool_opt_support #command, option { typeset command=$1 typeset option=$2 if [[ -z $command ]]; then return 0 elif [[ -z $option ]]; then eval "$ZPOOL 2>&1 | $GREP '$command' > /dev/null 2>&1" else eval "$ZPOOL $command 2>&1 | $GREP -- '$option' > /dev/null 2>&1" fi return $? } # # Verify zfs operation with -p option work as expected # $1 operation, value could be create, clone or rename # $2 dataset type, value could be fs or vol # $3 dataset name # $4 new dataset name # function verify_opt_p_ops { typeset ops=$1 typeset datatype=$2 typeset dataset=$3 typeset newdataset=$4 if [[ $datatype != "fs" && $datatype != "vol" ]]; then log_fail "$datatype is not supported." fi # check parameters accordingly case $ops in create) newdataset=$dataset dataset="" if [[ $datatype == "vol" ]]; then ops="create -V $VOLSIZE" fi ;; clone) if [[ -z $newdataset ]]; then log_fail "newdataset should not be empty" \ "when ops is $ops." fi log_must datasetexists $dataset log_must snapexists $dataset ;; rename) if [[ -z $newdataset ]]; then log_fail "newdataset should not be empty" \ "when ops is $ops." fi log_must datasetexists $dataset log_mustnot snapexists $dataset ;; *) log_fail "$ops is not supported." ;; esac # make sure the upper level filesystem does not exist if datasetexists ${newdataset%/*} ; then log_must $ZFS destroy -rRf ${newdataset%/*} fi # without -p option, operation will fail log_mustnot $ZFS $ops $dataset $newdataset log_mustnot datasetexists $newdataset ${newdataset%/*} # with -p option, operation should succeed log_must $ZFS $ops -p $dataset $newdataset if ! datasetexists $newdataset ; then log_fail "-p option does not work for $ops" fi # when $ops is create or clone, redo the operation still return zero if [[ $ops != "rename" ]]; then log_must $ZFS $ops -p $dataset $newdataset fi return 0 } function get_disk_guid { typeset diskname=$1 lastcwd=$(pwd) cd /dev guid=$($ZDB -l ${diskname} | ${AWK} '/^ guid:/ {print $2}' | head -1) cd $lastcwd echo $guid } # # Get cachefile for a pool. # Prints the cache file, if there is one. # Returns 0 for a default zpool.cache, 1 for an explicit one, and 2 for none. # function cachefile_for_pool { typeset pool=$1 cachefile=$(get_pool_prop cachefile $pool) [[ $? != 0 ]] && return 1 case "$cachefile" in none) ret=2 ;; "-") ret=2 for dir in /boot/zfs /etc/zfs; do if [[ -f "${dir}/zpool.cache" ]]; then cachefile="${dir}/zpool.cache" ret=0 break fi done ;; *) ret=1; esac [[ $ret -eq 0 || $ret -eq 1 ]] && print "$cachefile" return $ret } # # Assert that the pool is in the appropriate cachefile. # function assert_pool_in_cachefile { typeset pool=$1 cachefile=$(cachefile_for_pool $pool) [ $? -ne 0 ] && log_fail "ERROR: Cachefile not created for '$pool'?" log_must test -e "${cachefile}" log_must zdb -U ${cachefile} -C ${pool} } # # Get the zdb options given the cachefile state of the pool. # function zdb_cachefile_opts { typeset pool=$1 typeset vdevdir=$2 typeset opts if poolexists "$pool"; then cachefile=$(cachefile_for_pool $pool) typeset -i ret=$? case $ret in 0) opts="-C" ;; 1) opts="-U $cachefile -C" ;; 2) opts="-eC" ;; *) log_fail "Unknown return '$ret'" ;; esac else opts="-eC" [[ -n "$vdevdir" ]] && opts="$opts -p $vdevdir" fi echo "$opts" } # # Get configuration of pool # $1 pool name # $2 config name # function get_config { typeset pool=$1 typeset config=$2 typeset vdevdir=$3 typeset alt_root typeset zdb_opts zdb_opts=$(zdb_cachefile_opts $pool $vdevdir) value=$($ZDB $zdb_opts $pool | $GREP "$config:" | $AWK -F: '{print $2}') if [[ -n $value ]] ; then value=${value#'} value=${value%'} else return 1 fi echo $value return 0 } # # Privated function. Random select one of items from arguments. # # $1 count # $2-n string # function _random_get { typeset cnt=$1 shift typeset str="$@" typeset -i ind ((ind = RANDOM % cnt + 1)) typeset ret=$($ECHO "$str" | $CUT -f $ind -d ' ') $ECHO $ret } # # Random select one of item from arguments which include NONE string # function random_get_with_non { typeset -i cnt=$# ((cnt =+ 1)) _random_get "$cnt" "$@" } # # Random select one of item from arguments which doesn't include NONE string # function random_get { _random_get "$#" "$@" } # # The function will generate a dataset name with specific length # $1, the length of the name # $2, the base string to construct the name # function gen_dataset_name { typeset -i len=$1 typeset basestr="$2" typeset -i baselen=${#basestr} typeset -i iter=0 typeset l_name="" if (( len % baselen == 0 )); then (( iter = len / baselen )) else (( iter = len / baselen + 1 )) fi while (( iter > 0 )); do l_name="${l_name}$basestr" (( iter -= 1 )) done $ECHO $l_name } # # Ensure that a given path has been synced, not just ZIL committed. # # XXX The implementation currently requires calling 'zpool history'. On # FreeBSD, the sync(8) command (via $SYNC) calls zfs_sync() which just # does a zil_commit(), as opposed to a txg_wait_synced(). For things that # require writing to their final destination (e.g. for intentional # corruption purposes), zil_commit() is not good enough. # function force_sync_path # path { typeset path="$1" zfspath=$($DF $path 2>/dev/null | tail -1 | cut -d" " -f1 | cut -d/ -f1) [ -z "$zfspath" ] && return false log_note "Force syncing ${zfspath} for ${path} ..." $ZPOOL history $zfspath >/dev/null 2>&1 } # # Get cksum tuple of dataset # $1 dataset name # # zdb output is like below # " Dataset pool/fs [ZPL], ID 978, cr_txg 2277, 19.0K, 5 objects, # rootbp [L0 DMU objset] 400L/200P DVA[0]=<0:1880c00:200> # DVA[1]=<0:341880c00:200> fletcher4 lzjb LE contiguous birth=2292 fill=5 # cksum=989930ccf:4014fe00c83:da5e388e58b4:1f7332052252ac " # function datasetcksum { typeset cksum $SYNC cksum=$($ZDB -vvv $1 | $GREP "^Dataset $1 \[" | $GREP "cksum" \ | $AWK -F= '{print $6}') $ECHO $cksum } # # Get cksum of file # #1 file path # function checksum { typeset cksum cksum=$($CKSUM $1 | $AWK '{print $1}') $ECHO $cksum } # # Get the given disk/slice state from the specific field of the pool # function get_device_state #pool disk field("", "spares","logs") { typeset pool=$1 - typeset disk=${2#/dev/dsk/} - disk=${disk#/dev/rdsk/} + typeset disk=${2#/dev/} + disk=${disk#/dev/} disk=${disk#/dev/} typeset field=${3:-$pool} state=$($ZPOOL status -v "$pool" 2>/dev/null | \ $NAWK -v device=$disk -v pool=$pool -v field=$field \ 'BEGIN {startconfig=0; startfield=0; } /config:/ {startconfig=1} (startconfig==1)&&($1==field) {startfield=1; next;} (startfield==1)&&($1==device) {print $2; exit;} (startfield==1)&&(NF>=3)&&($(NF-1)=="was")&&($NF==device) {print $2; exit;} (startfield==1)&&($1==field || $1 ~ "^spares$" || $1 ~ "^logs$") {startfield=0}') print $state } # # print the given directory filesystem type # # $1 directory name # function get_fstype { typeset dir=$1 if [[ -z $dir ]]; then log_fail "Usage: get_fstype " fi $DF -T $dir | $AWK '{print $2}' } # # Given a disk, label it to VTOC regardless what label was on the disk # $1 disk # function labelvtoc { typeset disk=$1 if [[ -z $disk ]]; then log_fail "The disk name is unspecified." fi typeset label_file=$TMPDIR/labelvtoc.${TESTCASE_ID} typeset arch=$($UNAME -p) if [[ $arch == "i386" ]]; then $ECHO "label" > $label_file $ECHO "0" >> $label_file $ECHO "" >> $label_file $ECHO "q" >> $label_file $ECHO "q" >> $label_file $FDISK -B $disk >/dev/null 2>&1 # wait a while for fdisk finishes $SLEEP 60 elif [[ $arch == "sparc" ]]; then $ECHO "label" > $label_file $ECHO "0" >> $label_file $ECHO "" >> $label_file $ECHO "" >> $label_file $ECHO "" >> $label_file $ECHO "q" >> $label_file else log_fail "unknown arch type" fi $FORMAT -e -s -d $disk -f $label_file typeset -i ret_val=$? $RM -f $label_file # # wait the format to finish # $SLEEP 60 if (( ret_val != 0 )); then log_fail "unable to label $disk as VTOC." fi return 0 } # # Detect if the given filesystem property is supported in this release # # 0 Yes, it is supported # !0 No, it is not supported # function fs_prop_exist { typeset prop=$1 if [[ -z $prop ]]; then log_fail "Usage: fs_prop_exist " return 1 fi # # If the property is shortened column name, # convert it to the standard name # case $prop in avail) prop=available ;; refer) prop=referenced ;; volblock) prop=volblocksize ;; compress) prop=compression ;; rdonly) prop=readonly ;; recsize) prop=recordsize ;; reserv) prop=reservation ;; refreserv) prop=refreservation ;; esac # # The zfs get output looks like the following # # # The following properties are supported: # # PROPERTY EDIT INHERIT VALUES # # available NO NO # compressratio NO NO <1.00x or higher if compressed> # creation NO NO # ... ... # zoned YES YES on | off # # Sizes are specified in bytes with standard units such as K, M, G, etc. # # # Start to extract property from the first blank line after 'PROPERTY' # and stop at the next blank line # $ZFS get 2>&1 | \ $AWK '/PROPERTY/ {start=1; next} /Sizes/ {start=0} start==1 {print $1}' | \ $GREP -w "$prop" > /dev/null 2>&1 return $? } # # Detect if the given pool property is supported in this release # # 0 Yes, it is supported # !0 No, it is not supported # function pool_prop_exist { typeset prop=$1 if [[ -z $prop ]]; then log_fail "Usage: pool_prop_exist " return 1 fi # # If the property is shortened column name, # convert it to the standard name # case $prop in avail) prop=available ;; cap) prop=capacity ;; replace) prop=autoreplace ;; esac # # The zpool get output looks like the following # # usage: # get <"all" | property[,...]> ... # # the following properties are supported: # # PROPERTY EDIT VALUES # # available NO # capacity NO # guid NO # health NO # size NO # used NO # altroot YES # autoreplace YES on | off # bootfs YES # cachefile YES | none # delegation YES on | off # failmode YES wait | continue | panic # version YES $ZPOOL get 2>&1 | \ $AWK '/PROPERTY/ {start=1; next} start==1 {print $1}' | \ $GREP -w "$prop" > /dev/null 2>&1 return $? } # # check if the system was installed as zfsroot or not # return: 0 ture, otherwise false # function is_zfsroot { $DF -T / | $GREP -q zfs } # # get the root filesystem name if it's zfsroot system. # # return: root filesystem name function get_rootfs { typeset rootfs="" rootfs=$($MOUNT | $AWK '$3 == "\/" && $4~/zfs/ {print $1}') if [[ -z "$rootfs" ]]; then log_fail "Can not get rootfs" fi $ZFS list $rootfs > /dev/null 2>&1 if (( $? == 0 )); then $ECHO $rootfs else log_fail "This is not a zfsroot system." fi } # # get the rootfs's pool name # return: # rootpool name # function get_rootpool { typeset rootfs="" typeset rootpool="" rootfs=$(get_rootfs) rootpool=`$ECHO $rootfs | awk -F\/ '{print $1}'` echo $rootpool } # # Get the sub string from specified source string # # $1 source string # $2 start position. Count from 1 # $3 offset # function get_substr #src_str pos offset { typeset pos offset $ECHO $1 | \ $NAWK -v pos=$2 -v offset=$3 '{print substr($0, pos, offset)}' } # # Get the directory path of given device # function get_device_dir #device { typeset device=$1 $ECHO "/dev" } # # Get the package name # function get_package_name { typeset dirpath=${1:-$STC_NAME} print "SUNWstc-${dirpath}" | /usr/bin/sed -e "s/\//-/g" } # # Get the word numbers from a string separated by white space # function get_word_count { $ECHO $1 | $WC -w } # # To verify if the require numbers of disks is given # function verify_disk_count { typeset -i min=${2:-1} typeset -i count=$(get_word_count "$1") if (( count < min )); then atf_skip "A minimum of $min disks is required to run." \ " You specified $count disk(s)" fi } # # Verify that vfs.zfs.vol.recursive is set, so pools can be created using zvols # as backing stores. # function verify_zvol_recursive { if [ "`sysctl -n vfs.zfs.vol.recursive`" -ne 1 ]; then atf_skip "Recursive ZVOLs not enabled" fi } # # bsdmap disk/slice number to a device path # function bsddevmap { typeset arg=$1 echo $arg | egrep "*s[0-9]$" > /dev/null 2>&1 if [ $? -eq 0 ] then n=`echo $arg| wc -c` set -A map a b c d e f g h i j s=`echo $arg | cut -c $((n-1))` arg=${arg%s[0-9]}${map[$s]} fi echo $arg } # # Get the name of the snapshots directory. Traditionally .zfs/snapshots # function get_snapdir_name { echo ".zfs/snapshot" } # # Unmount all ZFS filesystems except for those that are in the KEEP variable # function unmount_all_safe { echo $(all_pools) | \ $XARGS -n 1 $ZFS list -H -o name -t all -r | \ $XARGS -n 1 $ZFS unmount } # # Return the highest pool version that this OS can create # function get_zpool_version { # We assume output from zpool upgrade -v of the form: # # This system is currently running ZFS version 2. # . # . typeset ZPOOL_VERSION=$($ZPOOL upgrade -v | $HEAD -1 | \ $AWK '{print $NF}' | $SED -e 's/\.//g') # Starting with version 5000, the output format changes to: # This system supports ZFS pool feature flags. # . # . if [[ $ZPOOL_VERSION = "flags" ]]; then ZPOOL_VERSION=5000 fi echo $ZPOOL_VERSION } # Ensures that zfsd is running, starting it if necessary. Every test that # interacts with zfsd must call this at startup. This is intended primarily # to eliminate interference from outside the test suite. function ensure_zfsd_running { if ! service zfsd status > /dev/null 2>&1; then service zfsd start || service zfsd onestart service zfsd status > /dev/null 2>&1 || log_unsupported "Test requires zfsd" fi } # Temporarily stops ZFSD, because it can interfere with some tests. If this # function is used, then restart_zfsd _must_ be called in the cleanup routine. function stop_zfsd { $RM -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests if [[ -n "$ZFSD" && -x "$ZFSD" ]]; then if /etc/rc.d/zfsd status > /dev/null; then log_note "Stopping zfsd" $TOUCH $TMPDIR/.zfsd_enabled_during_stf_zfs_tests /etc/rc.d/zfsd stop || /etc/rc.d/zfsd onestop fi fi } # Restarts zfsd after it has been stopped by stop_zfsd. Intelligently restarts # only iff zfsd was running at the time stop_zfsd was called. function restart_zfsd { if [[ -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests ]]; then log_note "Restarting zfsd" /etc/rc.d/zfsd start || /etc/rc.d/zfsd onestart fi $RM -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests } # # Using the given , obtain the value of the property for # the given identified by numeric id. # function get_tvd_prop # vdev tvd propname { typeset vdev=$1 typeset -i tvd=$2 typeset propname=$3 $ZDB -l $vdev | $AWK -v tvd=$tvd -v prop="${propname}:" ' BEGIN { start = 0; } /^ id:/ && ($2==tvd) { start = 1; next; } (start==0) { next; } /^ [a-z]+/ && ($1==prop) { print $2; exit; } /^ children/ { exit; } ' } # # Convert a DVA into a physical block address. Prints number of blocks. # This takes the usual printed form, in which offsets are left shifted so # they represent bytes rather than the native sector count. # function dva_to_block_addr # dva { typeset dva=$1 typeset offcol=$(echo $dva | cut -f2 -d:) typeset -i offset="0x${offcol}" # First add 4MB to skip the boot blocks and first two vdev labels, # then convert to 512 byte blocks (for use with dd). Note that this # differs from simply adding 8192 blocks, since the input offset is # given in bytes and has the actual ashift baked in. (( offset += 4*1024*1024 )) (( offset >>= 9 )) echo "$offset" } # # Convert a RAIDZ DVA into a physical block address. This has the same # output as dva_to_block_addr (number of blocks from beginning of device), but # is more complicated due to RAIDZ. ashift is normally always 9, but RAIDZ # uses the actual tvd ashift instead. Furthermore, the number of vdevs changes # the actual block for each device. # function raidz_dva_to_block_addr # dva ncols ashift { typeset dva=$1 typeset -i ncols=$2 typeset -i ashift=$3 typeset -i offset=0x$(echo $dva | cut -f2 -d:) (( offset >>= ashift )) typeset -i ioff=$(( (offset + ncols - 1) / ncols )) # Now add the front 4MB and return. (( ioff += ( 4194304 >> $ashift ) )) echo "$ioff" } # # Return the vdevs for the given toplevel vdev number. # Child vdevs will only be included if they are ONLINE. Output format: # # [: ...] # # Valid toplevel vdev types are mirror, raidz[1-3], leaf (which can be a # disk or a file). Note that 'nchildren' can be larger than the number of # returned children; it represents the number of children regardless of how # many are actually online. # function vdevs_for_tvd # pool tvd { typeset pool=$1 typeset -i tvd=$2 $ZPOOL status $pool | $AWK -v want_tvd=$tvd ' BEGIN { start = 0; tvd = -1; lvd = -1; type = "UNKNOWN"; disks = ""; disk = ""; nchildren = 0; } /NAME.*STATE/ { start = 1; next; } (start==0) { next; } (tvd > want_tvd) { exit; } END { print type " " nchildren " " disks; } length(disk) > 0 { if (length(disks) > 0) { disks = disks " "; } if (substr(disk, 0, 1) == "/") { disks = disks disk; } else { disks = disks "/dev/" disk; } disk = ""; } /^\t(spares|logs)/ { tvd = want_tvd + 1; next; } /^\t (mirror|raidz[1-3])-[0-9]+/ { tvd += 1; (tvd == want_tvd) && type = substr($1, 0, 6); next; } /^\t [\/A-Za-z]+/ { tvd += 1; if (tvd == want_tvd) { (( nchildren += 1 )) type = "leaf"; ($2 == "ONLINE") && disk = $1; } next; } (tvd < want_tvd) { next; } /^\t spare-[0-9]+/ { next; } /^\t [\/A-Za-z]+/ { (( nchildren += 1 )) ($2 == "ONLINE") && disk = $1; next; } /^\t [\/A-Za-z]+/ { (( nchildren += 1 )) ($2 == "ONLINE") && disk = $1; next; } ' } # # Get a vdev path, ashift & offset for a given pool/dataset and DVA. # If desired, can also select the toplevel vdev child number. # function dva_to_vdev_ashift_off # pool/dataset dva [leaf_vdev_num] { typeset poollike=$1 typeset dva=$2 typeset -i leaf_vdev_num=$3 # vdevs are normally 0-indexed while arguments are 1-indexed. (( leaf_vdev_num += 1 )) # Strip any child datasets or snapshots. pool=$(echo $poollike | sed -e 's,[/@].*,,g') tvd=$(echo $dva | cut -d: -f1) set -- $(vdevs_for_tvd $pool $tvd) log_debug "vdevs_for_tvd: $* " tvd_type=$1; shift nchildren=$1; shift lvd=$(eval echo \$$leaf_vdev_num) log_debug "type='$tvd_type' children='$nchildren' lvd='$lvd' dva='$dva'" case $tvd_type in raidz*) ashift=$(get_tvd_prop $lvd $tvd ashift) log_debug "raidz: ashift='${ashift}'" off=$(raidz_dva_to_block_addr $dva $nchildren $ashift) ;; *) ashift=9 off=$(dva_to_block_addr $dva) ;; esac echo "${lvd}:${ashift}:${off}" } # # Get the DVA for the specified dataset's given filepath. # function file_dva # dataset filepath [level] [offset] [dva_num] { typeset dataset=$1 typeset filepath=$2 typeset -i level=$3 typeset -i offset=$4 typeset -i dva_num=$5 typeset -li blksz=0 typeset -li blknum=0 typeset -li startoff typeset -li inode eval `$STAT -s "$filepath"` inode="$st_ino" # The inner match is for 'DVA[0]=<0:1b412600:200>', in which the # text surrounding the actual DVA is a fixed size with 8 characters # before it and 1 after. $ZDB -P -vvvvv $dataset $inode | \ $AWK -v level=${level} -v dva_num=${dva_num} ' BEGIN { stage = 0; } (stage == 0) && ($1=="Object") { stage = 1; next; } (stage == 1) { print $3 " " $4; stage = 2; next; } (stage == 2) && /^Indirect blocks/ { stage=3; next; } (stage < 3) { next; } match($2, /L[0-9]/) { if (substr($2, RSTART+1, RLENGTH-1) != level) { next; } } match($3, /DVA\[.*>/) { dva = substr($3, RSTART+8, RLENGTH-9); if (substr($3, RSTART+4, 1) == dva_num) { print $1 " " dva; } } ' | \ while read line; do log_debug "params='$blksz/$blknum/$startoff' line='$line'" if (( blksz == 0 )); then typeset -i iblksz=$(echo $line | cut -d " " -f1) typeset -i dblksz=$(echo $line | cut -d " " -f2) # Calculate the actual desired block starting offset. if (( level > 0 )); then typeset -i nbps_per_level typeset -i indsz typeset -i i=0 (( nbps_per_level = iblksz / 128 )) (( blksz = dblksz )) for (( i = 0; $i < $level; i++ )); do (( blksz *= nbps_per_level )) done else blksz=$dblksz fi (( blknum = offset / blksz )) (( startoff = blknum * blksz )) continue fi typeset lineoffstr=$(echo $line | cut -d " " -f1) typeset -i lineoff=$(printf "%d" "0x${lineoffstr}") typeset dva="$(echo $line | cut -d " " -f2)" log_debug "str='$lineoffstr' lineoff='$lineoff' dva='$dva'" if [[ -n "$dva" ]] && (( lineoff == startoff )); then echo $line | cut -d " " -f2 return 0 fi done return 1 } # # Corrupt the given dataset's filepath file. This will obtain the first # level 0 block's DVA and scribble random bits on it. # function corrupt_file # dataset filepath [leaf_vdev_num] { typeset dataset=$1 typeset filepath=$2 typeset -i leaf_vdev_num="$3" dva=$(file_dva $dataset $filepath) [ $? -ne 0 ] && log_fail "ERROR: Can't find file $filepath on $dataset" vdoff=$(dva_to_vdev_ashift_off $dataset $dva $leaf_vdev_num) vdev=$(echo $vdoff | cut -d: -f1) ashift=$(echo $vdoff | cut -d: -f2) off=$(echo $vdoff | cut -d: -f3) blocksize=$(( 1 << $ashift )) log_note "Corrupting ${dataset}'s $filepath on $vdev at DVA $dva with ashift $ashift" log_must $DD if=/dev/urandom bs=$blocksize of=$vdev seek=$off count=1 conv=notrunc } # # Given a number of files, this function will iterate through # the loop creating the specified number of files, whose names # will start with . # # The argument is special: it can be "ITER", in which case # the -d argument will be the value of the current iteration. It # can be 0, in which case it will always be 0. Otherwise, it will # always be the given value. # # If is specified, a snapshot will be taken using the # argument as the snapshot basename. # function populate_dir # basename num_files write_count blocksz data snapbase { typeset basename=$1 typeset -i num_files=$2 typeset -i write_count=$3 typeset -i blocksz=$4 typeset -i i typeset data=$5 typeset snapbase="$6" log_note "populate_dir: data='$data'" for (( i = 0; i < num_files; i++ )); do case "$data" in 0) d=0 ;; ITER) d=$i ;; *) d=$data ;; esac log_must $FILE_WRITE -o create -c $write_count \ -f ${basename}.$i -b $blocksz -d $d [ -n "$snapbase" ] && log_must $ZFS snapshot ${snapbase}.${i} done } # Reap all children registered in $child_pids. function reap_children { [ -z "$child_pids" ] && return for wait_pid in $child_pids; do log_must $KILL $wait_pid done child_pids="" } # Busy a path. Expects to be reaped via reap_children. Tries to run as # long and slowly as possible. [num] is taken as a hint; if such a file # already exists a different one will be chosen. function busy_path # [num] { typeset busypath=$1 typeset -i num=$2 while :; do busyfile="$busypath/busyfile.${num}" [ ! -f "$busyfile" ] && break done cmd="$DD if=/dev/urandom of=$busyfile bs=512" ( cd $busypath && $cmd ) & typeset pid=$! $SLEEP 1 log_must $PS -p $pid child_pids="$child_pids $pid" } Index: head/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib =================================================================== --- head/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib (revision 331612) +++ head/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib (revision 331613) @@ -1,152 +1,152 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zpool_add.kshlib 1.3 07/03/14 SMI" # . $STF_SUITE/include/libtest.kshlib # # check if the contains ... # # $1 pool # $2..n ... # # Return 0 if are contained in the ; 1 if not used; 2 if pool # name is missing # function iscontained { typeset pool=$1 typeset vdev if [[ -z $pool ]]; then log_note "Missing pool name." return 2 fi shift for vdev in $@; do -# remove /dev/dsk in vdev if there is +# remove /dev/ in vdev if there is vdev=${vdev#/dev/} $ZPOOL status "$pool" | $AWK '$1 == vdevname {exit 1}' \ vdevname=$vdev >/dev/null 2>&1 (( $? != 1 )) && \ return 1 done return 0; } # # Find the storage device in /etc/fstab # function find_vfstab_dev { typeset vfstab="/etc/fstab" typeset tmpfile="$TMPDIR/fstab.tmp" typeset vfstabdev typeset vfstabdevs="" typeset line $CAT $vfstab | $GREP "^/dev/" >$tmpfile while read -r line do vfstabdev=`$ECHO "$line" | $AWK '{print $1}'` vfstabdev=${vfstabdev%%:} vfstabdevs="$vfstabdev $vfstabdevs" done <$tmpfile $RM -f $tmpfile $ECHO $vfstabdevs } # # Find the storage device in /etc/mnttab # function find_mnttab_dev { typeset mnttab="/etc/mnttab" typeset tmpfile="$TMPDIR/mnttab.tmp" typeset mnttabdev typeset mnttabdevs="" typeset line $MOUNT | $GREP "^/dev/" >$tmpfile while read -r line do mnttabdev=`$ECHO "$line" | $AWK '{print $1}'` mnttabdev=${mnttabdev%%:} mnttabdevs="$mnttabdev $mnttabdevs" done <$tmpfile $RM -f $tmpfile $ECHO $mnttabdevs } # # Save the systme current dump device configuration # function save_dump_dev { typeset dumpdev typeset swapdev typeset swapdevs="" typeset tmpfile="$TMPDIR/swapinfo.tmp" dumpdev=`readlink /dev/dumpdev` swapinfo | $GREP "^/dev/" >$tmpfile while read -r line do swapdev=`$ECHO "$line" | $AWK '{print $1}'` swapdev=${swapdev%%:} swapdevs="$swapdev $swapdevs" done <$tmpfile $ECHO "$dumpdev $swapdevs" } # # Common cleanup routine for partitions used in testing # function partition_cleanup { log_note "Cleaning up partitions..." if [[ -n $DISK ]]; then partition_disk $SIZE $DISK 7 else typeset disk="" for disk in $DISK0 $DISK1; do partition_disk $SIZE $disk 7 done fi } Index: head/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib =================================================================== --- head/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib (revision 331612) +++ head/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib (revision 331613) @@ -1,1902 +1,1902 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)delegate_common.kshlib 1.6 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib # # Cleanup exist user/group. # function cleanup_user_group { typeset i for i in $STAFF1 $STAFF2 $OTHER1 $OTHER2 ; do del_user $i done for i in $STAFF_GROUP $OTHER_GROUP ; do del_group $i done return 0 } # # Restore test file system to the original status. # function restore_root_datasets { if datasetexists $ROOT_TESTFS ; then log_must $ZFS destroy -Rf $ROOT_TESTFS fi log_must $ZFS create $ROOT_TESTFS if is_global_zone ; then if datasetexists $ROOT_TESTVOL ; then log_must $ZFS destroy -Rf $ROOT_TESTVOL fi log_must $ZFS create -V $VOLSIZE $ROOT_TESTVOL fi return 0 } # # Verify the specified user have permission on the dataset # # $1 dataset # $2 permissions which are separated by comma(,) # $3-n users # function verify_perm { typeset dtst=$1 typeset permissions=$2 shift 2 if [[ -z $@ || -z $permissions || -z $dtst ]]; then return 1 fi typeset type=$(get_prop type $dtst) permissions=$($ECHO $permissions | $TR -s "," " ") typeset user for user in $@; do typeset perm for perm in $permissions; do typeset -i ret=1 if [[ $type == "filesystem" ]]; then check_fs_perm $user $perm $dtst ret=$? elif [[ $type == "volume" ]]; then check_vol_perm $user $perm $dtst ret=$? fi if ((ret != 0)) ; then log_note "Fail: $user should have $perm " \ "on $dtst" return 1 fi done done return 0 } # # Verify the specified user have no permission on the dataset # # $1 dataset # $2 permissions which are separated by comma(,) # $3-n users # function verify_noperm { typeset dtst=$1 typeset permissions=$2 shift 2 if [[ -z $@ || -z $permissions || -z $dtst ]]; then return 1 fi typeset type=$(get_prop type $dtst) permissions=$($ECHO $permissions | $TR -s "," " ") typeset user for user in $@; do typeset perm for perm in $permissions; do typeset -i ret=1 if [[ $type == "filesystem" ]]; then check_fs_perm $user $perm $dtst ret=$? elif [[ $type == "volume" ]]; then check_vol_perm $user $perm $dtst ret=$? fi if ((ret == 0)) ; then log_note "Fail: $user should not have $perm " \ "on $dtst" return 1 fi done done return 0 } function user_run { typeset user=$1 typeset group=$($GROUPS $user) shift eval \$RUNWATTR -u \$user -g \$group \"$@\" > /dev/null 2>&1 return $? } function common_perm { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset -i ret=1 case $perm in send) verify_send $user $perm $dtst ret=$? ;; allow) verify_allow $user $perm $dtst ret=$? ;; userprop) verify_userprop $user $perm $dtst ret=$? ;; compression|checksum|readonly) verify_ccr $user $perm $dtst ret=$? ;; copies) verify_copies $user $perm $dtst ret=$? ;; reservation) verify_reservation $user $perm $dtst ret=$? ;; *) ret=1 ;; esac return $ret } function check_fs_perm { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset -i ret=1 case $perm in create) verify_fs_create $user $perm $fs ret=$? ;; destroy) verify_fs_destroy $user $perm $fs ret=$? ;; snapshot) verify_fs_snapshot $user $perm $fs ret=$? ;; rollback) verify_fs_rollback $user $perm $fs ret=$? ;; clone) verify_fs_clone $user $perm $fs ret=$? ;; rename) verify_fs_rename $user $perm $fs ret=$? ;; mount) verify_fs_mount $user $perm $fs ret=$? ;; share) verify_fs_share $user $perm $fs ret=$? ;; mountpoint) verify_fs_mountpoint $user $perm $fs ret=$? ;; promote) verify_fs_promote $user $perm $fs ret=$? ;; canmount) verify_fs_canmount $user $perm $fs ret=$? ;; recordsize) verify_fs_recordsize $user $perm $fs ret=$? ;; quota) verify_fs_quota $user $perm $fs ret=$? ;; aclmode) verify_fs_aclmode $user $perm $fs ret=$? ;; aclinherit) verify_fs_aclinherit $user $perm $fs ret=$? ;; snapdir) verify_fs_snapdir $user $perm $fs ret=$? ;; atime|exec|devices|setuid|xattr) verify_fs_aedsx $user $perm $fs ret=$? ;; zoned) verify_fs_zoned $user $perm $fs ret=$? ;; sharenfs) verify_fs_sharenfs $user $perm $fs ret=$? ;; shareiscsi) verify_fs_shareiscsi $user $perm $fs ret=$? ;; receive) verify_fs_receive $user $perm $fs ret=$? ;; *) common_perm $user $perm $fs ret=$? ;; esac return $ret } function check_vol_perm { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset -i ret=1 case $perm in destroy) verify_vol_destroy $user $perm $vol ret=$? ;; snapshot) verify_vol_snapshot $user $perm $vol ret=$? ;; rollback) verify_vol_rollback $user $perm $vol ret=$? ;; clone) verify_vol_clone $user $perm $vol ret=$? ;; rename) verify_vol_rename $user $perm $vol ret=$? ;; promote) verify_vol_promote $user $perm $vol ret=$? ;; volsize) verify_vol_volsize $user $perm $vol ret=$? ;; shareiscsi) verify_vol_shareiscsi $user $perm $vol ret=$? ;; *) common_perm $user $perm $vol ret=$? ;; esac return $ret } function setup_unallow_testenv { log_must restore_root_datasets log_must $ZFS create $SUBFS for dtst in $DATASETS ; do log_must $ZFS allow -l $STAFF1 $LOCAL_SET $dtst log_must $ZFS allow -d $STAFF2 $DESC_SET $dtst log_must $ZFS allow $OTHER1 $LOCAL_DESC_SET $dtst log_must $ZFS allow $OTHER2 $LOCAL_DESC_SET $dtst log_must verify_perm $dtst $LOCAL_SET $STAFF1 log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER1 log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER2 if [[ $dtst == $ROOT_TESTFS ]]; then log_must verify_perm $SUBFS $DESC_SET $STAFF2 log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER1 log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER2 fi done return 0 } # # Verify permission send for specified user on the dataset # $1 user # $2 permission # $3 dataset # function verify_send { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset oldval typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset snap=$dtst@snap.$stamp typeset -i ret=1 log_must $ZFS snapshot $snap typeset bak_user=$TMPDIR/bak.$user.$stamp typeset bak_root=$TMPDIR/bak.root.$stamp user_run $user eval "$ZFS send $snap > $bak_user" log_must eval "$ZFS send $snap > $bak_root" if [[ $(checksum $bak_user) == $(checksum $bak_root) ]]; then ret=0 fi $RM -rf $bak_user > /dev/null $RM -rf $bak_root > /dev/null return $ret } function verify_fs_receive { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset newfs=$fs/newfs.$stamp typeset newvol=$fs/newvol.$stamp typeset bak_user=$TMPDIR/bak.$user.$stamp typeset bak_root=$TMPDIR/bak.root.$stamp log_must $ZFS create $newfs typeset datasets="$newfs" if is_global_zone ; then log_must $ZFS create -V $VOLSIZE $newvol datasets="$newfs $newvol" fi for dtst in $datasets ; do typeset dtstsnap=$dtst@snap.$stamp log_must $ZFS snapshot $dtstsnap log_must eval "$ZFS send $dtstsnap > $bak_root" log_must $ZFS destroy -rf $dtst user_run $user eval "$ZFS receive $dtst < $bak_root" if datasetexists $dtstsnap ; then return 1 fi log_must $ZFS allow $user create $fs user_run $user eval "$ZFS receive $dtst < $bak_root" log_must $ZFS unallow $user create $fs if datasetexists $dtstsnap ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user eval "$ZFS receive $dtst < $bak_root" log_must $ZFS unallow $user mount $fs if datasetexists $dtstsnap ; then return 1 fi log_must $ZFS allow $user mount,create $fs user_run $user eval "$ZFS receive $dtst < $bak_root" log_must $ZFS unallow $user mount,create $fs if ! datasetexists $dtstsnap ; then return 1 fi # check the data integrity log_must eval "$ZFS send $dtstsnap > $bak_user" log_must $ZFS destroy -rf $dtst log_must eval "$ZFS receive $dtst < $bak_root" log_must eval "$ZFS send $dtstsnap > $bak_root" log_must $ZFS destroy -rf $dtst if [[ $(checksum $bak_user) != $(checksum $bak_root) ]]; then return 1 fi $RM -rf $bak_user > /dev/null $RM -rf $bak_root > /dev/null done return 0 } function verify_userprop { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') user_run $user $ZFS set "$user:ts=$stamp" $dtst if [[ $stamp != $(get_prop "$user:ts" $dtst) ]]; then return 1 fi return 0 } function verify_ccr { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $dtst) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $dtst" user_run $user $ZFS set $perm=${modes[$n]} $dtst if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then return 1 fi return 0 } function verify_copies { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset oldval set -A modes 1 2 3 oldval=$(get_prop $perm $dtst) if [[ $oldval -eq 1 ]]; then n=1 elif [[ $oldval -eq 2 ]]; then n=2 elif [[ $oldval -eq 3 ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $dtst" user_run $user $ZFS set $perm=${modes[$n]} $dtst if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then return 1 fi return 0 } function verify_reservation { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset value32m=$(( 1024 * 1024 * 32 )) typeset oldval=$(get_prop reservation $dtst) user_run $user $ZFS set reservation=$value32m $dtst if [[ $value32m != $(get_prop reservation $dtst) ]]; then log_must $ZFS set reservation=$oldval $dtst return 1 fi log_must $ZFS set reservation=$oldval $dtst return 0 } function verify_fs_create { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset newfs=$fs/nfs.$stamp typeset newvol=$fs/nvol.$stamp typeset check_refrev=false user_run $user $ZFS create $newfs if datasetexists $newfs ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS create $newfs log_must $ZFS unallow $user mount $fs if ! datasetexists $newfs ; then return 1 fi if support_refrev $newfs; then check_refrev=true fi log_must $ZFS destroy $newfs if is_global_zone ; then # mount permission is required for sparse volume user_run $user $ZFS create -V 150m -s $newvol if datasetexists $newvol ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS create -V 150m -s $newvol log_must $ZFS unallow $user mount $fs if ! datasetexists $newvol ; then return 1 fi log_must $ZFS destroy $newvol # mount and reserveration permission are # required for normal volume user_run $user $ZFS create -V 150m $newvol if datasetexists $newvol ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS create -V 150m $newvol log_must $ZFS unallow $user mount $fs if datasetexists $newvol ; then return 1 fi log_must $ZFS allow $user reservation $fs user_run $user $ZFS create -V 150m $newvol log_must $ZFS unallow $user reservation $fs if datasetexists $newvol ; then return 1 fi if [[ $check_refrev == true ]]; then log_must $ZFS allow $user refreservation $fs user_run $user $ZFS create -V 150m $newvol log_must $ZFS unallow $user refreservation $fs if datasetexists $newvol ; then return 1 fi fi log_must $ZFS allow $user mount $fs log_must $ZFS allow $user reservation $fs if [[ $check_refrev == true ]]; then log_must $ZFS allow $user refreservation $fs fi user_run $user $ZFS create -V 150m $newvol log_must $ZFS unallow $user mount $fs log_must $ZFS unallow $user reservation $fs if [[ $check_refrev == true ]]; then log_must $ZFS unallow $user refreservation $fs fi if ! datasetexists $newvol ; then return 1 fi log_must $ZFS destroy $newvol fi return 0 } function verify_fs_destroy { typeset user=$1 typeset perm=$2 typeset fs=$3 if ! ismounted $fs ; then user_run $user $ZFS destroy $fs if datasetexists $fs ; then return 1 fi fi if ismounted $fs ; then user_run $user $ZFS destroy $fs if ! datasetexists $fs ; then return 1 fi # mount permission is required log_must $ZFS allow $user mount $fs user_run $user $ZFS destroy $fs if datasetexists $fs ; then return 1 fi fi return 0 } function verify_fs_snapshot { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset snap=$fs@snap.$stamp typeset mntpt=$(get_prop mountpoint $fs) if [[ "yes" == $(get_prop mounted $fs) ]]; then log_must $ZFS umount $fs fi user_run $user $ZFS snapshot $snap if datasetexists $snap ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS snapshot $snap log_must $ZFS unallow $user mount $fs if ! datasetexists $snap ; then return 1 fi log_must $ZFS destroy $snap if [[ "no" == $(get_prop mounted $fs) ]]; then log_must $ZFS mount $fs fi user_run $user $ZFS snapshot $snap if datasetexists $snap ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS snapshot $snap log_must $ZFS unallow $user mount $fs if ! datasetexists $snap ; then return 1 fi log_must $ZFS destroy $snap typeset snapdir=${mntpt}/$(get_snapdir_name)/snap.$stamp user_run $user $MKDIR $snapdir if datasetexists $snap ; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $MKDIR $snapdir log_must $ZFS unallow $user mount $fs if ! datasetexists $snap ; then return 1 fi log_must $ZFS destroy $snap return 0 } function verify_fs_rollback { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset snap=$fs@snap.$stamp typeset mntpt=$(get_prop mountpoint $fs) oldval=$(datasetcksum $fs) log_must $ZFS snapshot $snap if ! ismounted $fs; then log_must $ZFS mount $fs fi log_must $TOUCH $mntpt/testfile.$stamp user_run $user $ZFS rollback -R $snap $SLEEP 10 if is_global_zone ; then if [[ $oldval == $(datasetcksum $fs) ]]; then return 1 fi else # datasetcksum can not be used in local zone if [[ ! -e $mntpt/testfile.$stamp ]]; then return 1 fi fi # rollback on mounted fs has to be with mount permission log_must $ZFS allow $user mount $fs user_run $user $ZFS rollback -R $snap log_must $ZFS unallow $user mount $fs $SLEEP 10 if is_global_zone ; then if [[ $oldval != $(datasetcksum $fs) ]]; then return 1 fi else # datasetcksum can not be used in local zone if [[ -e $mntpt/testfile.$stamp ]]; then return 1 fi fi return 0 } function verify_fs_clone { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basefs=${fs%/*} typeset snap=$fs@snap.$stamp typeset clone=$basefs/cfs.$stamp log_must $ZFS snapshot $snap user_run $user $ZFS clone $snap $clone if datasetexists $clone ; then return 1 fi log_must $ZFS allow $user create $basefs user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user create $basefs if datasetexists $clone ; then return 1 fi log_must $ZFS allow $user mount $basefs user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user mount $basefs if datasetexists $clone ; then return 1 fi log_must $ZFS allow $user mount $basefs log_must $ZFS allow $user create $basefs user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user create $basefs log_must $ZFS unallow $user mount $basefs if ! datasetexists $clone ; then return 1 fi log_must $ZFS destroy -R $snap return 0 } function verify_fs_rename { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basefs=${fs%/*} typeset snap=$fs@snap.$stamp typeset renamefs=$basefs/nfs.$stamp if ! ismounted $fs; then log_must $ZFS mount $fs fi # case 1 user_run $user $ZFS rename $fs $renamefs if datasetexists $renamefs ; then return 1 fi # case 2 log_must $ZFS allow $user create $basefs user_run $user $ZFS rename $fs $renamefs log_must $ZFS unallow $user create $basefs if datasetexists $renamefs ; then return 1 fi # case 3 log_must $ZFS allow $user mount $basefs user_run $user $ZFS rename $fs $renamefs log_must $ZFS unallow $user mount $basefs if datasetexists $renamefs ; then return 1 fi # case 4 log_must $ZFS allow $user mount $fs user_run $user $ZFS rename $fs $renamefs if datasetexists $renamefs ; then log_must $ZFS unallow $user mount $renamefs return 1 fi log_must $ZFS unallow $user mount $fs # case 5 log_must $ZFS allow $user create $basefs log_must $ZFS allow $user mount $fs user_run $user $ZFS rename $fs $renamefs log_must $ZFS unallow $user create $basefs if datasetexists $renamefs ; then log_must $ZFS unallow $user mount $renamefs return 1 fi log_must $ZFS unallow $user mount $fs # case 6 log_must $ZFS allow $user mount $basefs log_must $ZFS allow $user mount $fs user_run $user $ZFS rename $fs $renamefs log_must $ZFS unallow $user mount $basefs if datasetexists $renamefs ; then log_must $ZFS unallow $user mount $renamefs return 1 fi log_must $ZFS unallow $user mount $fs # case 7 log_must $ZFS allow $user create $basefs log_must $ZFS allow $user mount $basefs user_run $user $ZFS rename $fs $renamefs log_must $ZFS unallow $user mount $basefs log_must $ZFS unallow $user create $basefs if ! datasetexists $renamefs ; then return 1 fi log_must $ZFS rename $renamefs $fs return 0 } function verify_fs_mount { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset mntpt=$(get_prop mountpoint $fs) typeset newmntpt=$TMPDIR/mnt.$stamp if ismounted $fs ; then user_run $user $ZFS unmount $fs if ismounted $fs ; then return 1 fi fi if ! ismounted $fs ; then log_must $ZFS set mountpoint=$newmntpt $fs log_must $RM -rf $newmntpt log_must $MKDIR $newmntpt user_run $user $ZFS mount $fs if ismounted $fs ; then return 1 fi # mountpoint's owner must be the user log_must $CHOWN $user $newmntpt user_run $user $ZFS mount $fs if ! ismounted $fs ; then return 1 fi log_must $ZFS umount $fs log_must $RM -rf $newmntpt log_must $ZFS set mountpoint=$mntpt $fs fi return 0 } function verify_fs_share { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset mntpt=$(get_prop mountpoint $fs) typeset stat=$($SVCS -H -o STA nfs/server:default) if [[ $stat != "ON" ]]; then log_note "Current nfs/server status: $stat" # legacy share user_run $user $SHARE $mntpt if is_shared $fs; then return 1 fi # sharenfs=on log_must $ZFS set sharenfs=on $fs user_run $user $ZFS share $fs if is_shared $fs; then log_must $ZFS set sharenfs=off $fs return 1 fi log_must $ZFS set sharenfs=off $fs fi # turn on nfs/server service if it is not enabled typeset tmpshare=$TMPDIR/a.${TESTCASE_ID} $RM -rf $tmpshare log_must $MKDIR -p $tmpshare log_must $SHARE $tmpshare # legacy share user_run $user $SHARE $mntpt if ! is_shared $fs ; then log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 1 fi user_run $user $UNSHARE $mntpt if is_shared $fs ; then log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 1 fi # sharenfs=on log_must $ZFS set sharenfs=on $fs user_run $user $ZFS share $fs if ! is_shared $fs; then log_must $ZFS set sharenfs=off $fs return 1 fi user_run $user $ZFS unshare $fs if is_shared $fs; then log_must $ZFS set sharenfs=off $fs return 1 fi log_must $ZFS set sharenfs=off $fs log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 0 } function verify_fs_mountpoint { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset mntpt=$(get_prop mountpoint $fs) typeset newmntpt=$TMPDIR/mnt.$stamp if ! ismounted $fs ; then user_run $user $ZFS set mountpoint=$newmntpt $fs if [[ $newmntpt != \ $(get_prop mountpoint $fs) ]] ; then return 1 fi log_must $ZFS set mountpoint=$mntpt $fs fi if ismounted $fs ; then user_run $user $ZFS set mountpoint=$newmntpt $fs if [[ $mntpt != $(get_prop mountpoint $fs) ]] ; then return 1 fi # require mount permission when fs is mounted log_must $ZFS allow $user mount $fs user_run $user $ZFS set mountpoint=$newmntpt $fs log_must $ZFS unallow $user mount $fs if [[ $newmntpt != \ $(get_prop mountpoint $fs) ]] ; then return 1 fi log_must $ZFS set mountpoint=$mntpt $fs fi return 0 } function verify_fs_promote { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basefs=${fs%/*} typeset snap=$fs@snap.$stamp typeset clone=$basefs/cfs.$stamp log_must $ZFS snapshot $snap log_must $ZFS clone $snap $clone log_must $ZFS promote $clone typeset fs_orig=$(get_prop origin $fs) typeset clone_orig=$(get_prop origin $clone) user_run $user $ZFS promote $fs # promote should fail if original fs does not have # promote permission if [[ $fs_orig != $(get_prop origin $fs) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi log_must $ZFS allow $user promote $clone user_run $user $ZFS promote $fs log_must $ZFS unallow $user promote $clone if [[ $fs_orig != $(get_prop origin $fs) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi log_must $ZFS allow $user mount $fs user_run $user $ZFS promote $fs log_must $ZFS unallow $user mount $fs if [[ $fs_orig != $(get_prop origin $fs) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi log_must $ZFS allow $user mount $fs log_must $ZFS allow $user promote $clone user_run $user $ZFS promote $fs log_must $ZFS unallow $user promote $clone log_must $ZFS unallow $user mount $fs if [[ $snap != $(get_prop origin $clone) || \ $clone_orig != $(get_prop origin $fs) ]]; then return 1 fi return 0 } function verify_fs_canmount { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') if ! ismounted $fs ; then set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi fi # fs is mounted if ismounted $fs ; then # property value does not change if # no mount permission set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" log_must $ZFS allow $user mount $fs user_run $user $ZFS set $perm=${modes[$n]} $fs log_must $ZFS unallow $user mount $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi fi return 0 } function verify_fs_recordsize { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset value8k=$(( 1024 * 8 )) user_run $user $ZFS set recordsize=$value8k $fs if [[ $value8k != $(get_prop recordsize $fs) ]]; then return 1 fi return 0 } function verify_fs_quota { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset value32m=$(( 1024 * 1024 * 32 )) user_run $user $ZFS set quota=$value32m $fs if [[ $value32m != $(get_prop quota $fs) ]]; then return 1 fi return 0 } function verify_fs_aclmode { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "discard" "groupmask" "passthrough" oldval=$(get_prop $perm $fs) if [[ $oldval == "discard" ]]; then n=1 elif [[ $oldval == "groupmask" ]]; then n=2 elif [[ $oldval == "passthrough" ]]; then n=0 fi log_note "$user $ZFS set aclmode=${modes[$n]} $fs" user_run $user $ZFS set aclmode=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop aclmode $fs) ]]; then return 1 fi return 0 } function verify_fs_aclinherit { typeset user=$1 typeset perm=$2 typeset fs=$3 # # PSARC/2008/231 change the default value of aclinherit to "restricted" # but still keep the old interface of "secure" # typeset oldval set -A modes "discard" "noallow" "secure" "passthrough" oldval=$(get_prop $perm $fs) if [[ $oldval == "discard" ]]; then n=1 elif [[ $oldval == "noallow" ]]; then n=2 elif [[ $oldval == "secure" || $oldval == "restricted" ]]; then n=3 elif [[ $oldval == "passthrough" ]]; then n=0 fi log_note "$user $ZFS set aclinherit=${modes[$n]} $fs" user_run $user $ZFS set aclinherit=${modes[$n]} $fs typeset newval=$(get_prop aclinherit $fs) if [[ ${modes[$n]} == "secure" && $newval == "restricted" ]]; then return 0 elif [[ ${modes[$n]} != $(get_prop aclinherit $fs) ]]; then return 1 fi return 0 } function verify_fs_snapdir { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "visible" "hidden" oldval=$(get_prop $perm $fs) if [[ $oldval == "visible" ]]; then n=1 elif [[ $oldval == "hidden" ]]; then n=0 fi log_note "$user $ZFS set snapdir=${modes[$n]} $fs" user_run $user $ZFS set snapdir=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop snapdir $fs) ]]; then return 1 fi return 0 } function verify_fs_aedsx { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi return 0 } function verify_fs_zoned { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" if is_global_zone ; then if ! ismounted $fs ; then user_run $user $ZFS set \ $perm=${modes[$n]} $fs if [[ ${modes[$n]} != \ $(get_prop $perm $fs) ]]; then return 1 fi if [[ $n -eq 0 ]]; then log_mustnot $ZFS mount $fs else log_must $ZFS mount $fs fi fi if ismounted $fs; then # n always is 1 in this case user_run $user $ZFS set \ $perm=${modes[$n]} $fs if [[ $oldval != \ $(get_prop $perm $fs) ]]; then return 1 fi # mount permission is needed # to make zoned=on log_must $ZFS allow $user mount $fs user_run $user $ZFS set \ $perm=${modes[$n]} $fs log_must $ZFS unallow $user mount $fs if [[ ${modes[$n]} != \ $(get_prop $perm $fs) ]]; then return 1 fi fi fi if ! is_global_zone; then user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ $oldval != $(get_prop $perm $fs) ]]; then return 1 fi fi return 0 } function verify_fs_sharenfs { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi log_must $ZFS set $perm=$oldval $fs # turn on nfs/server service if it is not enabled typeset tmpshare=$TMPDIR/a.${TESTCASE_ID} $RM -rf $tmpshare log_must $MKDIR -p $tmpshare log_must $SHARE $tmpshare log_note "$user $ZFS set $perm=${modes[$n]} $fs" user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi user_run $user $ZFS share $fs if is_shared $fs; then return 1 fi # share permission is needed log_must $ZFS allow $user share $fs user_run $user $ZFS share $fs log_must $ZFS unallow $user share $fs if [[ $n -eq 0 ]] && ! is_shared $fs ; then log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 1 fi if [[ $n -eq 1 ]] && is_shared $fs ; then log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 1 fi log_must $UNSHARE $tmpshare log_must $RM -rf $tmpshare return 0 } function verify_fs_shareiscsi { typeset user=$1 typeset perm=$2 typeset fs=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $fs) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $fs" user_run $user $ZFS set $perm=${modes[$n]} $fs if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then return 1 fi return 0 } function verify_vol_destroy { typeset user=$1 typeset perm=$2 typeset vol=$3 user_run $user $ZFS destroy $vol if ! datasetexists $vol ; then return 1 fi # mount permission is required log_must $ZFS allow $user mount $vol user_run $user $ZFS destroy $vol if datasetexists $vol ; then return 1 fi return 0 } function verify_vol_snapshot { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basevol=${vol%/*} typeset snap=$vol@snap.$stamp user_run $user $ZFS snapshot $snap if datasetexists $snap ; then return 1 fi log_must $ZFS allow $user mount $vol user_run $user $ZFS snapshot $snap log_must $ZFS unallow $user mount $vol if ! datasetexists $snap ; then return 1 fi return 0 } function verify_vol_rollback { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basevol=${vol%/*} typeset snap=$vol@snap.$stamp typeset oldval log_must $ZFS snapshot $snap oldval=$(datasetcksum $vol) - log_must $DD if=/dev/random of=/dev/zvol/rdsk/$vol \ + log_must $DD if=/dev/random of=/dev/zvol/$vol \ bs=512 count=1 user_run $user $ZFS rollback -R $snap $SLEEP 10 if [[ $oldval == $(datasetcksum $vol) ]]; then return 1 fi # rollback on volume has to be with mount permission log_must $ZFS allow $user mount $vol user_run $user $ZFS rollback -R $snap $SLEEP 10 log_must $ZFS unallow $user mount $vol if [[ $oldval != $(datasetcksum $vol) ]]; then return 1 fi return 0 } function verify_vol_clone { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basevol=${vol%/*} typeset snap=$vol@snap.$stamp typeset clone=$basevol/cvol.$stamp log_must $ZFS snapshot $snap user_run $user $ZFS clone $snap $clone if datasetexists $clone ; then return 1 fi log_must $ZFS allow $user create $basevol user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user create $basevol if datasetexists $clone ; then return 1 fi log_must $ZFS allow $user mount $basevol user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user mount $basevol if datasetexists $clone ; then return 1 fi # require create permission on parent and # mount permission on itself as well log_must $ZFS allow $user mount $basevol log_must $ZFS allow $user create $basevol user_run $user $ZFS clone $snap $clone log_must $ZFS unallow $user create $basevol log_must $ZFS unallow $user mount $basevol if ! datasetexists $clone ; then return 1 fi return 0 } function verify_vol_rename { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basevol=${vol%/*} typeset snap=$vol@snap.$stamp typeset clone=$basevol/cvol.$stamp typeset renamevol=$basevol/nvol.$stamp user_run $user $ZFS rename $vol $renamevol if datasetexists $renamevol ; then return 1 fi log_must $ZFS allow $user create $basevol user_run $user $ZFS rename $vol $renamevol log_must $ZFS unallow $user create $basevol if datasetexists $renamevol ; then return 1 fi log_must $ZFS allow $user mount $basevol user_run $user $ZFS rename $vol $renamevol log_must $ZFS unallow $user mount $basevol if datasetexists $renamevol ; then return 1 fi # require both create permission on parent and # mount permission on parent as well log_must $ZFS allow $user mount $basevol log_must $ZFS allow $user create $basevol user_run $user $ZFS rename $vol $renamevol log_must $ZFS unallow $user mount $basevol log_must $ZFS unallow $user create $basevol if ! datasetexists $renamevol ; then return 1 fi log_must $ZFS rename $renamevol $vol return 0 } function verify_vol_promote { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') typeset basevol=${vol%/*} typeset snap=$vol@snap.$stamp typeset clone=$basevol/cvol.$stamp log_must $ZFS snapshot $snap log_must $ZFS clone $snap $clone log_must $ZFS promote $clone typeset vol_orig=$(get_prop origin $vol) typeset clone_orig=$(get_prop origin $clone) # promote should fail if $vol and $clone # miss either mount or promote permission # case 1 user_run $user $ZFS promote $vol if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 2 log_must $ZFS allow $user promote $clone user_run $user $ZFS promote $vol log_must $ZFS unallow $user promote $clone if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 3 log_must $ZFS allow $user mount $vol user_run $user $ZFS promote $vol log_must $ZFS unallow $user mount $vol if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 4 log_must $ZFS allow $user mount $clone user_run $user $ZFS promote $vol log_must $ZFS unallow $user mount $clone if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 5 log_must $ZFS allow $user promote $clone log_must $ZFS allow $user mount $vol user_run $user $ZFS promote $vol log_must $ZFS unallow $user promote $clone log_must $ZFS unallow $user mount $vol if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 6 log_must $ZFS allow $user promote $clone log_must $ZFS allow $user mount $clone user_run $user $ZFS promote $vol log_must $ZFS unallow $user promote $clone log_must $ZFS unallow $user mount $vol if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote should fail if $vol and $clone # miss either mount or promote permission # case 7 log_must $ZFS allow $user mount $vol log_must $ZFS allow $user mount $clone user_run $user $ZFS promote $vol log_must $ZFS unallow $user mount $vol log_must $ZFS unallow $user mount $clone if [[ $vol_orig != $(get_prop origin $vol) || \ $clone_orig != $(get_prop origin $clone) ]]; then return 1 fi # promote only succeeds when $vol and $clone # have both mount and promote permission # case 8 log_must $ZFS allow $user promote $clone log_must $ZFS allow $user mount $vol log_must $ZFS allow $user mount $clone user_run $user $ZFS promote $vol log_must $ZFS unallow $user promote $clone log_must $ZFS unallow $user mount $vol log_must $ZFS unallow $user mount $clone if [[ $snap != $(get_prop origin $clone) || \ $clone_orig != $(get_prop origin $vol) ]]; then return 1 fi return 0 } function verify_vol_volsize { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset oldval oldval=$(get_prop volsize $vol) (( newval = oldval * 2 )) typeset check_refrev=false if support_refrev $vol; then check_refrev=true fi typeset reserv_size if [[ $check_refrev == true ]]; then reserv_size=$(get_prop refreservation $vol) else reserv_size=$(get_prop reservation $vol) fi if [[ "0" == $reserv_size ]]; then # sparse volume user_run $user $ZFS set volsize=$newval $vol if [[ $oldval == $(get_prop volsize $vol) ]]; then return 1 fi else # normal volume, reservation permission # is required user_run $user $ZFS set volsize=$newval $vol if [[ $newval == $(get_prop volsize $vol) ]]; then return 1 fi log_must $ZFS allow $user reservation $vol if [[ $check_refrev == true ]]; then log_must $ZFS allow $user refreservation $vol fi user_run $user $ZFS set volsize=$newval $vol log_must $ZFS unallow $user reservation $vol if [[ $check_refrev == true ]]; then log_must $ZFS unallow $user refreservation $vol fi if [[ $oldval == $(get_prop volsize $vol) ]]; then return 1 fi fi return 0 } function verify_vol_shareiscsi { typeset user=$1 typeset perm=$2 typeset vol=$3 typeset oldval set -A modes "on" "off" oldval=$(get_prop $perm $vol) if [[ $oldval == "on" ]]; then n=1 elif [[ $oldval == "off" ]]; then n=0 fi log_note "$user $ZFS set $perm=${modes[$n]} $vol" user_run $user $ZFS set $perm=${modes[$n]} $vol if [[ ${modes[$n]} != $(get_prop $perm $vol) ]]; then return 1 fi iscsitgt_setup if [[ $n -eq 1 ]] && is_iscsi_target $vol ; then iscsitgt_cleanup return 1 fi if [[ $n -eq 0 ]] && ! is_iscsi_target $vol ; then iscsitgt_cleanup return 1 fi iscsitgt_cleanup return 0 } function verify_allow { typeset user=$1 typeset perm=$2 typeset dtst=$3 typeset -i ret user_run $user $ZFS allow $user allow $dtst ret=$? if [[ $ret -eq 0 ]]; then return 1 fi log_must $ZFS allow $user copies $dtst user_run $user $ZFS allow $user copies $dtst ret=$? log_must $ZFS unallow $user copies $dtst if [[ $ret -eq 1 ]]; then return 1 fi return 0 } function support_refrev { typeset dataset=$1 $ZFS get refreservation $dataset > /dev/null 2>&1 if (( $? != 0 )); then return 1 fi return 0 } Index: head/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib =================================================================== --- head/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib (revision 331612) +++ head/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib (revision 331613) @@ -1,120 +1,120 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)devices_common.kshlib 1.3 07/03/14 SMI" # . $STF_SUITE/include/libtest.kshlib # # Create block file or charactor file according to parameter. # # $1 device file type # $2 file name # function create_dev_file { typeset filetype=$1 typeset filename=$2 case $filetype in b) devtype=$($DF -T / | $AWK '{print $2}') case $devtype in zfs) rootpool=$($DF / | \ $AWK '{print $2}') rootpool=${rootpool#\(} rootpool=${rootpool%%/*} devstr=$(get_disklist $rootpool) devstr=$($ECHO "$devstr" | \ $AWK '{print $1}') [[ -z $devstr ]] && \ log_fail "Can not get block device file." - devstr=/dev/dsk/${devstr} + devstr=/dev/${devstr} ;; ufs) # # Get the existing block device file in current system. # And bring out the first one. # devstr=$($DF -lht ufs | \ - $GREP "^/dev/dsk" | \ + $GREP "^/dev/" | \ $AWK '{print $1}') devstr=$($ECHO "$devstr" | \ $AWK '{print $1}') [[ -z $devstr ]] && \ log_fail "Can not get block device file." ;; *) log_unsupported "Unsupported fstype " \ "for / ($devtype)," \ "only ufs|zfs is supported." ;; esac # # Get the device file information. i.e: - # /dev/dsk/c0t0d0s0: block special (28/768) + # /dev/c0t0d0s0: block special (28/768) # devstr=$($FILE $devstr) # # Bring out major and minor number. # major=${devstr##*\(} major=${major%%/*} minor=${devstr##*/} minor=${minor%\)} log_must $MKNOD $filename b $major $minor ;; c) # # Create device file '/dev/null' # log_must $MKNOD $filename c 13 2 ;; *) log_fail "'$filetype' is wrong." ;; esac return 0 } function cleanup { log_must $ZFS set devices=on $TESTPOOL/$TESTFS log_must $RM -f $TESTDIR/$TESTFILE1 log_must $RM -f $TESTDIR/$TESTFILE2 log_must $RM -f $TESTDIR/$TESTFILE1.out log_must $RM -f $TESTDIR/$TESTFILE2.out } Index: head/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh (revision 331613) @@ -1,144 +1,144 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)hotspare_add_003_neg.ksh 1.7 09/06/22 SMI" # . $STF_SUITE/tests/hotspare/hotspare.kshlib ################################################################################ # # __stc_assertion_start # # ID: hotspare_add_003_neg # # DESCRIPTION: # 'zpool add' with hot spares will fail # while the hot spares belong to the following cases: # - nonexist device, # - part of an active pool, # - currently mounted, # - devices in /etc/vfstab, # - specified as the dedicated dump device, # - identical with the basic or spares vdev within the pool, # - belong to a exported or potentially active ZFS pool, # - a volume device that belong to the given pool, # # STRATEGY: # 1. Create case scenarios # 2. For each scenario, try to add [-f] the device to the pool # 3. Verify the add operation failes as expected. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-06-07) # # __stc_assertion_end # ############################################################################### verify_runnable "global" function cleanup { poolexists "$TESTPOOL" && \ destroy_pool "$TESTPOOL" poolexists "$TESTPOOL1" && \ destroy_pool "$TESTPOOL1" if [[ -n $saved_dump_dev ]]; then if [[ -n $DUMPADM ]]; then log_must $DUMPADM -u -d $saved_dump_dev fi fi if [[ -n $DUMPADM ]]; then cleanup_devices $dump_dev fi partition_cleanup } log_assert "'zpool add [-f]' with hot spares should fail with inapplicable scenarios." log_onexit cleanup set_devs mnttab_dev=$(find_mnttab_dev) vfstab_dev=$(find_vfstab_dev) saved_dump_dev=$(save_dump_dev) dump_dev=${disk}s0 nonexist_dev=${disk}sbad_slice_num create_pool "$TESTPOOL" "${pooldevs[0]}" log_must poolexists "$TESTPOOL" create_pool "$TESTPOOL1" "${pooldevs[1]}" log_must poolexists "$TESTPOOL1" [[ -n $mnttab_dev ]] || log_note "No mnttab devices found" [[ -n $vfstab_dev ]] || log_note "No vfstab devices found" # - nonexist device, # - part of an active pool, # - currently mounted, # - devices in /etc/vfstab, # - identical with the basic or spares vdev within the pool, set -A arg "$nonexist_dev" \ "${pooldevs[0]}" \ "${pooldevs[1]}" \ "$mnttab_dev" \ "$vfstab_dev" typeset -i i=0 while (( i < ${#arg[*]} )); do if [[ -n "${arg[i]}" ]]; then log_mustnot $ZPOOL add $TESTPOOL spare ${arg[i]} log_mustnot $ZPOOL add -f $TESTPOOL spare ${arg[i]} fi (( i = i + 1 )) done # - specified as the dedicated dump device, # This part of the test can only be run on platforms for which DUMPADM is # defined; ie Solaris if [[ -n $DUMPADM ]]; then - log_must $DUMPADM -u -d /dev/dsk/$dump_dev + log_must $DUMPADM -u -d /dev/$dump_dev log_mustnot $ZPOOL add "$TESTPOOL" spare $dump_dev log_mustnot $ZPOOL add -f "$TESTPOOL" spare $dump_dev fi # - belong to a exported or potentially active ZFS pool, log_must $ZPOOL export $TESTPOOL1 log_mustnot $ZPOOL add "$TESTPOOL" spare ${pooldevs[1]} log_must $ZPOOL import -d $HOTSPARE_TMPDIR $TESTPOOL1 log_pass "'zpool add [-f]' with hot spares should fail with inapplicable scenarios." Index: head/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh (revision 331613) @@ -1,139 +1,139 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)hotspare_create_001_neg.ksh 1.5 09/06/22 SMI" # . $STF_SUITE/tests/hotspare/hotspare.kshlib ################################################################################ # # __stc_assertion_start # # ID: hotspare_create_001_neg # # DESCRIPTION: # 'zpool create [-f]' with hot spares will fail # while the hot spares belong to the following cases: # - existing pool # - nonexist device, # - part of an active pool, # - currently mounted, # - devices in /etc/vfstab, # - specified as the dedicated dump device, # - identical with the basic vdev within the pool, # # STRATEGY: # 1. Create case scenarios # 2. For each scenario, try to create a new pool with hot spares # of the virtual devices # 3. Verify the creation is failed. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-06-07) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { for pool in $TESTPOOL $TESTPOOL1 do destroy_pool $pool done if [[ -n $saved_dump_dev ]]; then if [[ -n $DUMPADM ]]; then log_must $DUMPADM -u -d $saved_dump_dev fi fi partition_cleanup } log_assert "'zpool create [-f]' with hot spares should be failed " \ "with inapplicable scenarios." log_onexit cleanup set_devs mnttab_dev=$(find_mnttab_dev) vfstab_dev=$(find_vfstab_dev) saved_dump_dev=$(save_dump_dev) dump_dev=${disk}s0 nonexist_dev=${disk}sbad_slice_num create_pool "$TESTPOOL" ${pooldevs[0]} # # Set up the testing scenarios parameters # - existing pool # - nonexist device, # - part of an active pool, # - currently mounted, # - devices in /etc/vfstab, # - identical with the basic vdev within the pool, set -A arg "$TESTPOOL ${pooldevs[1]} spare ${pooldevs[2]}" \ "$TESTPOOL1 ${pooldevs[1]} spare $nonexist_dev" \ "$TESTPOOL1 ${pooldevs[1]} spare ${pooldevs[0]}" \ "$TESTPOOL1 ${pooldevs[1]} spare $mnttab_dev" \ "$TESTPOOL1 ${pooldevs[1]} spare $vfstab_dev" \ "$TESTPOOL1 ${pooldevs[1]} spare ${pooldevs[1]}" typeset -i i=0 while (( i < ${#arg[*]} )); do log_mustnot $ZPOOL create ${arg[i]} log_mustnot $ZPOOL create -f ${arg[i]} (( i = i + 1 )) done # now destroy the pool to be polite log_must $ZPOOL destroy -f $TESTPOOL # # - specified as the dedicated dump device, # This part of the test can only be run on platforms for which DUMPADM is # defined; ie Solaris # if [[ -n $DUMPADM ]]; then # create/destroy a pool as a simple way to set the partitioning # back to something normal so we can use this $disk as a dump device cleanup_devices $dump_dev - log_must $DUMPADM -u -d /dev/dsk/$dump_dev + log_must $DUMPADM -u -d /dev/$dump_dev log_mustnot $ZPOOL create $TESTPOOL1 ${pooldevs[1]} spare "$dump_dev" log_mustnot $ZPOOL create -f $TESTPOOL1 ${pooldevs[1]} spare "$dump_dev" fi log_pass "'zpool create [-f]' with hot spare is failed as expected with inapplicable scenarios." Index: head/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh (revision 331613) @@ -1,116 +1,116 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)hotspare_remove_002_neg.ksh 1.3 09/06/22 SMI" # . $STF_SUITE/tests/hotspare/hotspare.kshlib ################################################################################ # # __stc_assertion_start # # ID: hotspare_remove_002_neg # # DESCRIPTION: # 'zpool remove ...' should return fail if # - notexist device # - not within the hot spares of this pool # - hot spares that currently spared in # # STRATEGY: # 1. Create a storage pool # 2. Add hot spare devices to the pool # 3. For each scenario, try to remove the hot spares # 4. Verify the the remove operation get failed # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING STATUS: COMPLETED (2005-09-27) # # __stc_assertion_end # ############################################################################### verify_runnable "global" function cleanup { poolexists $TESTPOOL && \ destroy_pool $TESTPOOL partition_cleanup } function verify_assertion # dev { typeset dev=$1 typeset odev=${pooldevs[0]} log_must $ZPOOL replace $TESTPOOL $odev $dev log_mustnot $ZPOOL remove $TESTPOOL $dev log_must $ZPOOL detach $TESTPOOL $dev } log_assert "'zpool remove ...' should fail with inapplicable scenarios." log_onexit cleanup typeset dev_nonexist dev_notinlist case $DISK_ARRAY_NUM in 0|1) - dev_nonexist=/dev/dsk/${disk}sbad_slice_num + dev_nonexist=/dev/${disk}sbad_slice_num dev_notinlist=${disk} ;; 2|*) - dev_nonexist=/dev/dsk/${DISK0}sbad_slice_num + dev_nonexist=/dev/${DISK0}sbad_slice_num dev_notinlist="${DISK0} ${DISK1}" ;; esac set_devs for keyword in "${keywords[@]}" ; do setup_hotspares "$keyword" for dev in $dev_nonexist ; do log_mustnot $ZPOOL remove $TESTPOOL $dev done for dev in $dev_notinlist ; do log_mustnot $ZPOOL remove $TESTPOOL $dev done iterate_over_hotspares verify_assertion destroy_pool "$TESTPOOL" done log_pass "'zpool remove ...' fail with inapplicable scenarios." Index: head/tests/sys/cddl/zfs/tests/interop/interop.cfg =================================================================== --- head/tests/sys/cddl/zfs/tests/interop/interop.cfg (revision 331612) +++ head/tests/sys/cddl/zfs/tests/interop/interop.cfg (revision 331613) @@ -1,82 +1,82 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)interop.cfg 1.3 08/08/15 SMI" # . $STF_SUITE/include/libtest.kshlib set -A disk_array $(find_disks $DISKS) case "${#disk_array[*]}" in 0) DISK_COUNT=0 ;; 1) # We need to repartition the single disk to two slices DISK_COUNT=1 META_DISK0=${disk_array[0]} SINGLE_DISK=$META_DISK0 META_DISK1=$META_DISK0 ZFS_DISK2=$META_DISK0 META_SIDE0=${SINGLE_DISK}s0 META_SIDE1=${SINGLE_DISK}s1 ZFS_SIDE2=${SINGLE_DISK}s3 ;; 2) # We need to repartition the single disk to two slices and allocate # the 2nd disk to ZFS DISK_COUNT=2 META_DISK0=${disk_array[0]} SINGLE_DISK=$META_DISK0 META_DISK1=$META_DISK0 ZFS_DISK2=${disk_array[1]} META_SIDE0=${SINGLE_DISK}s0 META_SIDE1=${SINGLE_DISK}s1 ZFS_SIDE2=${ZFS_DISK2}s0 ;; *) # In this case there are at least enough disks to use. DISK_COUNT=3 META_DISK0=${disk_array[0]} META_DISK1=${disk_array[1]} ZFS_DISK2=${disk_array[2]} META_SIDE0=${META_DISK0}s0 META_SIDE1=${META_DISK1}s0 ZFS_SIDE2=${ZFS_DISK2}s0 ;; esac export DISK_COUNT META_DISK0 META_DISK1 ZFS_DISK2 export META_SIDE0 META_SIDE1 ZFS_SIDE2 SINGLE_DISK export TESTFILE=testfile export FS_SIZE=500m export META_DEVICE_ID=d99 -export META_DEVICE_PATH=/dev/md/dsk/$META_DEVICE_ID +export META_DEVICE_PATH=/dev/md/$META_DEVICE_ID export FILE_COUNT=20 export FILE_SIZE=$(( 1024 * 1024 )) Index: head/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg =================================================================== --- head/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg (revision 331612) +++ head/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg (revision 331613) @@ -1,45 +1,45 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)largest_pool.cfg 1.3 08/08/15 SMI" # export TESTVOL=testvol${TESTCASE_ID} export STF_TIMEOUT=1800 -export VOL_PATH=/dev/zvol/dsk/${TESTPOOL2}/$TESTVOL +export VOL_PATH=/dev/zvol/${TESTPOOL2}/$TESTVOL export VOLSIZES=${VOLSIZES-"2pb 5pb 10pb 2eb 5eb 8eb 9eb"} # There're 3 different prompt messages while create # a volume that great than 1TB on 32-bit # - volume size exceeds limit for this system. (happy gate) # - max volume size is 1TB on 32-bit systems (s10u2) # - value is too large (old) export VOL_LIMIT_KEYWORD1="1TB on 32-bit" export VOL_LIMIT_KEYWORD2="value is too large" export VOL_LIMIT_KEYWORD3="volume size exceeds limit" Index: head/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh (revision 331613) @@ -1,107 +1,107 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)slog_013_pos.ksh 1.2 09/05/19 SMI" # . $STF_SUITE/tests/slog/slog.kshlib ################################################################################# # # __stc_assertion_start # # ID: slog_013_pos # # DESCRIPTION: # Verify slog device can be disk, file, lofi device or any device that # presents a block interface. # # STRATEGY: # 1. Create a pool # 2. Loop to add different object as slog # 3. Verify it passes # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2007-06-20) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup_testenv { cleanup if datasetexists $TESTPOOL2 ; then log_must $ZPOOL destroy -f $TESTPOOL2 fi if [[ -n $lofidev ]]; then $LOFIADM -d $lofidev fi } log_assert "Verify slog device can be disk, file, lofi device or any device " \ "that presents a block interface." log_onexit cleanup_testenv dsk1=${DISKS%% *} log_must $ZPOOL create $TESTPOOL ${DISKS#$dsk1} # Add nomal disk log_must $ZPOOL add $TESTPOOL log $dsk1 log_must verify_slog_device $TESTPOOL $dsk1 'ONLINE' # Add nomal file log_must $ZPOOL add $TESTPOOL log $LDEV ldev=$(random_get $LDEV) log_must verify_slog_device $TESTPOOL $ldev 'ONLINE' # Add lofi device lofidev=${LDEV2%% *} log_must $LOFIADM -a $lofidev lofidev=$($LOFIADM $lofidev) log_must $ZPOOL add $TESTPOOL log $lofidev log_must verify_slog_device $TESTPOOL $lofidev 'ONLINE' log_pass "Verify slog device can be disk, file, lofi device or any device " \ "that presents a block interface." # Temp disable fore bug 6569095 # Add file which reside in the itself mntpnt=$(get_prop mountpoint $TESTPOOL) log_must create_vdevs $mntpnt/vdev log_must $ZPOOL add $TESTPOOL $mntpnt/vdev # Temp disable fore bug 6569072 # Add ZFS volume vol=$TESTPOOL/vol log_must $ZPOOL create -V 64M $vol -log_must $ZPOOL add $TESTPOOL /dev/zvol/dsk/$vol +log_must $ZPOOL add $TESTPOOL /dev/zvol/$vol Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh (revision 331613) @@ -1,75 +1,75 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_001_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_001_pos # # DESCRIPTION: # Ensure that the clri(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS directory with a number of files. # 2. Run clri against the raw device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { $RM -rf $TESTDIR/* } log_onexit cleanup log_assert "Ensure that the clri(1M) utility fails on a ZFS file system." populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA inode=`$LS -i $TESTDIR/$TESTFILE.0 | $AWK '{print $1}'` -log_mustnot $CLRI /dev/rdsk/$DISK $inode -log_mustnot $CLRI -F zfs /dev/rdsk/$DISK $inode +log_mustnot $CLRI /dev/$DISK $inode +log_mustnot $CLRI -F zfs /dev/$DISK $inode log_pass "clri(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh (revision 331613) @@ -1,81 +1,81 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_002_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_002_pos # # DESCRIPTION: # Ensure that the labelit(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS file system with some files. # 2. Run labelit(1M) against the device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { ismounted $TESTPOOL/$TESTFS (( $? != 0 )) && \ log_must $ZFS mount $TESTPOOL/$TESTFS $RM -rf $TESTDIR/* } log_onexit cleanup log_assert "Ensure that the labelit(1M) utility fails on a ZFS file system." test_requires LABELIT populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA log_must $ZFS unmount $TESTDIR -log_mustnot $LABELIT /dev/rdsk/${DISK}s0 mfiles ${DISK}s0 +log_mustnot $LABELIT /dev/${DISK}s0 mfiles ${DISK}s0 log_pass "labelit(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh (revision 331613) @@ -1,75 +1,75 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_005_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_005_pos # # DESCRIPTION: # Ensure that the ff(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS file system with some files. # 2. Run ff(1M) against the device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { $RM -rf $TESTDIR/* } log_onexit cleanup test_requires FF log_assert "Ensure that the ff(1M) utility fails on a ZFS file system." populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA -log_mustnot $FF -F zfs /dev/rdsk/${DISK}s0 +log_mustnot $FF -F zfs /dev/${DISK}s0 log_pass "ff(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh (revision 331613) @@ -1,79 +1,79 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_006_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_006_pos # # DESCRIPTION: # Ensure that the fsirand(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS file system with some files. # 2. Run fsirand(1M) against the device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { ismounted $TESTPOOL/$TESTFS (( $? != 0 )) && \ log_must $ZFS mount $TESTPOOL/$TESTFS $RM -rf $TESTDIR/* } log_onexit cleanup log_assert "Ensure that the fsirand(1M) utility fails on a ZFS file system." populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA log_must $ZFS unmount $TESTDIR -log_mustnot $FSIRAND /dev/rdsk/${DISK}s0 +log_mustnot $FSIRAND /dev/${DISK}s0 log_pass "fsirand(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh (revision 331613) @@ -1,81 +1,81 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_008_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_008_pos # # DESCRIPTION: # Ensure that the ncheck(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS file system with some files. # 2. Run ncheck(1M) against the device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { ismounted $TESTPOOL/$TESTFS (( $? != 0 )) && \ log_must $ZFS mount $TESTPOOL/$TESTFS $RM -rf $TESTDIR/* } log_onexit cleanup test_requires NCHECK log_assert "Ensure that the ncheck(1M) utility fails on a ZFS file system." populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA log_must $ZFS unmount $TESTDIR -log_mustnot $NCHECK /dev/rdsk/${DISK}s0 +log_mustnot $NCHECK /dev/${DISK}s0 log_pass "ncheck(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh (revision 331613) @@ -1,73 +1,73 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)utils_test_009_pos.ksh 1.2 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/utils_test/utils_test.kshlib ################################################################################ # # __stc_assertion_start # # ID: utils_test_009_pos # # DESCRIPTION: # Ensure that the tunefs(1M) utility fails on a ZFS file system. # # STRATEGY: # 1. Populate a ZFS file system with some files. # 2. Run tunefs(1M) against the device. # 3. Ensure it fails. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { $RM -rf $TESTDIR/* } log_onexit cleanup log_assert "Ensure that the tunefs(1M) utility fails on a ZFS file system." populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA -log_mustnot $TUNEFS -m 80 /dev/dsk/${DISK}s0 +log_mustnot $TUNEFS -m 80 /dev/${DISK}s0 log_pass "tunefs(1M) returned an error as expected." Index: head/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh (revision 331613) @@ -1,102 +1,102 @@ #!/usr/local/bin/ksh93 -p # # 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 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)xattr_004_pos.ksh 1.1 07/02/06 SMI" # # $FreeBSD$ . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/xattr/xattr_common.kshlib ################################################################################ # # __stc_assertion_start # # ID: xattr_004_pos # # DESCRIPTION: # # Creating files on ufs and tmpfs, and copying those files to ZFS with # appropriate cp flags, the xattrs will still be readable. # # STRATEGY: # 1. Create files in ufs and tmpfs with xattrs # 2. Copy those files to zfs # 3. Ensure the xattrs can be read and written # 4. Do the same in reverse. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-12-05) # # __stc_assertion_end # ################################################################################ # we need to be able to create zvols to hold our test # ufs filesystem. verify_runnable "global" # Make sure we clean up properly function cleanup { if [ $( ismounted $TMPDIR/ufs.${TESTCASE_ID} ufs ) ] then log_must $UMOUNT $TMPDIR/ufs.${TESTCASE_ID} log_must $RM -rf $TMPDIR/ufs.${TESTCASE_ID} fi } log_assert "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info." log_onexit cleanup test_requires RUNAT # Create a UFS file system that we can work in log_must $ZFS create -V128m $TESTPOOL/$TESTFS/zvol -log_must eval "$ECHO y | $NEWFS /dev/zvol/dsk/$TESTPOOL/$TESTFS/zvol > /dev/null 2>&1" +log_must eval "$ECHO y | $NEWFS /dev/zvol/$TESTPOOL/$TESTFS/zvol > /dev/null 2>&1" log_must $MKDIR $TMPDIR/ufs.${TESTCASE_ID} -log_must $MOUNT /dev/zvol/dsk/$TESTPOOL/$TESTFS/zvol $TMPDIR/ufs.${TESTCASE_ID} +log_must $MOUNT /dev/zvol/$TESTPOOL/$TESTFS/zvol $TMPDIR/ufs.${TESTCASE_ID} # Create files in ufs and tmpfs, and set some xattrs on them. log_must $TOUCH $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} log_must $TOUCH $TMPDIR/tmpfs-file.${TESTCASE_ID} log_must $RUNAT $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} $CP /etc/passwd . log_must $RUNAT $TMPDIR/tmpfs-file.${TESTCASE_ID} $CP /etc/group . # copy those files to ZFS log_must $CP -@ $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} $TESTDIR log_must $CP -@ $TMPDIR/tmpfs-file.${TESTCASE_ID} $TESTDIR # ensure the xattr information has been copied correctly log_must $RUNAT $TESTDIR/ufs-file.${TESTCASE_ID} $DIFF passwd /etc/passwd log_must $RUNAT $TESTDIR/tmpfs-file.${TESTCASE_ID} $DIFF group /etc/group log_must $UMOUNT $TMPDIR/ufs.${TESTCASE_ID} log_pass "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info." Index: head/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh (revision 331613) @@ -1,112 +1,112 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zones_001_pos.ksh 1.3 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib ################################################################################ # # __stc_assertion_start # # ID: zones_001_pos # # DESCRIPTION: # # The zone created by the default zones setup should have ZFS zvols, # datasets and filesystems present. # # STRATEGY: # 1. For each ZFS object type # 2. Perform a basic sanity check for that object in the local zone. # 3. Check that the top level dataset is read only. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-10-18) # # __stc_assertion_end # ################################################################################ verify_runnable "local" log_assert "Local zone contains ZFS datasets as expected." # check to see if our zvol exists: -if [ ! -b /dev/zvol/dsk/zonepool/zone_zvol ] +if [ ! -b /dev/zvol/zonepool/zone_zvol ] then - log_fail "block device /dev/zvol/dsk/zonepool/zone_zvol not found!" + log_fail "block device /dev/zvol/zonepool/zone_zvol not found!" fi -if [ ! -c /dev/zvol/rdsk/zonepool/zone_zvol ] +if [ ! -c /dev/zvol/zonepool/zone_zvol ] then - log_fail "char device /dev/zvol/rdsk/zonepool/zone_zvol not found!" + log_fail "char device /dev/zvol/zonepool/zone_zvol not found!" fi # check to see if the device appears sane - create a UFS filesystem on it. -$ECHO y | $NEWFS /dev/zvol/rdsk/zonepool/zone_zvol > /dev/null +$ECHO y | $NEWFS /dev/zvol/zonepool/zone_zvol > /dev/null if [ $? -ne 0 ] then log_fail "Failed to create UFS filesystem on a zvol in the zone!" fi $MKDIR /ufs.${TESTCASE_ID} -log_must $MOUNT /dev/zvol/dsk/zonepool/zone_zvol /ufs.${TESTCASE_ID} +log_must $MOUNT /dev/zvol/zonepool/zone_zvol /ufs.${TESTCASE_ID} log_must $UMOUNT /ufs.${TESTCASE_ID} $RM -rf /ufs.${TESTCASE_ID} # Next check to see if the datasets exist as expected. for dataset in 0 1 2 3 4 do DATASET=zonepool/zonectr${dataset} if [ ! -d /${DATASET} ] then log_note "Missing zone dataset ${DATASET}!" fi log_must $ZFS create ${DATASET}/fs if [ ! -d /${DATASET}/fs ] then log_fail "ZFS create failed to create child dataset of ${DATASET}" fi log_must $ZFS destroy ${DATASET}/fs done # Next check to see that the root dataset is readonly log_mustnot $ZFS create zonepool/fs log_mustnot $ZFS mount zonepool log_pass "Local zone contains ZFS datasets as expected." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib (revision 331613) @@ -1,165 +1,165 @@ # vim: filetype=sh # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_common.kshlib 1.6 09/06/22 SMI" # . $STF_SUITE/include/libtest.kshlib # # Create a simple zvol volume # # Where disk_device: is the name of the disk to be used # volume_size: is the size of the volume, e.g. 2G # function default_zvol_setup # disk_device volume_size { typeset disk=$1 typeset size=$2 typeset savedumpdev typeset -i output create_pool $TESTPOOL "$disk" log_must $ZFS create -V $size $TESTPOOL/$TESTVOL if [[ -n $DUMPADM ]]; then if is_dumpswap_supported $TESTPOOL ; then set_dumpsize $TESTPOOL/$TESTVOL fi fi } # # Destroy the default zvol which was setup using # default_zvol_setup(). # function default_zvol_cleanup { if datasetexists $TESTPOOL/$TESTVOL ; then log_must $ZFS destroy $TESTPOOL/$TESTVOL fi destroy_pool $TESTPOOL } # # Check if the given pool support "Swap and crash dumps" # function is_dumpswap_supported #pool { typeset pool=$1 if [[ -z $pool ]] ; then log_fail "No pool given." fi typeset -i SPA_VER_DUMPSWAP=10 typeset -i vp=$(get_pool_prop version $pool) if (( vp >= SPA_VER_DUMPSWAP )) ; then return 0 fi return 1 } function get_dumpdevice { typeset ret=$($DUMPADM | $GREP "Dump device:" | $AWK '{print $3}') print $ret } function set_dumpsize { typeset volume=$1 if [[ -z $volume ]] ; then log_note "No volume specified." return 1 fi log_must $ZFS set volsize=64m $volume - output=$($DUMPADM -d /dev/zvol/dsk/$volume 2>&1 | \ + output=$($DUMPADM -d /dev/zvol/$volume 2>&1 | \ $TAIL -1 | $AWK '{print $3}') if [[ -n $output ]]; then (( output = output / 1024 / 1024 )) (( output = output + output / 5 )) log_must $ZFS set volsize=${output}m $volume fi return 0 } function safe_dumpadm { typeset device=$1 if [[ -z $device || $device == "none" ]] ; then log_note "No dump device volume specified." return 1 fi - if [[ $device == "/dev/zvol/dsk/"* ]] ; then - typeset volume=${device#/dev/zvol/dsk/} + if [[ $device == "/dev/zvol/"* ]] ; then + typeset volume=${device#/dev/zvol/} set_dumpsize $volume log_must $DUMPADM -d $device else log_must $SWAPADD if ! is_swap_inuse $device ; then log_must $SWAP -a $device fi log_must $DUMPADM -d swap fi } function is_zvol_dumpified { typeset volume=$1 if [[ -z $volume ]] ; then log_note "No volume specified." return 1 fi $ZDB -dddd $volume 2 | $GREP "dumpsize" > /dev/null 2>&1 return $? } function is_swap_inuse { typeset device=$1 if [[ -z $device ]] ; then log_note "No device specified." return 1 fi $SWAP -l | $GREP -w $device > /dev/null 2>&1 return $? } Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh (revision 331613) @@ -1,85 +1,85 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_misc_001_neg.ksh 1.3 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_misc_001_neg # # DESCRIPTION: # Verify that using ZFS volume as a dump device fails until # dumpswap supported. # # STRATEGY: # 1. Create a ZFS volume # 2. Use dumpadm add the volume as dump device # 3. Verify the return code as expected. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2008-03-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset dumpdev=$(get_dumpdevice) if [[ $dumpdev != $savedumpdev ]] ; then safe_dumpadm $savedumpdev fi } log_assert "Verify that ZFS volume cannot act as dump device until dumpswap supported." log_onexit cleanup test_requires DUMPADM -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL savedumpdev=$(get_dumpdevice) if ! is_dumpswap_supported $TESTPOOL ; then log_mustnot $DUMPADM -d $voldev else safe_dumpadm $voldev fi log_pass "ZFS volume cannot act as dump device until dumpswap supported as expected." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh (revision 331613) @@ -1,93 +1,93 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_misc_003_neg.ksh 1.2 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_misc_003_neg # # DESCRIPTION: # Verify create storage pool or newfs over volume as dump device is denied. # # STRATEGY: # 1. Create a ZFS volume # 2. Use dumpadm set the volume as dump device # 3. Verify create pool & newfs over the volume return an error. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2008-01-07) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset dumpdev=$(get_dumpdevice) if [[ $dumpdev != $savedumpdev ]] ; then safe_dumpadm $savedumpdev fi if poolexists $TESTPOOL1 ; then destroy_pool $TESTPOOL1 fi } log_assert "Verify create storage pool or newfs over dump volume is denied." if ! is_dumpswap_supported $TESTPOOL ; then log_unsupported "dumpswap not currently supported." fi log_onexit cleanup test_requires DUMPADM -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL savedumpdev=$(get_dumpdevice) safe_dumpadm $voldev $ECHO "y" | $NEWFS $voldev > /dev/null 2>&1 if (( $? == 0 )) ; then log_fail "newfs over dump volume succeed unexpected" fi log_mustnot $ZPOOL create $TESTPOOL1 $voldev log_pass "Verify create storage pool or newfs over dump volume is denied." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh (revision 331613) @@ -1,129 +1,129 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_misc_004_pos.ksh 1.1 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_misc_004_pos # # DESCRIPTION: # Verify permit to create snapshot over active dumpswap zvol. # # STRATEGY: # 1. Create a ZFS volume # 2. Set the volume as dump or swap # 3. Verify create snapshot over the zvol succeed. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2008-01-07) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset dumpdev=$(get_dumpdevice) if [[ $dumpdev != $savedumpdev ]] ; then safe_dumpadm $savedumpdev fi $SWAP -l | $GREP -w $voldev > /dev/null 2>&1 if (( $? == 0 )); then log_must $SWAP -d $voldev fi typeset snap for snap in snap0 snap1 ; do if datasetexists $TESTPOOL/$TESTVOL@$snap ; then log_must $ZFS destroy $TESTPOOL/$TESTVOL@$snap fi done } function verify_snapshot { typeset volume=$1 log_must $ZFS snapshot $volume@snap0 log_must $ZFS snapshot $volume@snap1 log_must datasetexists $volume@snap0 $volume@snap1 log_must $ZFS destroy $volume@snap1 log_must $ZFS snapshot $volume@snap1 log_mustnot $ZFS rollback -r $volume@snap0 log_must datasetexists $volume@snap0 log_must datasetexists $volume@snap1 log_must $ZFS destroy -r $volume@snap0 } log_assert "Verify permit to create snapshot over dumpswap." if ! is_dumpswap_supported $TESTPOOL ; then log_unsupported "dumpswap not currently supported." fi log_onexit cleanup test_requires DUMPADM -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL savedumpdev=$(get_dumpdevice) # create snapshot over dump zvol safe_dumpadm $voldev log_must is_zvol_dumpified $TESTPOOL/$TESTVOL verify_snapshot $TESTPOOL/$TESTVOL safe_dumpadm $savedumpdev log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL # create snapshot over swap zvol log_must $SWAP -a $voldev log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL verify_snapshot $TESTPOOL/$TESTVOL log_must $SWAP -d $voldev log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL log_pass "Create snapshot over dumpswap zvol succeed." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh (revision 331613) @@ -1,94 +1,94 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_misc_005_neg.ksh 1.1 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_misc_005_neg # # DESCRIPTION: # Verify a device cannot be dump and swap at the same time. # # STRATEGY: # 1. Create a ZFS volume # 2. Set it as swap device. # 3. Verify dumpadm with this zvol will fail. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2008-03-10) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { $SWAP -l | $GREP $voldev > /dev/null 2>&1 if (( $? == 0 )) ; then log_must $SWAP -d $voldev fi typeset dumpdev=$(get_dumpdevice) if [[ $dumpdev != $savedumpdev ]] ; then safe_dumpadm $savedumpdev fi } log_assert "Verify a device cannot be dump and swap at the same time." if ! is_dumpswap_supported $TESTPOOL ; then log_unsupported "dumpswap not currently supported." fi log_onexit cleanup test_requires DUMPADM -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL savedumpdev=$(get_dumpdevice) # If device in swap list, it cannot be dump device log_must $SWAP -a $voldev log_mustnot $DUMPADM -d $voldev log_must $SWAP -d $voldev # If device has dedicated as dump device, it cannot add into swap list safe_dumpadm $voldev log_mustnot $SWAP -a $voldev log_pass "A device cannot be dump and swap at the same time." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh (revision 331613) @@ -1,92 +1,92 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_misc_006_pos.ksh 1.1 09/01/12 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_misc_006_pos # # DESCRIPTION: # ZFS volume as dump device, it should always have 128k volblocksize # # STRATEGY: # 1. Create a ZFS volume # 2. Use dumpadm set the volume as dump device # 3. Verify the volume's volblocksize=128k # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2008-12-01) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset dumpdev=$(get_dumpdevice) if [[ $dumpdev != $savedumpdev ]] ; then safe_dumpadm $savedumpdev fi } log_assert "zfs volume as dumpdevice should have 128k volblocksize" if ! is_dumpswap_supported $TESTPOOL ; then log_unsupported "dumpswap not currently supported." fi log_onexit cleanup test_requires DUMPADM -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL savedumpdev=$(get_dumpdevice) typeset oblksize=$($ZFS get -H -o value volblocksize $TESTPOOL/$TESTVOL) log_note "original $TESTPOOL/$TESTVOL volblocksize=$oblksize" safe_dumpadm $voldev typeset blksize=$($ZFS get -H -o value volblocksize $TESTPOOL/$TESTVOL) if [[ $blksize != "128K" ]]; then log_fail "ZFS volume $TESTPOOL/$TESTVOL volblocksize=$blksize" fi log_pass "zfs volume as dumpdevice should have 128k volblocksize" Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh (revision 331613) @@ -1,52 +1,52 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # ident "@(#)cleanup.ksh 1.3 08/05/14 SMI" # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib verify_runnable "global" log_must $SWAPADD for swapdev in $SAVESWAPDEVS do if ! is_swap_inuse $swapdev ; then log_must $SWAP -a $swapdev >/dev/null 2>&1 fi done -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL if is_swap_inuse $voldev ; then log_must $SWAP -d $voldev fi default_zvol_cleanup log_pass Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh (revision 331613) @@ -1,93 +1,93 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # ident "@(#)zvol_swap_001_pos.ksh 1.3 08/05/14 SMI" # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_swap_001_pos # # DESCRIPTION: # Verify that a zvol can be used as a swap device # # STRATEGY: # 1. Create a pool # 2. Create a zvol volume # 3. Use zvol as swap space # 4. Create a file under $TMPDIR # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { $RM -rf $TMPDIR/$TESTFILE if is_swap_inuse $voldev ; then log_must $SWAP -d $voldev fi } log_assert "Verify that a zvol can be used as a swap device" log_onexit cleanup test_requires SWAP -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL log_note "Add zvol volume as swap space" log_must $SWAP -a $voldev log_note "Create a file under $TMPDIR" log_must $FILE_WRITE -o create -f $TMPDIR/$TESTFILE \ -b $BLOCKSZ -c $NUM_WRITES -d $DATA [[ ! -f $TMPDIR/$TESTFILE ]] && log_fail "Unable to create file under $TMPDIR" filesize=`$LS -l $TMPDIR/$TESTFILE | $AWK '{print $5}'` tf_size=$(( BLOCKSZ * NUM_WRITES )) (( $tf_size != $filesize )) && log_fail "testfile is ($filesize bytes), expected ($tf_size bytes)" log_pass "Successfully added a zvol to swap area." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh (revision 331613) @@ -1,100 +1,100 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # ident "@(#)zvol_swap_002_pos.ksh 1.4 09/05/19 SMI" # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ############################################################################### # # __stc_assertion_start # # ID: zvol_swap_002_pos # # DESCRIPTION: # Using a zvol as swap space, fill with files until ENOSPC returned. # # STRATEGY: # 1. Create a pool # 2. Create a zvol volume # 3. Add zvol to swap space # 4. Fill swap space until ENOSPC is returned # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ log_unsupported "Fill swap will cause system hang, hide this case temporarily." verify_runnable "global" function cleanup { $RM -rf $TMPDIR/$TESTDIR if is_swap_inuse $voldev ; then log_must $SWAP -d $voldev fi } log_assert "Using a zvol as swap space, fill with files until ENOSPC returned." if ! is_dumpswap_supported $TESTPOOL ; then log_unsupported "ZVOLs as swap devices are not currently supported." fi log_onexit cleanup -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL $SWAP -l | $GREP zvol if (( $? != 0 )) ; then log_note "Add zvol volume as swap space" log_must $SWAP -a $voldev fi typeset -i filenum=0 typeset -i retval=0 typeset testdir=$TMPDIR/$TESTDIR log_note "Attempt to fill $TMPDIR until ENOSPC is hit" fill_fs $testdir -1 100 $BLOCKSZ $NUM_WRITES retval=$? (( $retval != $ENOSPC )) && \ log_fail "ENOSPC was not returned, $retval was returned instead" log_pass "ENOSPC was returned as expected" Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh (revision 331613) @@ -1,163 +1,163 @@ #! /usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_swap_003_pos.ksh 1.3 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ################################################################## # # __stc_assertion_start # # ID: zvol_swap_003_pos # # DESCRIPTION: # Verify that a zvol device can be used as a swap device # through /etc/vfstab configuration. # # STRATEGY: # 1. Create a pool # 2. Create a zvol volume # 3. Save current swaps info and delete current swaps # 4. Modify /etc/vfstab to add entry for zvol as swap device # 5. Use /sbin/swapadd to zvol as swap device throuth /etc/vfstab # 6. Create a file under $TMPDIR # 7. Verify the file # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2005-07-04) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { if [[ -f $TMPDIR/$TESTFILE ]]; then log_must $RM -rf $TMPDIR/$TESTFILE fi if [[ -f $TMP_VFSTAB_FILE ]]; then log_must $RM -rf $TMP_VFSTAB_FILE fi if [[ -f $NEW_VFSTAB_FILE ]]; then log_must $RM -f $NEW_VFSTAB_FILE fi if [[ -f $PREV_VFSTAB_FILE ]]; then log_must $MV $PREV_VFSTAB_FILE $VFSTAB_FILE fi log_must $SWAPADD $VFSTAB_FILE if is_swap_inuse $voldev ; then log_must $SWAP -d $voldev fi } log_assert "Verify that a zvol device can be used as a swap device"\ "through /etc/vfstab configuration." log_onexit cleanup test_requires SWAPADD -voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +voldev=/dev/zvol/$TESTPOOL/$TESTVOL VFSTAB_FILE=/etc/vfstab NEW_VFSTAB_FILE=$TMPDIR/zvol_vfstab.${TESTCASE_ID} PREV_VFSTAB_FILE=$TMPDIR/zvol_vfstab.PREV.${TESTCASE_ID} TMP_VFSTAB_FILE=$TMPDIR/zvol_vfstab.tmp.${TESTCASE_ID} if [[ -f $NEW_VFSTAB_FILE ]]; then $RM -f $NEW_VFSTAB_FILE fi $TOUCH $NEW_VFSTAB_FILE $CHMOD 777 $NEW_VFSTAB_FILE # # Go through each line of /etc/vfstab and # exclude the comment line and formulate # a new file with an entry of zvol device # swap device. # $GREP -v "^#" $VFSTAB_FILE > $TMP_VFSTAB_FILE typeset -i fndswapline=0 while read -r i do line=`$ECHO "$i" | $AWK '{print $4}'` if [[ $line == "swap" ]]; then if [[ $fndswapline -eq 0 ]]; then $ECHO "$voldev"\ "\t-\t-\tswap\t-"\ "\tno\t-" \ >> $NEW_VFSTAB_FILE fndswapline=1 $ECHO "Add an entry of zvol device as"\ "swap device in $VFSTAB_FILE." fi else $ECHO "$i" >> $NEW_VFSTAB_FILE fi done < $TMP_VFSTAB_FILE if [[ $fndswapline -eq 1 ]]; then log_must $CP $VFSTAB_FILE $PREV_VFSTAB_FILE log_must $CP $NEW_VFSTAB_FILE $VFSTAB_FILE else log_fail "The system has no swap device configuration in /etc/vfstab" fi log_note "Add zvol volume as swap space" log_must $SWAPADD $VFSTAB_FILE log_note "Create a file under $TMPDIR" log_must $FILE_WRITE -o create -f $TMPDIR/$TESTFILE \ -b $BLOCKSZ -c $NUM_WRITES -d $DATA [[ ! -f $TMPDIR/$TESTFILE ]] && log_fail "Unable to create file under $TMPDIR" filesize=`$LS -l $TMPDIR/$TESTFILE | $AWK '{print $5}'` tf_size=$(( BLOCKSZ * NUM_WRITES )) (( $tf_size != $filesize )) && \ log_fail "testfile is ($filesize bytes), expected ($tf_size bytes)" log_pass "Successfully added a zvol to swap area through /etc/vfstab." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh (revision 331613) @@ -1,108 +1,108 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_swap_004_pos.ksh 1.1 07/01/09 SMI" # . $STF_SUITE/include/libtest.kshlib ################################################################################# # # __stc_assertion_start # # ID: zvol_swap_004_pos # # DESCRIPTION: # The minimum volume size for swap should be a multiple of 2 pagesize # bytes. # # STRATEGY: # 1. Get test system page size. # 2. Create different size volumes. # 3. Verify 'swap -a' has correct behaviour. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-12-12) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset tmp for tmp in $swaplist ; do log_must $SWAP -d $tmp done for tmp in $vollist ; do log_must $ZFS destroy $tmp done } log_assert "The minimum volume size should be a multiple of 2 pagesize bytes." log_onexit cleanup test_requires SWAP typeset -i volblksize pagesize=$($PAGESIZE) ((volblksize = pagesize / 2)) # # volume size for swap Expected results # set -A array \ $((volblksize)) "fail" \ $((2 * volblksize)) "fail" \ $((3 * volblksize)) "fail" \ $((4 * volblksize)) "pass" \ $((5 * volblksize)) "pass" \ $((6 * volblksize)) "pass" typeset -i i=0 while ((i < ${#array[@]})); do vol="$TESTPOOL/vol_${array[$i]}" vollist="$vollist $vol" log_must $ZFS create -b $volblksize -V ${array[$i]} $vol - swapname="/dev/zvol/dsk/$vol" + swapname="/dev/zvol/$vol" if [[ ${array[((i+1))]} == "fail" ]]; then log_mustnot $SWAP -a $swapname else log_must $SWAP -a $swapname swaplist="$swaplist $swapname" fi ((i += 2)) done log_pass "Verify the minimum volume size pass." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh (revision 331613) @@ -1,109 +1,109 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_swap_005_pos.ksh 1.2 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ################################################################################# # # __stc_assertion_start # # ID: zvol_swap_005_pos # # DESCRIPTION: # swaplow + swaplen must be less than or equal to the volume size. # # STRATEGY: # 1. Get test system page size and test volume size. # 2. Random get swaplow and swaplen. # 3. Verify swap -a should succeed when swaplow + swaplen <= volume size. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-12-12) # # __stc_assertion_end # ################################################################################ verify_runnable "global" log_assert "swaplow + swaplen must be less than or equal to the volume size." test_requires SWAP typeset vol=$TESTPOOL/$TESTVOL typeset -i pageblocks volblocks # # Both swaplow and swaplen are the desired length of # the swap area in 512-byte blocks. # ((pageblocks = $($PAGESIZE) / 512)) ((volblocks = $(get_prop volsize $vol) / 512)) typeset -i i=0 while ((i < 10)) ; do while true; do ((swaplow = RANDOM % volblocks)) # Upwards increment ((swaplow += pageblocks)) ((swaplow -= (swaplow % pageblocks))) # At lease one page size was left for swap area ((swaplow != volblocks)) && break done while true; do ((swaplen = RANDOM % (volblocks - swaplow))) # Downward increment ((swaplen -= (swaplen % pageblocks))) # At lease one page size was left for swap area ((swaplen != 0)) && break done # The minimum swap size should be 2 pagesize. ((swaplow + swaplen < pageblocks * 2)) && continue - swapname="/dev/zvol/dsk/$vol" + swapname="/dev/zvol/$vol" if is_swap_inuse $swapname ; then log_must $SWAP -d $swapname fi log_must $SWAP -a $swapname $swaplow $swaplen log_must $SWAP -d $swapname $swaplow ((i += 1)) done log_pass "Verify swaplow + swaplen must be less than or equal to volsize passed." Index: head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh =================================================================== --- head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh (revision 331612) +++ head/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh (revision 331613) @@ -1,120 +1,120 @@ #!/usr/local/bin/ksh93 -p # # 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 # # $FreeBSD$ # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)zvol_swap_006_pos.ksh 1.4 08/05/14 SMI" # . $STF_SUITE/include/libtest.kshlib . $STF_SUITE/tests/zvol/zvol_common.kshlib ################################################################################# # # __stc_assertion_start # # ID: zvol_swap_006_pos # # DESCRIPTION: # A volume can be add as several segments, but overlapping are not # allowed. # # STRATEGY: # 1. Figure out three groups swaplow and swaplen. # 2. Verify different volume segments can be added correctly. # 3. Verify overlapping swap volume are not allowed. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2006-12-13) # # __stc_assertion_end # ################################################################################ verify_runnable "global" function cleanup { typeset -i i=0 while ((count > 0)); do log_must $SWAP -d $swapname ${swap_opt[$i]} ((i += 2)) ((count -= 1)) done } log_assert "Verify volume can be add as several segments, but overlapping " \ "are not allowed." log_onexit cleanup test_requires SWAP typeset vol=$TESTPOOL/$TESTVOL typeset -i pageblocks volblocks ((pageblocks = $($PAGESIZE) / 512)) ((volblocks = $(get_prop volsize $vol) / 512)) log_note "Verify volume can be add as several segments." # # swaplow swaplen set -A swap_opt $((pageblocks)) \ $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ $((volblocks / 3)) \ $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ $((volblocks / 2)) \ $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ $(((volblocks*2) / 3)) \ $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) -swapname=/dev/zvol/dsk/$vol +swapname=/dev/zvol/$vol typeset -i i=0 count=0 if is_swap_inuse $swapname ; then log_must $SWAP -d $swapname fi while ((i < ${#swap_opt[@]})); do log_must $SWAP -a $swapname ${swap_opt[$i]} ${swap_opt[((i+1))]} ((i += 2)) ((count += 1)) done log_note "Verify overlapping swap volume are not allowed" i=0 while ((i < ${#swap_opt[@]})); do log_mustnot $SWAP -a $swapname ${swap_opt[$i]} ((i += 2)) done log_pass "Verify volume can be added as several segments passed."