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