diff mbox series

[4/4] xfs/548: Verify correctness of upgrading an fs to support large extent counters

Message ID 20220606124101.263872-5-chandan.babu@oracle.com (mailing list archive)
State New, archived
Headers show
Series Large extent counters tests | expand

Commit Message

Chandan Babu R June 6, 2022, 12:41 p.m. UTC
This commit adds a test to verify upgrade of an existing V5 filesystem to
support large extent counters.

Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
---
 tests/xfs/548     | 109 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/548.out |  12 +++++
 2 files changed, 121 insertions(+)
 create mode 100755 tests/xfs/548
 create mode 100644 tests/xfs/548.out

Comments

Darrick J. Wong June 6, 2022, 3:35 p.m. UTC | #1
On Mon, Jun 06, 2022 at 06:11:01PM +0530, Chandan Babu R wrote:
> This commit adds a test to verify upgrade of an existing V5 filesystem to
> support large extent counters.
> 
> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
> ---
>  tests/xfs/548     | 109 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/548.out |  12 +++++
>  2 files changed, 121 insertions(+)
>  create mode 100755 tests/xfs/548
>  create mode 100644 tests/xfs/548.out
> 
> diff --git a/tests/xfs/548 b/tests/xfs/548
> new file mode 100755
> index 00000000..6c577584
> --- /dev/null
> +++ b/tests/xfs/548
> @@ -0,0 +1,109 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2022 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 548
> +#
> +# Test to verify upgrade of an existing V5 filesystem to support large extent
> +# counters.
> +#
> +. ./common/preamble
> +_begin_fstest auto quick metadata
> +
> +# Import common functions.
> +. ./common/filter
> +. ./common/attr
> +. ./common/inject
> +. ./common/populate
> +
> +# real QA test starts here
> +_supported_fs xfs
> +_require_scratch
> +_require_scratch_xfs_nrext64
> +_require_attrs
> +_require_xfs_debug
> +_require_test_program "punch-alternating"
> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
> +
> +_scratch_mkfs -d size=$((512 * 1024 * 1024)) >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +bsize=$(_get_file_block_size $SCRATCH_MNT)
> +
> +testfile=$SCRATCH_MNT/testfile
> +
> +nr_blks=20
> +
> +echo "Add blocks to file's data fork"
> +$XFS_IO_PROG -f -c "pwrite 0 $((nr_blks * bsize))" $testfile \
> +	     >> $seqres.full
> +$here/src/punch-alternating $testfile
> +
> +echo "Consume free space"
> +fillerdir=$SCRATCH_MNT/fillerdir
> +nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
> +nr_free_blks=$((nr_free_blks * 90 / 100))
> +
> +_fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 \
> +	 >> $seqres.full 2>&1
> +
> +echo "Create fragmented filesystem"
> +for dentry in $(ls -1 $fillerdir/); do
> +	$here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
> +done
> +
> +echo "Inject bmap_alloc_minlen_extent error tag"
> +_scratch_inject_error bmap_alloc_minlen_extent 1
> +
> +echo "Add blocks to file's attr fork"
> +nr_blks=10
> +attr_len=255
> +nr_attrs=$((nr_blks * bsize / attr_len))
> +for i in $(seq 1 $nr_attrs); do
> +	attr="$(printf "trusted.%0247d" $i)"
> +	$SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1
> +	[[ $? != 0 ]] && break
> +done
> +
> +testino=$(stat -c '%i' $testfile)
> +
> +echo "Unmount filesystem"
> +_scratch_unmount >> $seqres.full
> +
> +orig_dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
> +orig_acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
> +
> +echo "Upgrade filesystem to support large extent counters"
> +_scratch_xfs_admin -O nrext64=1 >> $seqres.full 2>&1
> +if [[ $? != 0 ]]; then
> +	_notrun "Filesystem geometry is not suitable for upgrading"
> +fi
> +
> +
> +echo "Mount filesystem"
> +_scratch_mount >> $seqres.full
> +
> +echo "Modify inode core"
> +touch $testfile
> +
> +echo "Unmount filesystem"
> +_scratch_unmount >> $seqres.full
> +
> +dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
> +acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
> +
> +echo "Verify inode extent counter values after fs upgrade"

Is there a scenario where the inode counters would become corrupt after
enabling the superblock feature bit?  IIRC repair doesn't rewrite the
inodes during the upgrade... so is this test merely being cautious?  Or
is this covering a failure you found somewhere while writing the feature?

--D

