common/attr: Reduce MAX_ATTRS to leave some overhead for 64K blocksize
[xfstests-dev.git] / common / attr
index 894fe07ae945bdf26e0c76e3681a8ec28dad6594..35682d7c56cdf7af91b488fcf60853ee93d4e0de 100644 (file)
@@ -33,6 +33,9 @@ _acl_get_max()
                        echo 506
                fi
                ;;
+       bcachefs)
+               echo 251
+               ;;
        *)
                echo 0
                ;;
@@ -56,10 +59,10 @@ _acl_setup_ids()
         j=1
         for(i=1; i<1000000 && j<=3;i++){
           if (! (i in ids)) {
-            printf "acl%d=%d;", j, i;           
+            printf "acl%d=%d;", j, i;
             j++
           }
-        }      
+        }
       }'`
 }
 
@@ -98,7 +101,7 @@ _getfacl_filter_id()
 _acl_ls()
 {
     _ls_l -n $* | awk '{ print $1, $3, $4, $NF }' | _acl_filter_id
-} 
+}
 
 # create an ACL with n ACEs in it
 #
@@ -125,7 +128,7 @@ _filter_aces()
        BEGIN {
            FS=":"
            while ( getline <tmpfile > 0 ) {
-               idlist[$1] = $3 
+               idlist[$1] = $3
            }
        }
        /^user/ { if ($2 in idlist) sub($2, idlist[$2]); print; next}
@@ -177,17 +180,17 @@ _require_attrs()
 {
        local args
        local nsp
-       
+
        if [ $# -eq 0 ]; then
                args="user"
        else
                args="$*"
        fi
-       
+
        [ -n "$ATTR_PROG" ] || _notrun "attr command not found"
        [ -n "$GETFATTR_PROG" ] || _notrun "getfattr command not found"
        [ -n "$SETFATTR_PROG" ] || _notrun "setfattr command not found"
-       
+
        for nsp in $args; do
                #
                # Test if chacl is able to write an attribute on the target
@@ -201,14 +204,14 @@ _require_attrs()
                touch $TEST_DIR/syscalltest
                $SETFATTR_PROG -n "$nsp.xfstests" -v "attr" $TEST_DIR/syscalltest > $TEST_DIR/syscalltest.out 2>&1
                cat $TEST_DIR/syscalltest.out >> $seqres.full
-               
+
                if grep -q 'Function not implemented' $TEST_DIR/syscalltest.out; then
                        _notrun "kernel does not support attrs"
                fi
                if grep -q 'Operation not supported' $TEST_DIR/syscalltest.out; then
                        _notrun "attr namespace $nsp not supported by this filesystem type: $FSTYP"
                fi
-               
+
                rm -f $TEST_DIR/syscalltest.out
        done
 }
@@ -250,9 +253,48 @@ _getfattr()
 
 # set maximum total attr space based on fs type
 case "$FSTYP" in
-xfs|udf|pvfs2|9p|ceph)
+xfs|udf|pvfs2|9p|ceph|nfs)
        MAX_ATTRS=1000
        ;;
+ext2|ext3|ext4)
+       # For 4k blocksizes, most of the attributes have an attr_name of
+       # "attribute_NN" which is 12, and "value_NN" which is 8.
+       # But for larger block sizes, we start having extended attributes of the
+       # form "attribute_NNN" or "attribute_NNNN", and "value_NNN" and
+       # "value_NNNN", which causes the round(len(..), 4) to jump up by 4
+       # bytes.  So round_up(len(attr_name, 4)) becomes 16 instead of 12, and
+       # round_up(len(value, 4)) becomes 12 instead of 8.
+       #
+       # For 64K blocksize the calculation becomes
+       #       max_attrs = (block_size - 32) / (16 + 12 + 16)
+       # or
+       #       max_attrs = (block_size - 32) / 44
+       #
+       # For 4K blocksize:-
+       #       max_attrs = (block_size - 32) / (16 + 8 + 12)
+       # or
+       #       max_attrs = (block_size - 32) / 36
+       #
+       # Note (for 4K bs) above are exact calculations for attrs of type
+       # attribute_NN with values of type value_NN.
+       # With above calculations, for 4k blocksize max_attrs becomes 112.
+       # This means we can have few attrs of type attribute_NNN with values of
+       # type value_NNN. To avoid/handle this we need to add extra 4 bytes of
+       # headroom.
+       #
+       # So for 4K, the calculations becomes:-
+       #       max_attrs = (block_size - 32) / (16 + 8 + 12 + 4)
+       # or
+       #       max_attrs = (block_size - 32) / 40
+       #
+       # Assume max ~1 block of attrs
+       BLOCK_SIZE=`_get_block_size $TEST_DIR`
+       if [ $BLOCK_SIZE -le 4096 ]; then
+               let MAX_ATTRS=$((($BLOCK_SIZE - 32) / (16 + 8 + 12 + 4)))
+       else
+               let MAX_ATTRS=$((($BLOCK_SIZE - 32) / (16 + 12 + 16 )))
+       fi
+       ;;
 *)
        # Assume max ~1 block of attrs
        BLOCK_SIZE=`_get_block_size $TEST_DIR`
@@ -270,9 +312,12 @@ xfs|udf|btrfs)
 pvfs2)
        MAX_ATTRVAL_SIZE=8192
        ;;
-9p|ceph)
+9p|ceph|nfs)
        MAX_ATTRVAL_SIZE=65536
        ;;
+bcachefs)
+       MAX_ATTRVAL_SIZE=1024
+       ;;
 *)
        # Assume max ~1 block of attrs
        BLOCK_SIZE=`_get_block_size $TEST_DIR`