#-----------------------------------------------------------------------
 # common extended attribute and ACL support
 
+# filesystems that want to test maximum supported acl counts need to
+# add support in here
+_acl_get_max()
+{
+       case $FSTYP in
+       xfs)
+               # CRC format filesystems have much larger ACL counts. The actual
+               # number is into the thousands, but testing that meany takes too
+               # long, so just test well past the old limit of 25.
+               xfs_info $TEST_DIR | _filter_mkfs > /dev/null 2> $tmp.info
+               . $tmp.info
+               rm $tmp.info
+               if [ $_fs_has_crcs -eq 0 ]; then
+                       echo 25
+               else
+                       echo 5461
+               fi
+               ;;
+       *)
+               echo 0
+               ;;
+       esac
+}
+
+_require_acl_get_max()
+{
+       if [ $(_acl_get_max) -eq 0 ]; then
+               _notrun "$FSTYP does not define maximum ACL count"
+       fi
+}
+
 # pick three unused user/group ids, store them as $acl[1-3]
 #
 _acl_setup_ids()
 
--- /dev/null
+#! /bin/bash
+# FS QA Test No. generic/026
+#
+# Test out ACL count limits
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+# Copyright (c) 2014 Red hat, Inc.  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
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+runas=$here/src/runas
+status=1       # FAILure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/attr
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+    [ -n "$TEST_DIR" ] && rm -rf $TEST_DIR/$seq.dir1
+}
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+_need_to_be_root
+_acl_setup_ids
+_require_acls
+_require_acl_get_max
+
+[ -x $runas ] || _notrun "$runas executable not found"
+
+rm -f $seqres.full
+
+# get dir
+cd $TEST_DIR
+rm -rf $seq.dir1
+mkdir $seq.dir1
+cd $seq.dir1
+
+# we return E2BIG if hit the max acl limits on new kernel, but EINVAL
+# on old kernel. So we need to filter out the error message in order
+# to make the updated golden output works for both old and new kernels.
+_filter_largeacl()
+{
+       sed -e "s/Invalid argument/Argument list too long/"
+}
+
+# filter all the non-ace stuff from the acl output so the count is
+# correct. Note that this assumes that _create_n_aces always creates rwx acls.
+_filter_acls()
+{
+       _filter_aces | grep ':rwx'
+}
+
+# store the output in seqres.full, then run again an count and filter the
+# output.
+check_acls()
+{
+       _acl=$1
+       _count=$2
+
+       chacl $_acl largeaclfile 2>&1 | _filter_largeacl
+       getfacl --numeric largeaclfile | _filter_aces \
+               >> $seqres.full 2> /dev/null
+       nacls=`getfacl --numeric largeaclfile | _filter_acls | wc -l`
+       if [ $nacls -ne $_count ]; then
+               echo Wrong ACL count - $nacls != $_count
+       fi
+}
+
+
+echo ""
+echo "=== Test out large ACLs  ==="
+touch largeaclfile
+
+ACL_MAX_ENTRIES=$(_acl_get_max)
+num_aces_pre=$((ACL_MAX_ENTRIES - 1))
+num_aces_post=$((ACL_MAX_ENTRIES + 1))
+
+acl1=`_create_n_aces $num_aces_pre`
+acl2=`_create_n_aces $ACL_MAX_ENTRIES`
+acl3=`_create_n_aces $num_aces_post`
+acl4=`_create_n_aces 16` # Andreas G. libacl size for initial get
+acl5=`_create_n_aces 17` # 1 over A.G. libacl initial size
+
+echo "1 below acl max"
+check_acls $acl1 $num_aces_pre
+
+echo "acl max"
+check_acls $acl2 $ACL_MAX_ENTRIES
+
+# we expect the ACL change to fail, so the old ACLs should remain on the
+# file. Hence the expected ACL count is XFS_ACL_MAX_ENTRIES, not num_aces_post.
+echo "1 above acl max"
+check_acls $acl3 $ACL_MAX_ENTRIES
+
+echo "use 16 aces"
+check_acls $acl4 16
+
+echo "use 17 aces"
+check_acls $acl5 17
+
+# success, all done
+status=0
+exit