new file mode 100755
@@ -0,0 +1,178 @@
+#! /bin/bash
+# FS QA Test
+#
+# Test for mount option max_dir_size_kb
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2014 Oracle and/or its affiliates. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#-----------------------------------------------------------------------
+#
+
+seq=$(basename $0)
+seqres=$RESULT_DIR/$seq
+tmp=/tmp/$$
+
+testdir=$SCRATCH_MNT/dir.$seq
+testfile=$SCRATCH_MNT/testfile
+
+echo "QA output created by $seq"
+echo "Silence is golden"
+rm -f $seqres.full
+
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -rf $tmp.*
+}
+
+remove_files()
+{
+ dirs="$testdir $*"
+ for i in $dirs; do
+ rm -fr $i/*
+ done
+}
+
+# $1 - expected limit after items creation
+# $2 - command to create item
+# $3 - where to create (testdir by default)
+_create_items()
+{
+ limit=$1
+ dir=${2:-$testdir}
+ MKTEMP_OPT=""
+ [ "$3" = "mkdir" ] && MKTEMP_OPT="-d"
+ sync
+ echo 3 > /proc/sys/vm/drop_caches
+ MAX_INUM=$((limit * 1024 * 2 / 24))
+ for i in $(seq 0 $MAX_INUM); do
+ error=$(mktemp $MKTEMP_OPT --tmpdir=$dir 2>&1 >/dev/null)
+ res=$?
+ if [ $res -ne 0 ]; then
+ echo $error >> $seqres.full
+ [[ ! $error =~ ^.*'No space left on device'$ ]] && echo
"FAIL! expected ENOSPC" | tee -a $seqres.full
+ break
+ fi
+ done
+ size=$(stat -c %s $dir)
+ size=$((size / 1024))
+ if [ $size -gt $limit ]; then
+ echo "FAIL! expected dir size: $limit, actually: $size" | tee -a
$seqres.full
+ fi
+}
+
+run_test()
+{
+ LIMIT1=$1
+ LIMIT2=$2
+ MKFS_OPT=$3
+
+ _scratch_unmount >/dev/null 2>&1
+ _scratch_mkfs $MKFS_OPT >>$seqres.full 2>&1
+ _scratch_mount -o max_dir_size_kb=$LIMIT1
+ mkdir $testdir
+
+ echo -e "\nExceed $LIMIT1 Kb limit with new files in testdir/: " >>
$seqres.full
+ _create_items $LIMIT1
+
+ echo -e "\nRemount with $LIMIT1 Kb limit,\nnew item in testdir/
should result to ENOSPC: " >>$seqres.full
+ _scratch_mount "-o remount,max_dir_size_kb=$LIMIT1"
+ _create_items $LIMIT1
+
+ echo -e "\nExceed $LIMIT2 Kb limit with new files in testdir/: " >>
$seqres.full
+ _scratch_mount "-o remount,max_dir_size_kb=$LIMIT2"
+ _create_items $LIMIT2
+
+ echo -e "\nExceed $LIMIT2 Kb limit with new files in testdir2/: " >>
$seqres.full
+ mkdir $SCRATCH_MNT/testdir2 2>/dev/null
+ _create_items $LIMIT2 "$SCRATCH_MNT/testdir2"
+
+ echo -e "\nRemount with $LIMIT1 Kb limit,\nnew item in testdir/
should result to ENOSPC: " >> $seqres.full
+ _scratch_mount "-o remount,max_dir_size_kb=$LIMIT1"
+ _create_items $LIMIT2
+ echo -e "\nnew item in testdir2/ should result to ENOSPC: " >>
$seqres.full
+ _create_items $LIMIT2 "$SCRATCH_MNT/testdir2"
+ remove_files "$SCRATCH_MNT/testdir2"
+ rmdir $testdir
+ mkdir $testdir
+ dd if=/dev/urandom of=$testfile bs=1 seek=4096 count=4096 >
/dev/null 2>&1
+
+ echo -e "\nExceed $LIMIT1 Kb directory limit with new
subdirectories: " >> $seqres.full
+ _create_items $LIMIT1 $testdir "mkdir"
+ remove_files
+
+ echo -e "\nCreate ext4 fs on testdir/subdir with $LIMIT2 Kb limit,"
>> $seqres.full
+ mkdir $testdir/subdir 2>/dev/null
+ umount $TEST_DEV 1>/dev/null 2>&1
+ _mkfs_dev $TEST_DEV $MKFS_OPT >>$seqres.full 2>&1
+ _mount -o max_dir_size_kb=$LIMIT2 $TEST_DEV $testdir/subdir
+
+ echo "exceed $LIMIT1 Kb limit of testdir/:" >> $seqres.full
+ _create_items $LIMIT1
+
+ echo -e "\nexceed $LIMIT2 Kb limit of testdir/subdir:" >> $seqres.full
+ _create_items $LIMIT2 "$testdir/subdir"
+
+ echo -e "\ntestdir/ limit $LIMIT2 Kb, testdir/subdir limit $LIMIT1
Kb," >> $seqres.full
+ umount $TEST_DEV 1>/dev/null 2>&1
+ _scratch_mount "-o remount,max_dir_size_kb=$LIMIT2"
+ _mount -o max_dir_size_kb=$LIMIT1 $TEST_DEV $testdir/subdir
+
+ echo "exceed new $LIMIT2 Kb limit of testdir/ with a set of files:"
>> $seqres.full
+ _create_items $LIMIT2
+ echo -e "\nnew item in testdir/subdir should result to ENOSPC: " >>
$seqres.full
+ _create_items $LIMIT2 "$testdir/subdir"
+
+ umount $TEST_DEV 1>/dev/null 2>&1
+ remove_files
+
+ echo -e "\nTestdir/ limit $LIMIT2 Kb, loop fs: testdir/subdir limit
$LIMIT1 Kb," >> $seqres.full
+ mkdir $testdir/subdir
+
+ $MKFS_EXT4_PROG -F $MKFS_OPT $testfile 2m >> $seqres.full 2>&1
+ _mount -o loop,max_dir_size_kb=$LIMIT1 $testfile $testdir/subdir
+
+ echo "exceed $LIMIT1 Kb limit of testdir/subdir with a set of
files:" >> $seqres.full
+ _create_items $LIMIT1 "$testdir/subdir"
+
+ echo -e "\nexceed $LIMIT2 Kb limit of testdir/ with a set of files:"
>> $seqres.full
+ _create_items $LIMIT2
+
+ umount -d $testdir/subdir
+ remove_files
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+
+# real QA test starts here
+
+_supported_fs ext4
+_supported_os Linux
+_require_scratch
+_require_loop
+
+run_test 8 16
+run_test 4 32 "-O ^dir_index"
+run_test 5 11 "-b 1024"
+
+# success, all done
+status=0
+exit 0
+
new file mode 100755
@@ -0,0 +1,2 @@
+QA output created by 309
+Silence is golden
@@ -16,3 +16,4 @@
306 auto rw resize quick
307 auto ioctl rw
308 auto ioctl rw prealloc quick
+309 auto