> +
> +if [[ $orig_dcnt != $dcnt ]]; then
> +	echo "Corrupt data extent counter"
> +	exit 1
> +fi
> +
> +if [[ $orig_acnt != $acnt ]]; then
> +	echo "Corrupt attr extent counter"
> +	exit 1
> +fi
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/548.out b/tests/xfs/548.out
> new file mode 100644
> index 00000000..19a7f907
> --- /dev/null
> +++ b/tests/xfs/548.out
> @@ -0,0 +1,12 @@
> +QA output created by 548
> +Add blocks to file's data fork
> +Consume free space
> +Create fragmented filesystem
> +Inject bmap_alloc_minlen_extent error tag
> +Add blocks to file's attr fork
> +Unmount filesystem
> +Upgrade filesystem to support large extent counters
> +Mount filesystem
> +Modify inode core
> +Unmount filesystem
> +Verify inode extent counter values after fs upgrade
> -- 
> 2.35.1
>
Chandan Babu R June 7, 2022, 9:47 a.m. UTC | #2
On Mon, Jun 06, 2022 at 08:35:19 AM -0700, Darrick J. Wong wrote:
> On Mon, Jun 06, 2022 at 06:11:01PM +0530, Chandan Babu R wrote:
>> This commit adds a test to verify upgrade of an existing V5 filesystem to
>> support large extent counters.
>> 
>> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
>> ---
>>  tests/xfs/548     | 109 ++++++++++++++++++++++++++++++++++++++++++++++
>>  tests/xfs/548.out |  12 +++++
>>  2 files changed, 121 insertions(+)
>>  create mode 100755 tests/xfs/548
>>  create mode 100644 tests/xfs/548.out
>> 
>> diff --git a/tests/xfs/548 b/tests/xfs/548
>> new file mode 100755
>> index 00000000..6c577584
>> --- /dev/null
>> +++ b/tests/xfs/548
>> @@ -0,0 +1,109 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2022 Oracle.  All Rights Reserved.
>> +#
>> +# FS QA Test 548
>> +#
>> +# Test to verify upgrade of an existing V5 filesystem to support large extent
>> +# counters.
>> +#
>> +. ./common/preamble
>> +_begin_fstest auto quick metadata
>> +
>> +# Import common functions.
>> +. ./common/filter
>> +. ./common/attr
>> +. ./common/inject
>> +. ./common/populate
>> +
>> +# real QA test starts here
>> +_supported_fs xfs
>> +_require_scratch
>> +_require_scratch_xfs_nrext64
>> +_require_attrs
>> +_require_xfs_debug
>> +_require_test_program "punch-alternating"
>> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
>> +
>> +_scratch_mkfs -d size=$((512 * 1024 * 1024)) >> $seqres.full
>> +_scratch_mount >> $seqres.full
>> +
>> +bsize=$(_get_file_block_size $SCRATCH_MNT)
>> +
>> +testfile=$SCRATCH_MNT/testfile
>> +
>> +nr_blks=20
>> +
>> +echo "Add blocks to file's data fork"
>> +$XFS_IO_PROG -f -c "pwrite 0 $((nr_blks * bsize))" $testfile \
>> +	     >> $seqres.full
>> +$here/src/punch-alternating $testfile
>> +
>> +echo "Consume free space"
>> +fillerdir=$SCRATCH_MNT/fillerdir
>> +nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
>> +nr_free_blks=$((nr_free_blks * 90 / 100))
>> +
>> +_fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 \
>> +	 >> $seqres.full 2>&1
>> +
>> +echo "Create fragmented filesystem"
>> +for dentry in $(ls -1 $fillerdir/); do
>> +	$here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
>> +done
>> +
>> +echo "Inject bmap_alloc_minlen_extent error tag"
>> +_scratch_inject_error bmap_alloc_minlen_extent 1
>> +
>> +echo "Add blocks to file's attr fork"
>> +nr_blks=10
>> +attr_len=255
>> +nr_attrs=$((nr_blks * bsize / attr_len))
>> +for i in $(seq 1 $nr_attrs); do
>> +	attr="$(printf "trusted.%0247d" $i)"
>> +	$SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1
>> +	[[ $? != 0 ]] && break
>> +done
>> +
>> +testino=$(stat -c '%i' $testfile)
>> +
>> +echo "Unmount filesystem"
>> +_scratch_unmount >> $seqres.full
>> +
>> +orig_dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
>> +orig_acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
>> +
>> +echo "Upgrade filesystem to support large extent counters"
>> +_scratch_xfs_admin -O nrext64=1 >> $seqres.full 2>&1
>> +if [[ $? != 0 ]]; then
>> +	_notrun "Filesystem geometry is not suitable for upgrading"
>> +fi
>> +
>> +
>> +echo "Mount filesystem"
>> +_scratch_mount >> $seqres.full
>> +
>> +echo "Modify inode core"
>> +touch $testfile
>> +
>> +echo "Unmount filesystem"
>> +_scratch_unmount >> $seqres.full
>> +
>> +dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
>> +acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
>> +
>> +echo "Verify inode extent counter values after fs upgrade"
>
> Is there a scenario where the inode counters would become corrupt after
> enabling the superblock feature bit?  IIRC repair doesn't rewrite the
> inodes during the upgrade... so is this test merely being cautious?  Or
> is this covering a failure you found somewhere while writing the feature?
>

