f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#!/bin/ksh -p
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER START
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# The contents of this file are subject to the terms of the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Common Development and Distribution License (the "License").
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You may not use this file except in compliance with the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# or http://www.opensolaris.org/os/licensing.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# See the License for the specific language governing permissions
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# and limitations under the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER END
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Use is subject to license terms.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/include/libtest.shlib
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# DESCRIPTION:
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# With 'compression' set, a file with non-power-of-2 blocksize storage space
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# can be freed as will normally.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# STRATEGY:
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# 1. Set 'compression' or 'compress' to on or lzjb
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# 2. Set different recordsize with ZFS filesystem
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# 3. Repeatedly using 'randfree_file' to create a file and then free its
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# storage space with different range, the system should work normally.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyverify_runnable "both"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cleanup
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -f $TESTDIR/*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction create_free_testing #<file size> <file>
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i fsz=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset file=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i start=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i len=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i dist=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for start in 0 `expr $RANDOM % $fsz`
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( dist = fsz - start ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for len in `expr $RANDOM % $dist` $dist \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy `expr $start + $dist`; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must randfree_file -l fsz -s $start \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy -n $len $file
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy [[ -e $file ]] && \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must rm -f $file
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedylog_assert "Creating non-power-of-2 blocksize file and freeing the file \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy storage space at will should work normally with compression setting"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedylog_onexit cleanup
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfs=$TESTPOOL/$TESTFS
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedysingle_blk_file=$TESTDIR/singleblkfile.$$
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedymulti_blk_file=$TESTDIR/multiblkfile.$$
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedytypeset -i blksize=512
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedytypeset -i fsize=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedytypeset -i avail=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedytypeset -i blknum=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfor propname in "compression" "compress"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedydo
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for value in $(get_compress_opts zfs_compress)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs set compression=$value $fs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy real_val=$(get_prop $propname $fs)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ $value == "gzip-6" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy value="gzip"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy [[ $real_val != $value ]] && \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "Set property $propname=$value failed."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blksize = 512 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while (( blksize <= 131072 )); do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs set recordsize=$blksize $fs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # doing single block testing
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( fsize = $RANDOM ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (( fsize > blksize )); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( fsize = fsize % blksize ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (( (fsize % 2) == 0 )); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #make sure fsize is non-power-of-2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( fsize = fsize + 1 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy create_free_testing $fsize $single_blk_file
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # doing multiple blocks testing
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy avail=$(get_prop available $fs)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blknum = avail / blksize ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # we just test <10 multi-blocks to limit testing time
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blknum = blknum % 9 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while (( blknum < 2 )); do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blknum = blknum + $RANDOM % 9 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (( (blknum % 2) == 0 )); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blknum = blknum + 1 )) # keep blknum as odd
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( fsize = blknum * blksize ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy create_free_testing $fsize $multi_blk_file
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( blksize = blksize * 2 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedydone
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedylog_pass "Creating and freeing non-power-of-2 blocksize file work as expected."