diff mbox series

[3/3] xfs/547: fix problems with realtime

Message ID 165705853976.2820493.11634341636419465537.stgit@magnolia (mailing list archive)
State New, archived
Headers show
Series fstests: random fixes | expand

Commit Message

Darrick J. Wong July 5, 2022, 10:02 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

This test needs to fragment the free space on the data device so that
each block added to the attr fork gets its own mapping.  If the test
configuration sets up a rt device and rtinherit=1 on the root dir, the
test will erroneously fragment space on the *realtime* volume.  When
this happens, attr fork allocations are contiguous and get merged into
fewer than 10 extents and the test fails.

Fix this test to force all allocations to be on the data device, and fix
incorrect variable usage in the error messages.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 tests/xfs/547 |   14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

Comments

Zorro Lang July 7, 2022, 1:15 p.m. UTC | #1
On Tue, Jul 05, 2022 at 03:02:19PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> This test needs to fragment the free space on the data device so that
> each block added to the attr fork gets its own mapping.  If the test
> configuration sets up a rt device and rtinherit=1 on the root dir, the
> test will erroneously fragment space on the *realtime* volume.  When
> this happens, attr fork allocations are contiguous and get merged into
> fewer than 10 extents and the test fails.
> 
> Fix this test to force all allocations to be on the data device, and fix
> incorrect variable usage in the error messages.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  tests/xfs/547 |   14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/tests/xfs/547 b/tests/xfs/547
> index 9d4216ca..60121eb9 100755
> --- a/tests/xfs/547
> +++ b/tests/xfs/547
> @@ -33,6 +33,10 @@ for nrext64 in 0 1; do
>  		      >> $seqres.full
>  	_scratch_mount >> $seqres.full
>  
> +	# Force data device extents so that we can fragment the free space
> +	# and force attr fork allocations to be non-contiguous
> +	_xfs_force_bdev data $SCRATCH_MNT
> +
>  	bsize=$(_get_file_block_size $SCRATCH_MNT)
>  
>  	testfile=$SCRATCH_MNT/testfile
> @@ -76,13 +80,15 @@ for nrext64 in 0 1; do
>  	acnt=$(_scratch_xfs_get_metadata_field core.naextents \
>  					       "path /$(basename $testfile)")
>  
> -	if (( $dcnt != 10 )); then
> -		echo "Invalid data fork extent count: $dextcnt"
> +	echo "nrext64: $nrext64 dcnt: $dcnt acnt: $acnt" >> $seqres.full
> +
> +	if [ -z "$dcnt" ] || (( $dcnt != 10 )); then

I'm wondering why we need to use bash ((...)) operator at here, is $dcnt
an expression? Can [ "$dcnt" != "10" ] help that?

Thanks,
Zorro

