[PATCH] xfs/018: test log attr replay with zero-length attr value

Long Li <[email protected]>
Newsgroups org.kernel.vger.fstests,org.kernel.vger.linux-xfs
Message-ID <[email protected]>
Kernel commit d72f2084e309 ("xfs: fix ri_total validation in
xlog_recover_attri_commit_pass2") fixed a bug where setting a
zero-length attribute value would cause incorrect ri_total
validation during log recovery.

Add test cases to xfs/018 to cover this scenario across attr
fork formats: extent and remote.

Using echo -n "" | attr -s is unreliable for empty values since
attr may treat stdin EOF as no value provided. Instead, handle
zero-length values explicitly in test_attr_replay() by using
attr -s -V "" when the value is empty.

Signed-off-by: Long Li <[email protected]>
---
 tests/xfs/018     | 26 ++++++++++++++++++++++----
 tests/xfs/018.out | 20 ++++++++++++++++++++
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/tests/xfs/018 b/tests/xfs/018
index 9b69c9cb..3a40a85a 100755
--- a/tests/xfs/018
+++ b/tests/xfs/018
@@ -33,10 +33,18 @@ test_attr_replay()
 	# Inject error
 	_scratch_inject_error $error_tag
 
-	# Set attribute, being careful not to include the trailing newline
-	# in the attr value.
-	echo -n "$attr_value" | ${ATTR_PROG} -$flag "$attr_name" $testfile 2>&1 | \
-			    _filter_scratch
+	# Set attribute. For zero-length values, use -V "" explicitly to
+	# avoid relying on stdin EOF behavior which is undefined for empty
+	# values. Otherwise, being careful not to include the trailing
+	# newline in the attr value.
+	if [ "$flag" = "s" ] && [ -z "$attr_value" ]; then
+		${ATTR_PROG} -s "$attr_name" -V "" $testfile 2>&1 | \
+			_filter_scratch
+	else
+		echo -n "$attr_value" | ${ATTR_PROG} -$flag "$attr_name" \
+			$testfile 2>&1 | _filter_scratch
+	fi
+
 
 	# FS should be shut down, touch will fail
 	touch $testfile 2>&1 | _filter_scratch
@@ -147,6 +155,11 @@ create_test_file inline_file3 1 $attr16
 test_attr_replay inline_file3 "attr_name2" $attr64k "s" "larp"
 test_attr_replay inline_file3 "attr_name2" $attr64k "r" "larp"
 
+# extent, zero-length value
+create_test_file extent_file0 1 $attr1k
+test_attr_replay extent_file0 "attr_name2" "" "s" "larp"
+test_attr_replay extent_file0 "attr_name2" "" "r" "larp"
+
 # extent, internal
 create_test_file extent_file1 1 $attr1k
 test_attr_replay extent_file1 "attr_name2" $attr1k "s" "larp"
@@ -165,6 +178,11 @@ create_test_file extent_file4 1 $attr1k
 test_attr_replay extent_file4 "attr_name2" $attr64k "s" "larp"
 test_attr_replay extent_file4 "attr_name2" $attr64k "r" "larp"
 
+# remote, zero-length value
+create_test_file remote_file0 1 $attr64k
+test_attr_replay remote_file0 "attr_name2" "" "s" "larp"
+test_attr_replay remote_file0 "attr_name2" "" "r" "larp"
+
 # remote, internal
 create_test_file remote_file1 1 $attr64k
 test_attr_replay remote_file1 "attr_name2" $attr1k "s" "larp"
diff --git a/tests/xfs/018.out b/tests/xfs/018.out
index be1d6422..11b1c034 100644
--- a/tests/xfs/018.out
+++ b/tests/xfs/018.out
@@ -41,6 +41,16 @@ Could not remove "attr_name2" for SCRATCH_MNT/testdir/inline_file3
 touch: cannot touch 'SCRATCH_MNT/testdir/inline_file3': Input/output error
 attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
 
+attr_set: Input/output error
+Could not set "attr_name2" for SCRATCH_MNT/testdir/extent_file0
+touch: cannot touch 'SCRATCH_MNT/testdir/extent_file0': Input/output error
+attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
+
+attr_remove: Input/output error
+Could not remove "attr_name2" for SCRATCH_MNT/testdir/extent_file0
+touch: cannot touch 'SCRATCH_MNT/testdir/extent_file0': Input/output error
+attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
+
 attr_set: Input/output error
 Could not set "attr_name2" for SCRATCH_MNT/testdir/extent_file1
 touch: cannot touch 'SCRATCH_MNT/testdir/extent_file1': Input/output error
@@ -71,6 +81,16 @@ Could not remove "attr_name2" for SCRATCH_MNT/testdir/extent_file4
 touch: cannot touch 'SCRATCH_MNT/testdir/extent_file4': Input/output error
 attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
 
+attr_set: Input/output error
+Could not set "attr_name2" for SCRATCH_MNT/testdir/remote_file0
+touch: cannot touch 'SCRATCH_MNT/testdir/remote_file0': Input/output error
+attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
+
+attr_remove: Input/output error
+Could not remove "attr_name2" for SCRATCH_MNT/testdir/remote_file0
+touch: cannot touch 'SCRATCH_MNT/testdir/remote_file0': Input/output error
+attr_name2: d41d8cd98f00b204e9800998ecf8427e  -
+
 attr_set: Input/output error
 Could not set "attr_name2" for SCRATCH_MNT/testdir/remote_file1
 touch: cannot touch 'SCRATCH_MNT/testdir/remote_file1': Input/output error
-- 
2.39.2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.