public inbox for fstests@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfs/018: test log attr replay with zero-length attr value
@ 2026-04-01  6:06 Long Li
  2026-04-01 14:35 ` Darrick J. Wong
  0 siblings, 1 reply; 2+ messages in thread
From: Long Li @ 2026-04-01  6:06 UTC (permalink / raw)
  To: zlang, djwong
  Cc: linux-xfs, fstests, yi.zhang, houtao1, leo.lilong, yangerkun

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>
---
 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


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] xfs/018: test log attr replay with zero-length attr value
  2026-04-01  6:06 [PATCH] xfs/018: test log attr replay with zero-length attr value Long Li
@ 2026-04-01 14:35 ` Darrick J. Wong
  0 siblings, 0 replies; 2+ messages in thread
From: Darrick J. Wong @ 2026-04-01 14:35 UTC (permalink / raw)
  To: Long Li; +Cc: zlang, linux-xfs, fstests, yi.zhang, houtao1, yangerkun

On Wed, Apr 01, 2026 at 02:06:32PM +0800, Long Li wrote:
> 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

Gross. :)

> 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>

Thanks for catching adding the empty attr case; I hadn't realized that
was actually possible.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  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
> 
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-04-01 14:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-01  6:06 [PATCH] xfs/018: test log attr replay with zero-length attr value Long Li
2026-04-01 14:35 ` Darrick J. Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox