1#!/bin/ksh 2# SPDX-License-Identifier: CDDL-1.0 3# 4# This file and its contents are supplied under the terms of the 5# Common Development and Distribution License ("CDDL"), version 1.0. 6# You may only use this file in accordance with the terms of version 7# 1.0 of the CDDL. 8# 9# A full copy of the text of the CDDL should have accompanied this 10# source. A copy of the CDDL is also available via the Internet at 11# https://opensource.org/license/CDDL-1.0. 12# 13 14# 15# Copyright (c) 2012, 2016 by Delphix. All rights reserved. 16# 17 18. $STF_SUITE/include/libtest.shlib 19 20# 21# DESCRIPTION: 22# Verify 'zfs list -t all -o name,origin,clones' prints the correct 23# clone information 24# 25# STRATEGY: 26# 1. Create datasets 27# 2. Create recursive snapshots and their clones 28# 3. Verify zfs clones property displays right information for different 29# cases 30# 31 32verify_runnable "both" 33 34function local_cleanup 35{ 36 typeset -i i=1 37 for ds in $datasets; do 38 datasetexists $ds/$TESTCLONE.$i && \ 39 destroy_dataset $ds/$TESTCLONE.$i -rf 40 datasetexists $ds && destroy_dataset $ds -Rf 41 ((i=i+1)) 42 done 43} 44 45# Set up filesystem with clones 46function setup_ds 47{ 48 typeset -i i=1 49 # create nested datasets 50 log_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 51 52 # verify dataset creation 53 for ds in $datasets; do 54 datasetexists $ds || log_fail "Create $ds dataset fail." 55 done 56 57 # create recursive nested snapshot 58 log_must zfs snapshot -r $TESTPOOL/$TESTFS1@snap 59 for ds in $datasets; do 60 datasetexists $ds@snap || \ 61 log_fail "Create $ds@snap snapshot fail." 62 done 63 for ds in $datasets; do 64 for fs in $datasets; do 65 log_must zfs clone $ds@snap $fs/$TESTCLONE.$i 66 done 67 ((i=i+1)) 68 done 69} 70 71# Verify clone list 72function verify_clones 73{ 74 typeset -i no_clones=$1 75 typeset unexpected=$2 76 typeset clone_snap=$3 77 typeset -i i=1 78 for ds in $datasets; do 79 if [[ -n $clone_snap ]]; then 80 clone_snap=/$TESTCLONE.$i 81 fi 82 snapshot=$(echo "$names" | grep $ds$clone_snap@snap) 83 actual_clone=$(zfs list -t all -o clones $snapshot | tail -1) 84 save=$IFS 85 IFS=',' 86 typeset -a clones=() 87 for token in $actual_clone; do 88 clones=( "${clones[@]}" "$token" ) 89 done 90 IFS=$save 91 [[ ${#clones[*]} -ne $no_clones ]] && \ 92 log_fail "$snapshot has unexpected number of clones" \ 93 " ${#clones[*]}" 94 expected_clone="" 95 unexpected_clone="" 96 if [[ $unexpected -eq 1 ]]; then 97 for fs in $datasets; do 98 if [[ $fs == $ds ]]; then 99 if [[ -z $clone_snap ]]; then 100 unexpected_clone=$fs/$TESTCLONE.$i 101 (for match in ${clones[@]};do 102 [[ $match != $unexpected_clone ]] && \ 103 exit 0; done) || log_fail \ 104 "Unexpected clones of the snapshot" 105 else 106 expected_clone=$fs 107 unexpected_clone=$fs/$TESTCLONE.$i 108 (for match in ${clones[@]};do 109 [[ $match == $expected_clone ]] && \ 110 [[ $match != $unexpected_clone ]] \ 111 && exit 0; done) || log_fail \ 112 "Unexpected clones of the snapshot" 113 fi 114 else 115 expected_clone=$fs/$TESTCLONE.$i 116 (for match in ${clones[@]};do 117 [[ $match == $expected_clone ]] && \ 118 exit 0; done) || log_fail \ 119 "Unexpected clones of the snapshot" 120 fi 121 done 122 else 123 for fs in $datasets; do 124 expected_clone=$fs/$TESTCLONE.$i 125 (for match in ${clones[@]};do 126 [[ $match == $expected_clone ]] && exit 0; \ 127 done) || log_fail "Unexpected clones" \ 128 " of the snapshot" 129 done 130 fi 131 ((i=i+1)) 132 done 133} 134 135 136log_onexit local_cleanup 137datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 138 $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" 139 140typeset -a d_clones 141typeset -a deferred_snaps 142typeset -i i 143log_must setup_ds 144 145log_note "Verify zfs clone property for multiple clones" 146names=$(zfs list -rt all -o name $TESTPOOL) 147log_must verify_clones 3 0 148 149log_note "verify clone property for clone deletion" 150i=1 151for ds in $datasets; do 152 log_must zfs destroy $ds/$TESTCLONE.$i 153 ((i=i+1)) 154done 155names=$(zfs list -rt all -o name $TESTPOOL) 156log_must verify_clones 2 1 157 158log_must local_cleanup 159log_must setup_ds 160 161log_note "verify zfs deferred destroy on clones property" 162names=$(zfs list -rt all -o name $TESTPOOL) 163for ds in $datasets; do 164 log_must zfs destroy -d $ds@snap 165 deferred_snaps=( "${deferred_snaps[@]}" "$ds@snap" ) 166done 167log_must verify_clones 3 0 168 169log_note "verify zfs deferred destroy by destroying clones on clones property" 170d_clones=() 171i=1 172for ds in $datasets; do 173 for fs in $datasets; do 174 log_must zfs destroy $fs/$TESTCLONE.$i 175 d_clones=( "${d_clones[@]}" "$fs/$TESTCLONE.$i" ) 176 done 177 ((i=i+1)) 178done 179names=$(zfs list -rtall -o name $TESTPOOL) 180for snap in ${deferred_snaps[@]}; do 181 status=$(echo "$names" | grep $snap) 182 [[ -z $status ]] || \ 183 log_fail "$snap exist after deferred destroy" 184done 185for dclone in ${d_clones[@]}; do 186 log_note "D CLONE = $dclone" 187 status=$(echo "$names" | grep $dclone) 188 [[ -z $status ]] || \ 189 log_fail "$dclone exist after deferred destroy" 190done 191 192log_must local_cleanup 193log_must setup_ds 194log_note "verify clone property for zfs promote" 195i=1 196for ds in $datasets; do 197 log_must zfs promote $ds/$TESTCLONE.$i 198 ((i=i+1)) 199done 200names=$(zfs list -rt all -o name,clones $TESTPOOL) 201log_must verify_clones 3 1 $TESTCLONE 202for ds in $datasets; do 203 log_must zfs promote $ds 204done 205log_must local_cleanup 206 207log_note "verify clone list truncated correctly" 208fs=$TESTPOOL/$TESTFS1 209xs=""; for i in {1..200}; do xs+="x"; done 210maxproplen=8192 211log_must zfs create $fs 212log_must zfs snapshot $fs@snap 213for (( i = 1; i <= (maxproplen / 200 + 1); i++ )); do 214 log_must zfs clone ${fs}@snap ${fs}/${TESTCLONE}${xs}.${i} 215done 216clone_list=$(zfs list -o clones $fs@snap) 217char_count=$(echo "$clone_list" | tail -1 | wc -c) 218[[ $char_count -eq $maxproplen ]] || \ 219 log_fail "Clone list not truncated correctly. Unexpected character count" \ 220 "$char_count" 221 222log_pass "'zfs list -o name,origin,clones prints the correct clone information." 223