1*5ac95da7SSerapheim Dimitropoulos#!/bin/ksh -p 2*5ac95da7SSerapheim Dimitropoulos# 3*5ac95da7SSerapheim Dimitropoulos# CDDL HEADER START 4*5ac95da7SSerapheim Dimitropoulos# 5*5ac95da7SSerapheim Dimitropoulos# The contents of this file are subject to the terms of the 6*5ac95da7SSerapheim Dimitropoulos# Common Development and Distribution License (the "License"). 7*5ac95da7SSerapheim Dimitropoulos# You may not use this file except in compliance with the License. 8*5ac95da7SSerapheim Dimitropoulos# 9*5ac95da7SSerapheim Dimitropoulos# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*5ac95da7SSerapheim Dimitropoulos# or http://www.opensolaris.org/os/licensing. 11*5ac95da7SSerapheim Dimitropoulos# See the License for the specific language governing permissions 12*5ac95da7SSerapheim Dimitropoulos# and limitations under the License. 13*5ac95da7SSerapheim Dimitropoulos# 14*5ac95da7SSerapheim Dimitropoulos# When distributing Covered Code, include this CDDL HEADER in each 15*5ac95da7SSerapheim Dimitropoulos# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*5ac95da7SSerapheim Dimitropoulos# If applicable, add the following below this CDDL HEADER, with the 17*5ac95da7SSerapheim Dimitropoulos# fields enclosed by brackets "[]" replaced with your own identifying 18*5ac95da7SSerapheim Dimitropoulos# information: Portions Copyright [yyyy] [name of copyright owner] 19*5ac95da7SSerapheim Dimitropoulos# 20*5ac95da7SSerapheim Dimitropoulos# CDDL HEADER END 21*5ac95da7SSerapheim Dimitropoulos# 22*5ac95da7SSerapheim Dimitropoulos 23*5ac95da7SSerapheim Dimitropoulos# 24*5ac95da7SSerapheim Dimitropoulos# Copyright (c) 2016 by Delphix. All rights reserved. 25*5ac95da7SSerapheim Dimitropoulos# 26*5ac95da7SSerapheim Dimitropoulos 27*5ac95da7SSerapheim Dimitropoulos. $STF_SUITE/include/libtest.shlib 28*5ac95da7SSerapheim Dimitropoulos 29*5ac95da7SSerapheim Dimitropoulos# 30*5ac95da7SSerapheim Dimitropoulos# DESCRIPTION: 31*5ac95da7SSerapheim Dimitropoulos# zfs rename should work on existing datasets that exceed 32*5ac95da7SSerapheim Dimitropoulos# zfs_max_dataset_nesting (our nesting limit) except in the 33*5ac95da7SSerapheim Dimitropoulos# scenario that we try to rename it to something deeper 34*5ac95da7SSerapheim Dimitropoulos# than it already is. 35*5ac95da7SSerapheim Dimitropoulos# 36*5ac95da7SSerapheim Dimitropoulos# STRATEGY: 37*5ac95da7SSerapheim Dimitropoulos# 1. Create a set of ZFS datasets within our nesting limit. 38*5ac95da7SSerapheim Dimitropoulos# 2. Try renaming one of them on top of the other so its 39*5ac95da7SSerapheim Dimitropoulos# children pass the limit - it should fail. 40*5ac95da7SSerapheim Dimitropoulos# 3. Increase the nesting limit. 41*5ac95da7SSerapheim Dimitropoulos# 4. Check that renaming a dataset on top of the other 42*5ac95da7SSerapheim Dimitropoulos# cannot exceed the new nesting limit but can exceed 43*5ac95da7SSerapheim Dimitropoulos# the old one. 44*5ac95da7SSerapheim Dimitropoulos# 5. Bring back the old nesting limit so you can simulate 45*5ac95da7SSerapheim Dimitropoulos# the scenario of existing datasets that exceed our 46*5ac95da7SSerapheim Dimitropoulos# nesting limit. 47*5ac95da7SSerapheim Dimitropoulos# 6. Make sure that 'zfs rename' can work only if we are 48*5ac95da7SSerapheim Dimitropoulos# trying to keep existing datasets that exceed the limit 49*5ac95da7SSerapheim Dimitropoulos# at the same nesting level or less. Making it even 50*5ac95da7SSerapheim Dimitropoulos# deeper should not work. 51*5ac95da7SSerapheim Dimitropoulos# 52*5ac95da7SSerapheim Dimitropoulos 53*5ac95da7SSerapheim Dimitropoulosverify_runnable "both" 54*5ac95da7SSerapheim Dimitropoulos 55*5ac95da7SSerapheim DimitropoulosdsA01="a" 56*5ac95da7SSerapheim DimitropoulosdsA02="a/a" 57*5ac95da7SSerapheim DimitropoulosdsA49=$(printf 'a/%.0s' {1..48})"a" 58*5ac95da7SSerapheim Dimitropoulos 59*5ac95da7SSerapheim DimitropoulosdsB01="b" 60*5ac95da7SSerapheim DimitropoulosdsB49=$(printf 'b/%.0s' {1..48})"b" 61*5ac95da7SSerapheim Dimitropoulos 62*5ac95da7SSerapheim DimitropoulosdsC01="c" 63*5ac95da7SSerapheim DimitropoulosdsC16=$(printf 'c/%.0s' {1..15})"c" 64*5ac95da7SSerapheim Dimitropoulos 65*5ac95da7SSerapheim DimitropoulosdsB16A=$(printf 'b/%.0s' {1..16})"a" 66*5ac95da7SSerapheim DimitropoulosdsB15A=$(printf 'b/%.0s' {1..15})"a" 67*5ac95da7SSerapheim Dimitropoulos 68*5ac95da7SSerapheim DimitropoulosdsB15A47A=$(printf 'b/%.0s' {1..15})$(printf 'a/%.0s' {1..47})"a" 69*5ac95da7SSerapheim DimitropoulosdsB15A47C=$(printf 'b/%.0s' {1..15})$(printf 'a/%.0s' {1..47})"c" 70*5ac95da7SSerapheim Dimitropoulos 71*5ac95da7SSerapheim DimitropoulosdsB15A40B=$(printf 'b/%.0s' {1..15})$(printf 'a/%.0s' {1..40})"b" 72*5ac95da7SSerapheim DimitropoulosdsB15A47B=$(printf 'b/%.0s' {1..15})$(printf 'a/%.0s' {1..47})"b" 73*5ac95da7SSerapheim Dimitropoulos 74*5ac95da7SSerapheim Dimitropoulosfunction nesting_cleanup 75*5ac95da7SSerapheim Dimitropoulos{ 76*5ac95da7SSerapheim Dimitropoulos log_must zfs destroy -fR $TESTPOOL/$dsA01 77*5ac95da7SSerapheim Dimitropoulos log_must zfs destroy -fR $TESTPOOL/$dsB01 78*5ac95da7SSerapheim Dimitropoulos log_must zfs destroy -fR $TESTPOOL/$dsC01 79*5ac95da7SSerapheim Dimitropoulos 80*5ac95da7SSerapheim Dimitropoulos # If the test fails after increasing the limit and 81*5ac95da7SSerapheim Dimitropoulos # before resetting it, it will be left at the modified 82*5ac95da7SSerapheim Dimitropoulos # value for the remaining tests. That's the reason 83*5ac95da7SSerapheim Dimitropoulos # we reset it again here just in case. 84*5ac95da7SSerapheim Dimitropoulos mdb_set_uint32 zfs_max_dataset_nesting 50 85*5ac95da7SSerapheim Dimitropoulos} 86*5ac95da7SSerapheim Dimitropoulos 87*5ac95da7SSerapheim Dimitropouloslog_onexit nesting_cleanup 88*5ac95da7SSerapheim Dimitropoulos 89*5ac95da7SSerapheim Dimitropouloslog_must zfs create -p $TESTPOOL/$dsA49 90*5ac95da7SSerapheim Dimitropouloslog_must zfs create -p $TESTPOOL/$dsB49 91*5ac95da7SSerapheim Dimitropouloslog_must zfs create -p $TESTPOOL/$dsC16 92*5ac95da7SSerapheim Dimitropoulos 93*5ac95da7SSerapheim Dimitropouloslog_mustnot zfs rename $TESTPOOL/$dsA02 $TESTPOOL/$dsB15A 94*5ac95da7SSerapheim Dimitropoulos 95*5ac95da7SSerapheim Dimitropoulos# extend limit 96*5ac95da7SSerapheim Dimitropoulosmdb_set_uint32 zfs_max_dataset_nesting 64 97*5ac95da7SSerapheim Dimitropoulos 98*5ac95da7SSerapheim Dimitropouloslog_mustnot zfs rename $TESTPOOL/$dsA02 $TESTPOOL/$dsB16A 99*5ac95da7SSerapheim Dimitropouloslog_must zfs rename $TESTPOOL/$dsA02 $TESTPOOL/$dsB15A 100*5ac95da7SSerapheim Dimitropoulos 101*5ac95da7SSerapheim Dimitropoulos# bring back old limit 102*5ac95da7SSerapheim Dimitropoulosmdb_set_uint32 zfs_max_dataset_nesting 50 103*5ac95da7SSerapheim Dimitropoulos 104*5ac95da7SSerapheim Dimitropouloslog_mustnot zfs rename $TESTPOOL/$dsC01 $TESTPOOL/$dsB15A47C 105*5ac95da7SSerapheim Dimitropouloslog_must zfs rename $TESTPOOL/$dsB15A47A $TESTPOOL/$dsB15A47B 106*5ac95da7SSerapheim Dimitropouloslog_must zfs rename $TESTPOOL/$dsB15A47B $TESTPOOL/$dsB15A40B 107*5ac95da7SSerapheim Dimitropoulos 108*5ac95da7SSerapheim Dimitropouloslog_pass "Verify 'zfs rename' limits datasets so they don't pass " \ 109*5ac95da7SSerapheim Dimitropoulos "the nesting limit. For existing ones that do, it should " \ 110*5ac95da7SSerapheim Dimitropoulos "not allow them to grow anymore." 111