I was just being cautious w.r.t "Large extent counters" functionality working
correctly. I used this test during my development to make sure that I was able
to capture failures before I ran the entire xfstests suite.
Darrick J. Wong June 7, 2022, 3:20 p.m. UTC | #3
On Tue, Jun 07, 2022 at 03:17:01PM +0530, Chandan Babu R wrote:
> On Mon, Jun 06, 2022 at 08:35:19 AM -0700, Darrick J. Wong wrote:
> > On Mon, Jun 06, 2022 at 06:11:01PM +0530, Chandan Babu R wrote:
> >> This commit adds a test to verify upgrade of an existing V5 filesystem to
> >> support large extent counters.
> >> 
> >> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
> >> ---
> >>  tests/xfs/548     | 109 ++++++++++++++++++++++++++++++++++++++++++++++
> >>  tests/xfs/548.out |  12 +++++
> >>  2 files changed, 121 insertions(+)
> >>  create mode 100755 tests/xfs/548
> >>  create mode 100644 tests/xfs/548.out
> >> 
> >> diff --git a/tests/xfs/548 b/tests/xfs/548
> >> new file mode 100755
> >> index 00000000..6c577584
> >> --- /dev/null
> >> +++ b/tests/xfs/548
> >> @@ -0,0 +1,109 @@
> >> +#! /bin/bash
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +# Copyright (c) 2022 Oracle.  All Rights Reserved.
> >> +#
> >> +# FS QA Test 548
> >> +#
> >> +# Test to verify upgrade of an existing V5 filesystem to support large extent
> >> +# counters.
> >> +#
> >> +. ./common/preamble
> >> +_begin_fstest auto quick metadata
> >> +
> >> +# Import common functions.
> >> +. ./common/filter
> >> +. ./common/attr
> >> +. ./common/inject
> >> +. ./common/populate
> >> +
> >> +# real QA test starts here
> >> +_supported_fs xfs
> >> +_require_scratch
> >> +_require_scratch_xfs_nrext64
> >> +_require_attrs
> >> +_require_xfs_debug
> >> +_require_test_program "punch-alternating"
> >> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
> >> +
> >> +_scratch_mkfs -d size=$((512 * 1024 * 1024)) >> $seqres.full
> >> +_scratch_mount >> $seqres.full
> >> +
> >> +bsize=$(_get_file_block_size $SCRATCH_MNT)
> >> +
> >> +testfile=$SCRATCH_MNT/testfile
> >> +
> >> +nr_blks=20
> >> +
> >> +echo "Add blocks to file's data fork"
> >> +$XFS_IO_PROG -f -c "pwrite 0 $((nr_blks * bsize))" $testfile \
> >> +	     >> $seqres.full
> >> +$here/src/punch-alternating $testfile
> >> +
> >> +echo "Consume free space"
> >> +fillerdir=$SCRATCH_MNT/fillerdir
> >> +nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
> >> +nr_free_blks=$((nr_free_blks * 90 / 100))
> >> +
> >> +_fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 \
> >> +	 >> $seqres.full 2>&1
> >> +
> >> +echo "Create fragmented filesystem"
> >> +for dentry in $(ls -1 $fillerdir/); do
> >> +	$here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
> >> +done
> >> +
> >> +echo "Inject bmap_alloc_minlen_extent error tag"
> >> +_scratch_inject_error bmap_alloc_minlen_extent 1
> >> +
> >> +echo "Add blocks to file's attr fork"
> >> +nr_blks=10
> >> +attr_len=255
> >> +nr_attrs=$((nr_blks * bsize / attr_len))
> >> +for i in $(seq 1 $nr_attrs); do
> >> +	attr="$(printf "trusted.%0247d" $i)"
> >> +	$SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1
> >> +	[[ $? != 0 ]] && break
> >> +done
> >> +
> >> +testino=$(stat -c '%i' $testfile)
> >> +
> >> +echo "Unmount filesystem"
> >> +_scratch_unmount >> $seqres.full
> >> +
> >> +orig_dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
> >> +orig_acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
> >> +
> >> +echo "Upgrade filesystem to support large extent counters"
> >> +_scratch_xfs_admin -O nrext64=1 >> $seqres.full 2>&1
> >> +if [[ $? != 0 ]]; then
> >> +	_notrun "Filesystem geometry is not suitable for upgrading"
> >> +fi
> >> +
> >> +
> >> +echo "Mount filesystem"
> >> +_scratch_mount >> $seqres.full
> >> +
> >> +echo "Modify inode core"
> >> +touch $testfile
> >> +
> >> +echo "Unmount filesystem"
> >> +_scratch_unmount >> $seqres.full
> >> +
> >> +dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
> >> +acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
> >> +
> >> +echo "Verify inode extent counter values after fs upgrade"
> >
> > Is there a scenario where the inode counters would become corrupt after
> > enabling the superblock feature bit?  IIRC repair doesn't rewrite the
> > inodes during the upgrade... so is this test merely being cautious?  Or
> > is this covering a failure you found somewhere while writing the feature?
> >
> 
> I was just being cautious w.r.t "Large extent counters" functionality working
> correctly. I used this test during my development to make sure that I was able
> to capture failures before I ran the entire xfstests suite.

