]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
xfs/018: test log attr replay with zero-length attr value
authorLong Li <leo.lilong@huawei.com>
Wed, 1 Apr 2026 06:06:32 +0000 (14:06 +0800)
committerZorro Lang <zlang@kernel.org>
Wed, 1 Apr 2026 15:07:08 +0000 (23:07 +0800)
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 <leo.lilong@huawei.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Zorro Lang <zlang@kernel.org>
tests/xfs/018
tests/xfs/018.out

index 9b69c9cb14b33d15304538b0016589dfcc976020..3a40a85a09312fe5edbd706657653529c5c99a87 100755 (executable)
@@ -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"
index be1d6422af65a5d76dc33eb410c5aec1687084b7..11b1c03416d1f9001030a9ed77ff2f6fdc865d19 100644 (file)
@@ -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