From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E1F225F7A9; Wed, 1 Apr 2026 14:35:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775054133; cv=none; b=NBZYiEvPZcPxdKi+r9GuAOi0Yhnv91lwlLAKOWMGhoauqDnk/Cs+Hzep61YNeTbYIhBlTLVpHLD5efd7zn+UPpZWG+sScbGGHlRrmuCRtBm9xMzCsDH2fJGQukku003CUX/LkgjkJ/3X5Ak6kDChqrOKj40wzjWoz8B+mWP07Jk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775054133; c=relaxed/simple; bh=en1FN1eE0L432BK1935FKQUzOC8Zc9VG/uc2HmcKPGQ=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=q5FczpCKJODReeLNT+Cw6G3t0k/R9wjwTipsbiu6uIpAo1x/oz9YVfK1haL4aelHeSpZizKSvKgL6vfdFDijEzChMJ3a5youah/cyufaHklNH2Mk3SnPymRm6ru4qySuryQfHOJvzfuLeB8Qbm15l2j/F8LVusye/ZRcESfu+mk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TzNi5qbf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TzNi5qbf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 30FEEC4CEF7; Wed, 1 Apr 2026 14:35:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775054133; bh=en1FN1eE0L432BK1935FKQUzOC8Zc9VG/uc2HmcKPGQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=TzNi5qbfiLXPgWoChG2BaqMlZuiqegbRogeJM2r9VPluMq5MhWY24gJogZIWUYC/X kvHCJii+Qsrhp/TMPPRI0RE5f5C33dF2gwTIyMJko77AP6McbxEuW4u/lc0iOg2qDC AtraZXWA2Du3K+iFp6AguBVYpon6X6Zkfd5RZuhDdtLwrW50Ycqg32P/aGYsz5l7q0 /QJRA2lPnLK+wt12tRWyeRlW1ABaWMRdRhBtT6nH/iXtDAE2AJxM2Zu/DoOxLlySi4 xbRybGwrkx91Uj4QJRRWU3BgE4kMTHEUnLGviEmlwih5D2DyrXaMgNkDvYflVMnaEp QTwBIGjJDxbYg== Date: Wed, 1 Apr 2026 07:35:32 -0700 From: "Darrick J. Wong" To: Long Li Cc: zlang@redhat.com, linux-xfs@vger.kernel.org, fstests@vger.kernel.org, yi.zhang@huawei.com, houtao1@huawei.com, yangerkun@huawei.com Subject: Re: [PATCH] xfs/018: test log attr replay with zero-length attr value Message-ID: <20260401143532.GK6212@frogsfrogsfrogs> References: <20260401060632.2085015-1-leo.lilong@huawei.com> Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260401060632.2085015-1-leo.lilong@huawei.com> 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 Thanks for catching adding the empty attr case; I hadn't realized that was actually possible. Reviewed-by: "Darrick J. Wong" --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 > >