Fair enough,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> 
> -- 
> chandan
diff mbox series

Patch

diff --git a/tests/xfs/548 b/tests/xfs/548
new file mode 100755
index 00000000..6c577584
--- /dev/null
+++ b/tests/xfs/548
@@ -0,0 +1,109 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 Oracle.  All Rights Reserved.
+#
+# FS QA Test 548
+#
+# Test to verify upgrade of an existing V5 filesystem to support large extent
+# counters.
+#
+. ./common/preamble
+_begin_fstest auto quick metadata
+
+# Import common functions.
+. ./common/filter
+. ./common/attr
+. ./common/inject
+. ./common/populate
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch
+_require_scratch_xfs_nrext64
+_require_attrs
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+
+_scratch_mkfs -d size=$((512 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+
+testfile=$SCRATCH_MNT/testfile
+
+nr_blks=20
+
+echo "Add blocks to file's data fork"
+$XFS_IO_PROG -f -c "pwrite 0 $((nr_blks * bsize))" $testfile \
+	     >> $seqres.full
+$here/src/punch-alternating $testfile
+
+echo "Consume free space"
+fillerdir=$SCRATCH_MNT/fillerdir
+nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
+nr_free_blks=$((nr_free_blks * 90 / 100))
+
+_fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 \
+	 >> $seqres.full 2>&1
+
+echo "Create fragmented filesystem"
+for dentry in $(ls -1 $fillerdir/); do
+	$here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
+done
+
+echo "Inject bmap_alloc_minlen_extent error tag"
+_scratch_inject_error bmap_alloc_minlen_extent 1
+
+echo "Add blocks to file's attr fork"
+nr_blks=10
+attr_len=255
+nr_attrs=$((nr_blks * bsize / attr_len))
+for i in $(seq 1 $nr_attrs); do
+	attr="$(printf "trusted.%0247d" $i)"
+	$SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1
+	[[ $? != 0 ]] && break
+done
+
+testino=$(stat -c '%i' $testfile)
+
+echo "Unmount filesystem"
+_scratch_unmount >> $seqres.full
+
+orig_dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
+orig_acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
+
+echo "Upgrade filesystem to support large extent counters"
+_scratch_xfs_admin -O nrext64=1 >> $seqres.full 2>&1
+if [[ $? != 0 ]]; then
+	_notrun "Filesystem geometry is not suitable for upgrading"
+fi
+
+
+echo "Mount filesystem"
+_scratch_mount >> $seqres.full
+
+echo "Modify inode core"
+touch $testfile
+
+echo "Unmount filesystem"
+_scratch_unmount >> $seqres.full
+
+dcnt=$(_scratch_xfs_get_metadata_field core.nextents "inode $testino")
+acnt=$(_scratch_xfs_get_metadata_field core.naextents "inode $testino")
+
+echo "Verify inode extent counter values after fs upgrade"
+
+if [[ $orig_dcnt != $dcnt ]]; then
+	echo "Corrupt data extent counter"
+	exit 1
+fi
+
+if [[ $orig_acnt != $acnt ]]; then
+	echo "Corrupt attr extent counter"
+	exit 1
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/548.out b/tests/xfs/548.out
new file mode 100644
index 00000000..19a7f907
--- /dev/null
+++ b/tests/xfs/548.out
@@ -0,0 +1,12 @@ 
+QA output created by 548
+Add blocks to file's data fork
+Consume free space
+Create fragmented filesystem
+Inject bmap_alloc_minlen_extent error tag
+Add blocks to file's attr fork
+Unmount filesystem
+Upgrade filesystem to support large extent counters
+Mount filesystem
+Modify inode core
+Unmount filesystem
+Verify inode extent counter values after fs upgrade