> +		echo "Invalid data fork extent count: $dcnt"
>  		exit 1
>  	fi
>  
> -	if (( $acnt < 10 )); then
> -		echo "Invalid attr fork extent count: $aextcnt"
> +	if [ -z "$acnt" ] || (( $acnt < 10 )); then
> +		echo "Invalid attr fork extent count: $acnt"
>  		exit 1
>  	fi
>  done
>
Darrick J. Wong July 7, 2022, 6:05 p.m. UTC | #2
On Thu, Jul 07, 2022 at 09:15:27PM +0800, Zorro Lang wrote:
> On Tue, Jul 05, 2022 at 03:02:19PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> > 
> > This test needs to fragment the free space on the data device so that
> > each block added to the attr fork gets its own mapping.  If the test
> > configuration sets up a rt device and rtinherit=1 on the root dir, the
> > test will erroneously fragment space on the *realtime* volume.  When
> > this happens, attr fork allocations are contiguous and get merged into
> > fewer than 10 extents and the test fails.
> > 
> > Fix this test to force all allocations to be on the data device, and fix
> > incorrect variable usage in the error messages.
> > 
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> >  tests/xfs/547 |   14 ++++++++++----
> >  1 file changed, 10 insertions(+), 4 deletions(-)
> > 
> > 
> > diff --git a/tests/xfs/547 b/tests/xfs/547
> > index 9d4216ca..60121eb9 100755
> > --- a/tests/xfs/547
> > +++ b/tests/xfs/547
> > @@ -33,6 +33,10 @@ for nrext64 in 0 1; do
> >  		      >> $seqres.full
> >  	_scratch_mount >> $seqres.full
> >  
> > +	# Force data device extents so that we can fragment the free space
> > +	# and force attr fork allocations to be non-contiguous
> > +	_xfs_force_bdev data $SCRATCH_MNT
> > +
> >  	bsize=$(_get_file_block_size $SCRATCH_MNT)
> >  
> >  	testfile=$SCRATCH_MNT/testfile
> > @@ -76,13 +80,15 @@ for nrext64 in 0 1; do
> >  	acnt=$(_scratch_xfs_get_metadata_field core.naextents \
> >  					       "path /$(basename $testfile)")
> >  
> > -	if (( $dcnt != 10 )); then
> > -		echo "Invalid data fork extent count: $dextcnt"
> > +	echo "nrext64: $nrext64 dcnt: $dcnt acnt: $acnt" >> $seqres.full
> > +
> > +	if [ -z "$dcnt" ] || (( $dcnt != 10 )); then
> 
> I'm wondering why we need to use bash ((...)) operator at here, is $dcnt
> an expression? Can [ "$dcnt" != "10" ] help that?

dcnt should be a decimal number, or the empty string if the xfs_db
totally failed.  The fancy comparison protects against xfs_db someday
returning results in hexadecimal or a non-number string, but I don't
think it'll ever do that.  I think your suggestion would work for this
case.

I don't think it works so well for the second case, since the fancy
comparison "(( $acnt < 10 ))" apparently returns false even if acnt is
non-numeric, whereas "[ $acnt -lt 10 ]" would error out.

--D

> Thanks,
> Zorro
> 
> > +		echo "Invalid data fork extent count: $dcnt"
> >  		exit 1
> >  	fi
> >  
> > -	if (( $acnt < 10 )); then
> > -		echo "Invalid attr fork extent count: $aextcnt"
> > +	if [ -z "$acnt" ] || (( $acnt < 10 )); then
> > +		echo "Invalid attr fork extent count: $acnt"
> >  		exit 1
> >  	fi
> >  done
> > 
>
Zorro Lang July 8, 2022, 2:56 p.m. UTC | #3
On Thu, Jul 07, 2022 at 11:05:25AM -0700, Darrick J. Wong wrote:
> On Thu, Jul 07, 2022 at 09:15:27PM +0800, Zorro Lang wrote:
> > On Tue, Jul 05, 2022 at 03:02:19PM -0700, Darrick J. Wong wrote:
> > > From: Darrick J. Wong <djwong@kernel.org>
> > > 
> > > This test needs to fragment the free space on the data device so that
> > > each block added to the attr fork gets its own mapping.  If the test
> > > configuration sets up a rt device and rtinherit=1 on the root dir, the
> > > test will erroneously fragment space on the *realtime* volume.  When
> > > this happens, attr fork allocations are contiguous and get merged into
> > > fewer than 10 extents and the test fails.
> > > 
> > > Fix this test to force all allocations to be on the data device, and fix
> > > incorrect variable usage in the error messages.
> > > 
> > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > ---
> > >  tests/xfs/547 |   14 ++++++++++----
> > >  1 file changed, 10 insertions(+), 4 deletions(-)
> > > 
> > > 
> > > diff --git a/tests/xfs/547 b/tests/xfs/547
> > > index 9d4216ca..60121eb9 100755
> > > --- a/tests/xfs/547
> > > +++ b/tests/xfs/547
> > > @@ -33,6 +33,10 @@ for nrext64 in 0 1; do
> > >  		      >> $seqres.full
> > >  	_scratch_mount >> $seqres.full
> > >  
> > > +	# Force data device extents so that we can fragment the free space
> > > +	# and force attr fork allocations to be non-contiguous
> > > +	_xfs_force_bdev data $SCRATCH_MNT
> > > +
> > >  	bsize=$(_get_file_block_size $SCRATCH_MNT)
> > >  
> > >  	testfile=$SCRATCH_MNT/testfile
> > > @@ -76,13 +80,15 @@ for nrext64 in 0 1; do
> > >  	acnt=$(_scratch_xfs_get_metadata_field core.naextents \
> > >  					       "path /$(basename $testfile)")
> > >  
> > > -	if (( $dcnt != 10 )); then
> > > -		echo "Invalid data fork extent count: $dextcnt"
> > > +	echo "nrext64: $nrext64 dcnt: $dcnt acnt: $acnt" >> $seqres.full
> > > +
> > > +	if [ -z "$dcnt" ] || (( $dcnt != 10 )); then
> > 
> > I'm wondering why we need to use bash ((...)) operator at here, is $dcnt
> > an expression? Can [ "$dcnt" != "10" ] help that?
> 
> dcnt should be a decimal number, or the empty string if the xfs_db
> totally failed.  The fancy comparison protects against xfs_db someday
> returning results in hexadecimal or a non-number string, but I don't

