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.
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.
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]
24 # Copyright 2009 Sun Microsystems, Inc. All rights reserved.
25 # Use is subject to license terms.
29 # Copyright (c) 2013, 2016 by Delphix. All rights reserved.
32 .
$STF_SUITE/include
/libtest.shlib
33 .
$STF_SUITE/tests
/functional
/reservation
/reservation.shlib
38 # Setting a reservation reserves a defined minimum amount of space for
39 # a dataset, and prevents other datasets using that space. Verify that
40 # reducing the reservation on a filesystem allows other datasets in
41 # the pool to use that space.
44 # 1) Create multiple filesystems
45 # 2) Set reservations on all bar one of the filesystems
46 # 3) Fill up the one non-reserved filesystem
47 # 4) Reduce one of the reservations and verify can write more
48 # data into the non-reserved filesystem
51 verify_runnable
"both"
53 log_assert
"Verify reducing reservation allows other datasets to use space"
58 while (($loop < $RESV_NUM_FS)); do
59 datasetexists
$TESTPOOL/${TESTFS}$loop && \
60 log_must zfs destroy
-f $TESTPOOL/${TESTFS}$loop
62 [[ -d ${TESTDIR}$loop ]] && log_must
rm -r ${TESTDIR}$loop
70 log_must create_multiple_fs
$RESV_NUM_FS $TESTPOOL/$TESTFS $TESTDIR
72 space_avail
=`get_prop available $TESTPOOL`
73 space_used
=`get_prop used $TESTPOOL`
76 # To make sure this test doesn't take too long to execute on
77 # large pools, we calculate a reservation setting which when
78 # applied to all bar one of the filesystems (RESV_NUM_FS-1) will
79 # ensure we have RESV_FREE_SPACE left free in the pool, which we will
80 # be able to quickly fill.
82 resv_space_avail
=`expr $space_avail - $RESV_FREE_SPACE`
83 num_resv_fs
=`expr $RESV_NUM_FS - 1` # Number of FS to which resv will be applied
84 resv_size_set
=`expr $resv_space_avail / $num_resv_fs`
87 # We set the reservations now, rather than when we created the filesystems
88 # to allow us to take into account space used by the filsystem metadata
90 # Note we don't set a reservation on the first filesystem we created,
91 # hence num=1 rather than zero below.
94 while (($num < $RESV_NUM_FS)); do
95 log_must zfs
set reservation
=$resv_size_set $TESTPOOL/$TESTFS$num
99 space_avail_still
=`get_prop available $TESTPOOL`
101 fill_size
=`expr $space_avail_still + $RESV_TOLERANCE`
102 write_count
=`expr $fill_size / $BLOCK_SIZE`
104 # Now fill up the first filesystem (which doesn't have a reservation set
105 # and thus will use up whatever free space is left in the pool).
107 log_note
"Writing to $TESTDIR$num/$TESTFILE1"
109 file_write
-o create
-f $TESTDIR$num/$TESTFILE1 -b $BLOCK_SIZE \
112 if (($ret != $ENOSPC)); then
113 log_fail
"Did not get ENOSPC as expected (got $ret)."
116 # Remove the reservation on one of the other filesystems and verify
117 # can write more data to the original non-reservation filesystem.
119 log_must zfs
set reservation
=none
$TESTPOOL/${TESTFS}$num
121 log_must file_write
-o create
-f ${TESTDIR}$num/$TESTFILE2 -b pagesize \
124 log_pass
"reducing reservation allows other datasets to use space"