1 #!/bin/ksh -p
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 
  23 #
  24 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  25 # Use is subject to license terms.
  26 #
  27 
  28 #
  29 # Copyright (c) 2013 by Delphix. All rights reserved.
  30 #
  31 
  32 . $STF_SUITE/tests/functional/rsend/rsend.kshlib
  33 
  34 #
  35 # DESCRIPTION:
  36 #       Changes made by 'zfs inherit' can be properly received.
  37 #
  38 # STRATEGY:
  39 #       1. Inherit property for filesystem and volume
  40 #       2. Send and restore them in the target pool
  41 #       3. Verify all the datasets can be properly backup and receive
  42 #
  43 
  44 verify_runnable "both"
  45 
  46 function cleanup
  47 {
  48         export __ZFS_POOL_RESTRICT="$POOL $POOL2"
  49         log_must $ZFS unmount -a
  50         unset __ZFS_POOL_RESTRICT
  51         log_must cleanup_pool $POOL
  52         log_must cleanup_pool $POOL2
  53 
  54         log_must setup_test_model $POOL
  55 }
  56 
  57 log_assert "Verify changes made by 'zfs inherit' can be properly received."
  58 log_onexit cleanup
  59 
  60 #
  61 # Setting all the $FS properties as local value,
  62 #
  63 for prop in $(fs_inherit_prop); do
  64         value=$(get_prop $prop $POOL/$FS)
  65         log_must $ZFS set $prop=$value $POOL/$FS
  66 done
  67 
  68 #
  69 # Inherit propertes in sub-datasets
  70 #
  71 for ds in "$POOL/$FS/fs1" "$POOL/$FS/fs1/fs2" "$POOL/$FS/fs1/fclone" ; do
  72         for prop in $(fs_inherit_prop) ; do
  73                 $ZFS inherit $prop $ds
  74                 if (($? !=0 )); then
  75                         log_fail "$ZFS inherit $prop $ds"
  76                 fi
  77         done
  78 done
  79 if is_global_zone ; then
  80         for prop in $(vol_inherit_prop) ; do
  81                 $ZFS inherit $prop $POOL/$FS/vol
  82                 if (($? !=0 )); then
  83                         log_fail "$ZFS inherit $prop $POOL/$FS/vol"
  84                 fi
  85         done
  86 fi
  87 
  88 #
  89 # Verify datasets can be backup and restore correctly
  90 # Unmount $POOL/$FS to avoid two fs mount in the same mountpoint
  91 #
  92 log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-R"
  93 log_must $ZFS unmount -f $POOL/$FS
  94 log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-R"
  95 
  96 dstds=$(get_dst_ds $POOL $POOL2)
  97 #
  98 # Define all the POOL/POOL2 datasets pair
  99 #
 100 set -A pair     "$POOL"                 "$dstds"                \
 101                 "$POOL/$FS"             "$dstds/$FS"            \
 102                 "$POOL/$FS/fs1"         "$dstds/$FS/fs1"        \
 103                 "$POOL/$FS/fs1/fs2"     "$dstds/$FS/fs1/fs2"    \
 104                 "$POOL/pclone"          "$dstds/pclone"         \
 105                 "$POOL/$FS/fs1/fclone"  "$dstds/$FS/fs1/fclone"
 106 
 107 if is_global_zone ; then
 108         typeset -i n=${#pair[@]}
 109         pair[((n))]="$POOL/vol";        pair[((n+1))]="$dstds/vol"
 110         pair[((n+2))]="$POOL/$FS/vol"   pair[((n+3))]="$dstds/$FS/vol"
 111 fi
 112 
 113 #
 114 # Verify all the sub-datasets can be properly received.
 115 #
 116 log_must cmp_ds_subs $POOL $dstds
 117 typeset -i i=0
 118 while ((i < ${#pair[@]})); do
 119         log_must cmp_ds_cont ${pair[$i]} ${pair[((i+1))]}
 120         log_must cmp_ds_prop ${pair[$i]} ${pair[((i+1))]}
 121 
 122         ((i += 2))
 123 done
 124 
 125 log_pass "Changes made by 'zfs inherit' can be properly received."