Index: projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh =================================================================== --- projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh (revision 323249) +++ projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh (revision 323250) @@ -1,104 +1,125 @@ #!/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 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)refreserv_002_pos.ksh 1.3 09/05/19 SMI" # . $STF_SUITE/include/libtest.kshlib ################################################################################# # # __stc_assertion_start # # ID: refreserv_002_pos # # DESCRIPTION: # Setting full size as refreservation, verify no snapshot can be created. # # STRATEGY: # 1. Setting full size as refreservation on pool # 2. Verify no snapshot can be created on this pool # 3. Setting full size as refreservation on filesystem # 4. Verify no snapshot can be created on it and its subfs # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2007-11-05) # # __stc_assertion_end # ################################################################################ verify_runnable "both" function cleanup { if is_global_zone ; then log_must $ZFS set refreservation=none $TESTPOOL if datasetexists $TESTPOOL@snap ; then log_must $ZFS destroy -f $TESTPOOL@snap fi fi log_must $ZFS destroy -rf $TESTPOOL/$TESTFS log_must $ZFS create $TESTPOOL/$TESTFS log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS } +# This function iteratively increases refreserv to its highest possible +# value. Simply setting refreserv == quota can allow enough writes to +# complete that the test fails. +function max_refreserv +{ + typeset ds=$1 + typeset -i incsize=131072 + typeset -i rr=$(get_prop available $ds) + + log_must $ZFS set refreserv=$rr $ds + while :; do + $ZFS set refreserv=$((rr + incsize)) $ds >/dev/null 2>&1 + if [[ $? == 0 ]]; then + ((rr += incsize)) + continue + else + ((incsize /= 2)) + ((incsize == 0)) && break + fi + done +} + + log_assert "Setting full size as refreservation, verify no snapshot " \ "can be created." log_onexit cleanup log_must $ZFS create $TESTPOOL/$TESTFS/subfs typeset datasets if is_global_zone; then datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS/subfs" else datasets="$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS/subfs" fi for ds in $datasets; do # # Verify refreservation on dataset # log_must $ZFS set quota=25M $ds - log_must $ZFS set refreservation=25M $ds - mntpnt=$(get_prop mountpoint $ds) - log_must $TOUCH $mntpnt/$TESTFILE + max_refreserv $ds log_mustnot $ZFS snapshot $ds@snap if datasetexists $ds@snap ; then log_fail "ERROR: $ds@snap should not exists." fi log_must $ZFS set quota=none $ds log_must $ZFS set refreservation=none $ds done log_pass "Setting full size as refreservation, verify no snapshot " \ "can be created." Index: projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh =================================================================== --- projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh (revision 323249) +++ projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh (revision 323250) @@ -1,101 +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 # # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)refreserv_004_pos.ksh 1.3 09/05/19 SMI" # . $STF_SUITE/include/libtest.kshlib ################################################################################# # # __stc_assertion_start # # ID: refreserv_004_pos # # DESCRIPTION: # Verify refreservation is limited by available space. # # STRATEGY: # 1. Setting quota and refreservation on parent filesystem. # 2. Get available space on sub-filesystem. # 3. Verify refreservation is limited by available on it. # # TESTABILITY: explicit # # TEST_AUTOMATION_LEVEL: automated # # CODING_STATUS: COMPLETED (2007-11-05) # # __stc_assertion_end # ################################################################################ verify_runnable "both" function cleanup { if is_global_zone ; then log_must $ZFS set refreservation=none $TESTPOOL fi log_must $ZFS destroy -rf $TESTPOOL/$TESTFS log_must $ZFS create $TESTPOOL/$TESTFS log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS } log_assert "Verify refreservation is limited by available space." log_onexit cleanup pool=$TESTPOOL ; fs=$pool/$TESTFS ; subfs=$fs/subfs log_must $ZFS create $subfs typeset datasets if is_global_zone; then datasets="$pool $fs" else datasets="$fs" fi for ds in $datasets; do log_must $ZFS set quota=25M $ds log_must $ZFS set refreservation=15M $ds - typeset -i avail - avail=$(get_prop avail $subfs) + typeset avail + avail=5M log_must $ZFS set refreservation=$avail $subfs typeset mntpnt mntpnt=$(get_prop mountpoint $subfs) log_must $MKFILE $avail $mntpnt/$TESTFILE - typeset -i exceed - ((exceed = avail + 1)) + typeset exceed + exceed=15M log_mustnot $ZFS set refreservation=$exceed $subfs - log_mustnot $MKFILE $avail $mntpnt/$TESTFILE + log_mustnot $MKFILE $exceed $mntpnt/$TESTFILE log_must $ZFS set quota=none $ds - log_must $ZFS set reservation=15M $ds done log_pass "Verify refreservation is limited by available space." Index: projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh =================================================================== --- projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh (revision 323249) +++ projects/zfsd/head/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh (revision 323250) @@ -1,152 +1,150 @@ # 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 2012 Spectra Logic. All rights reserved. # Use is subject to license terms. # atf_test_case refreserv_001_pos cleanup refreserv_001_pos_head() { atf_set "descr" "Reservations are enforced using the maximum of'reserv' and 'refreserv'" atf_set "require.progs" zfs } refreserv_001_pos_body() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" ksh93 $(atf_get_srcdir)/refreserv_001_pos.ksh || atf_fail "Testcase failed" } refreserv_001_pos_cleanup() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" } atf_test_case refreserv_002_pos cleanup refreserv_002_pos_head() { atf_set "descr" "Setting full size as refreservation, verify no snapshotcan be created." atf_set "require.progs" zfs } refreserv_002_pos_body() { - atf_expect_fail "BUG25520 this test incorrectly assumes that the avail, reserv, and refreserv properties are exact values that apply to data but not metadata" . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" ksh93 $(atf_get_srcdir)/refreserv_002_pos.ksh || atf_fail "Testcase failed" } refreserv_002_pos_cleanup() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" } atf_test_case refreserv_003_pos cleanup refreserv_003_pos_head() { atf_set "descr" "Verify a snapshot will only be allowed if there is enoughfree space outside of this refreservation." atf_set "require.progs" zfs } refreserv_003_pos_body() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" ksh93 $(atf_get_srcdir)/refreserv_003_pos.ksh || atf_fail "Testcase failed" } refreserv_003_pos_cleanup() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" } atf_test_case refreserv_004_pos cleanup refreserv_004_pos_head() { atf_set "descr" "Verify refreservation is limited by available space." atf_set "require.progs" zfs } refreserv_004_pos_body() { - atf_expect_fail "BUG25520 this test incorrectly assumes that the avail, reserv, and refreserv properties are exact values that apply to data but not metadata" . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" ksh93 $(atf_get_srcdir)/refreserv_004_pos.ksh || atf_fail "Testcase failed" } refreserv_004_pos_cleanup() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" } atf_test_case refreserv_005_pos cleanup refreserv_005_pos_head() { atf_set "descr" "Volume refreservation is limited by volsize" atf_set "require.progs" zfs } refreserv_005_pos_body() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" ksh93 $(atf_get_srcdir)/refreserv_005_pos.ksh || atf_fail "Testcase failed" } refreserv_005_pos_cleanup() { . $(atf_get_srcdir)/../../include/default.cfg . $(atf_get_srcdir)/refreserv.cfg ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" } atf_init_test_cases() { atf_add_test_case refreserv_001_pos atf_add_test_case refreserv_002_pos atf_add_test_case refreserv_003_pos atf_add_test_case refreserv_004_pos atf_add_test_case refreserv_005_pos }