Oh, it might be hexadecimal. OK, I'd like to respect the history reason.
So this looks good to me.

Reviewed-by: Zorro Lang <zlang@redhat.com>

> think it'll ever do that.  I think your suggestion would work for this
> case.
> 
> I don't think it works so well for the second case, since the fancy
> comparison "(( $acnt < 10 ))" apparently returns false even if acnt is
> non-numeric, whereas "[ $acnt -lt 10 ]" would error out.
> 
> --D
> 
> > Thanks,
> > Zorro
> > 
> > > +		echo "Invalid data fork extent count: $dcnt"
> > >  		exit 1
> > >  	fi
> > >  
> > > -	if (( $acnt < 10 )); then
> > > -		echo "Invalid attr fork extent count: $aextcnt"
> > > +	if [ -z "$acnt" ] || (( $acnt < 10 )); then
> > > +		echo "Invalid attr fork extent count: $acnt"
> > >  		exit 1
> > >  	fi
> > >  done
> > > 
> > 
>
diff mbox series

Patch

diff --git a/tests/xfs/547 b/tests/xfs/547
index 9d4216ca..60121eb9 100755
--- a/tests/xfs/547
+++ b/tests/xfs/547
@@ -33,6 +33,10 @@  for nrext64 in 0 1; do
 		      >> $seqres.full
 	_scratch_mount >> $seqres.full
 
+	# Force data device extents so that we can fragment the free space
+	# and force attr fork allocations to be non-contiguous
+	_xfs_force_bdev data $SCRATCH_MNT
+
 	bsize=$(_get_file_block_size $SCRATCH_MNT)
 
 	testfile=$SCRATCH_MNT/testfile
@@ -76,13 +80,15 @@  for nrext64 in 0 1; do
 	acnt=$(_scratch_xfs_get_metadata_field core.naextents \
 					       "path /$(basename $testfile)")
 
-	if (( $dcnt != 10 )); then
-		echo "Invalid data fork extent count: $dextcnt"
+	echo "nrext64: $nrext64 dcnt: $dcnt acnt: $acnt" >> $seqres.full
+
+	if [ -z "$dcnt" ] || (( $dcnt != 10 )); then
+		echo "Invalid data fork extent count: $dcnt"
 		exit 1
 	fi
 
-	if (( $acnt < 10 )); then
-		echo "Invalid attr fork extent count: $aextcnt"
+	if [ -z "$acnt" ] || (( $acnt < 10 )); then
+		echo "Invalid attr fork extent count: $acnt"
 		exit 1
 	fi
 done