diff mbox series

[v3,3/4] generic/020: fix max_attrval_size for XFS, UDF, Btrfs and NFS

Message ID 20220413164422.30077-4-ddiss@suse.de (mailing list archive)
State New, archived
Headers show
Series : generic/020: fix MAX_ATTRVAL_SIZE values | expand

Commit Message

David Disseldorp April 13, 2022, 4:44 p.m. UTC
As found by Dave Chinner, fff4359d ("020: make this xattr test generic")
unintentionally changed the long attribute value length from 100K to 64
*bytes* for XFS, UDF and Btrfs.
Update XFS and UDF to use a 64K $max_attrval_size value. For Btrfs, use
the nodesize, xattr length and tree entry overhead sizes to calculate
the maximum.
NFS doesn't provide a way to find out the $max_attrval_size for the
underlying filesystem on the server, so just use a rough 1K limit.

Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 tests/generic/020 | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/tests/generic/020 b/tests/generic/020
index cbd3f227..f50a4f87 100755
--- a/tests/generic/020
+++ b/tests/generic/020
@@ -113,20 +113,32 @@  _attr_get_max()
 		let max_attrs=$BLOCK_SIZE/40
 	esac
 
-	# Set max attr value size based on fs type
+	# Set max attr value size in bytes based on fs type
 	case "$FSTYP" in
-	xfs|udf|btrfs)
-		max_attrval_size=64
+	btrfs)
+		_require_btrfs_command inspect-internal dump-super
+		local ns=$($BTRFS_UTIL_PROG inspect-internal dump-super \
+				$TEST_DEV | sed -n 's/nodesize\s*\(.*\)/\1/p')
+		[ -n "$ns" ] || _fail "failed to obtain nodesize"
+		# max == nodesize - sizeof(struct btrfs_header)
+		#		- sizeof(struct btrfs_item)
+		#		- sizeof(struct btrfs_dir_item) - name_len
+		max_attrval_size=$(( $ns - 156 - $max_attrval_namelen ))
 		;;
 	pvfs2)
 		max_attrval_size=8192
 		;;
-	9p|ceph|nfs)
+	xfs|udf|9p|ceph)
 		max_attrval_size=65536
 		;;
 	bcachefs)
 		max_attrval_size=1024
 		;;
+	nfs)
+		# NFS doesn't provide a way to find out the max_attrval_size for
+		# the underlying filesystem, so just use the lowest value above.
+		max_attrval_size=1024
+		;;
 	*)
 		# Assume max ~1 block of attrs
 		BLOCK_SIZE=`_get_block_size $TEST_DIR`