1eda14cbcSMatt Macy#!/bin/ksh -p 2eda14cbcSMatt Macy# 3eda14cbcSMatt Macy# CDDL HEADER START 4eda14cbcSMatt Macy# 5eda14cbcSMatt Macy# The contents of this file are subject to the terms of the 6eda14cbcSMatt Macy# Common Development and Distribution License (the "License"). 7eda14cbcSMatt Macy# You may not use this file except in compliance with the License. 8eda14cbcSMatt Macy# 9eda14cbcSMatt Macy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*271171e0SMartin Matuska# or https://opensource.org/licenses/CDDL-1.0. 11eda14cbcSMatt Macy# See the License for the specific language governing permissions 12eda14cbcSMatt Macy# and limitations under the License. 13eda14cbcSMatt Macy# 14eda14cbcSMatt Macy# When distributing Covered Code, include this CDDL HEADER in each 15eda14cbcSMatt Macy# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16eda14cbcSMatt Macy# If applicable, add the following below this CDDL HEADER, with the 17eda14cbcSMatt Macy# fields enclosed by brackets "[]" replaced with your own identifying 18eda14cbcSMatt Macy# information: Portions Copyright [yyyy] [name of copyright owner] 19eda14cbcSMatt Macy# 20eda14cbcSMatt Macy# CDDL HEADER END 21eda14cbcSMatt Macy# 22eda14cbcSMatt Macy 23eda14cbcSMatt Macy# 24eda14cbcSMatt Macy# Copyright 2007 Sun Microsystems, Inc. All rights reserved. 25eda14cbcSMatt Macy# Use is subject to license terms. 26eda14cbcSMatt Macy# 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy# 29eda14cbcSMatt Macy# Copyright (c) 2013, 2016 by Delphix. All rights reserved. 30eda14cbcSMatt Macy# 31eda14cbcSMatt Macy 32eda14cbcSMatt Macy. $STF_SUITE/include/libtest.shlib 33eda14cbcSMatt Macy. $STF_SUITE/tests/functional/reservation/reservation.shlib 34eda14cbcSMatt Macy 35eda14cbcSMatt Macy# 36eda14cbcSMatt Macy# DESCRIPTION: 37eda14cbcSMatt Macy# 38eda14cbcSMatt Macy# In pool with a full filesystem and a filesystem with a reservation 39eda14cbcSMatt Macy# destroying another filesystem should allow more data to be written to 40eda14cbcSMatt Macy# the full filesystem 41eda14cbcSMatt Macy# 42eda14cbcSMatt Macy# 43eda14cbcSMatt Macy# STRATEGY: 44eda14cbcSMatt Macy# 1) Create a filesystem as dataset 45eda14cbcSMatt Macy# 2) Create a filesystem at the same level 46eda14cbcSMatt Macy# 3) Set a reservation on the dataset filesystem 47eda14cbcSMatt Macy# 4) Fill up the second filesystem 48eda14cbcSMatt Macy# 5) Destroy the dataset filesystem 49eda14cbcSMatt Macy# 6) Verify can write more data to the full filesystem 50eda14cbcSMatt Macy# 51eda14cbcSMatt Macy 52eda14cbcSMatt Macyverify_runnable "both" 53eda14cbcSMatt Macy 54eda14cbcSMatt Macylog_assert "Destroying top level filesystem with reservation allows more " \ 55eda14cbcSMatt Macy "data to be written to another top level filesystem" 56eda14cbcSMatt Macy 57eda14cbcSMatt Macyfunction cleanup 58eda14cbcSMatt Macy{ 59eda14cbcSMatt Macy datasetexists $TESTPOOL/$TESTFS1 && \ 6081b22a98SMartin Matuska destroy_dataset $TESTPOOL/$TESTFS1 61eda14cbcSMatt Macy 62eda14cbcSMatt Macy [[ -e $TESTDIR/$TESTFILE1 ]] && log_must rm -rf $TESTDIR/$TESTFILE1 63eda14cbcSMatt Macy [[ -e $TESTDIR/$TESTFILE2 ]] && log_must rm -rf $TESTDIR/$TESTFILE2 64eda14cbcSMatt Macy} 65eda14cbcSMatt Macy 66eda14cbcSMatt Macylog_onexit cleanup 67eda14cbcSMatt Macy 68eda14cbcSMatt Macylog_must zfs create $TESTPOOL/$TESTFS1 69eda14cbcSMatt Macy 70eda14cbcSMatt Macyspace_avail=`get_prop available $TESTPOOL` 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy# 73eda14cbcSMatt Macy# To make sure this test doesn't take too long to execute on 74eda14cbcSMatt Macy# large pools, we calculate a reservation setting which when 75eda14cbcSMatt Macy# applied to the dataset filesystem will ensure we have 76eda14cbcSMatt Macy# RESV_FREE_SPACE left free in the pool. 77eda14cbcSMatt Macy# 78eda14cbcSMatt Macy((resv_size_set = space_avail - RESV_FREE_SPACE)) 79eda14cbcSMatt Macy 80eda14cbcSMatt Macylog_must zfs set reservation=$resv_size_set $TESTPOOL/$TESTFS1 81eda14cbcSMatt Macy 82eda14cbcSMatt Macyspace_avail_still=`get_prop available $TESTPOOL` 83eda14cbcSMatt Macy 84eda14cbcSMatt Macyfill_size=`expr $space_avail_still + $RESV_TOLERANCE` 85eda14cbcSMatt Macywrite_count=`expr $fill_size / $BLOCK_SIZE` 86eda14cbcSMatt Macy 87eda14cbcSMatt Macy# Now fill up the filesystem (which doesn't have a reservation set 88eda14cbcSMatt Macy# and thus will use up whatever free space is left in the pool). 89eda14cbcSMatt Macyfile_write -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE -c $write_count -d 0 90eda14cbcSMatt Macyret=$? 91eda14cbcSMatt Macyif (($ret != $ENOSPC)); then 92eda14cbcSMatt Macy log_fail "Did not get ENOSPC as expected (got $ret)." 93eda14cbcSMatt Macyfi 94eda14cbcSMatt Macy 95eda14cbcSMatt Macylog_must zfs destroy -f $TESTPOOL/$TESTFS1 96eda14cbcSMatt Macy 97eda14cbcSMatt Macylog_must file_write -o create -f $TESTDIR/$TESTFILE2 \ 98eda14cbcSMatt Macy -b $(getconf PAGESIZE) -c 1000 -d 0 99eda14cbcSMatt Macy 100eda14cbcSMatt Macylog_pass "Destroying top level filesystem with reservation allows more data " \ 101eda14cbcSMatt Macy "to be written to another top level filesystem" 102