* [PATCH V5 01/13] _check_xfs_filesystem: sync fs before running scrub
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
@ 2021-03-08 15:50 ` Chandan Babu R
2021-03-08 17:50 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 02/13] common/xfs: Add a helper to get an inode fork's extent count Chandan Babu R
` (11 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:50 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
Tests can create a scenario in which a call to syncfs() issued at the end of
the execution of the test script would return an error code. xfs_scrub
internally calls syncfs() before starting the actual online consistency check
operation. Since this call to syncfs() fails, xfs_scrub ends up returning
without performing consistency checks on the test filesystem. This can mask a
possible on-disk data structure corruption.
To fix the above stated problem, this commit invokes syncfs() prior to
executing xfs_scrub.
Suggested-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
common/xfs | 1 +
1 file changed, 1 insertion(+)
diff --git a/common/xfs b/common/xfs
index 2156749d..7ec89492 100644
--- a/common/xfs
+++ b/common/xfs
@@ -467,6 +467,7 @@ _check_xfs_filesystem()
# Run online scrub if we can.
mntpt="$(_is_dev_mounted $device)"
if [ -n "$mntpt" ] && _supports_xfs_scrub "$mntpt" "$device"; then
+ $XFS_IO_PROG -c syncfs $mntpt >> $seqres.full 2>&1
"$XFS_SCRUB_PROG" $scrubflag -v -d -n $mntpt > $tmp.scrub 2>&1
if [ $? -ne 0 ]; then
_log_err "_check_xfs_filesystem: filesystem on $device failed scrub"
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 01/13] _check_xfs_filesystem: sync fs before running scrub
2021-03-08 15:50 ` [PATCH V5 01/13] _check_xfs_filesystem: sync fs before running scrub Chandan Babu R
@ 2021-03-08 17:50 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 17:50 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:20:59PM +0530, Chandan Babu R wrote:
> Tests can create a scenario in which a call to syncfs() issued at the end of
> the execution of the test script would return an error code. xfs_scrub
> internally calls syncfs() before starting the actual online consistency check
> operation. Since this call to syncfs() fails, xfs_scrub ends up returning
> without performing consistency checks on the test filesystem. This can mask a
> possible on-disk data structure corruption.
This explanation for why we're calling syncfs before invoking scrub
ought to be captured in a comment preceeding the syncfs call.
--D
> To fix the above stated problem, this commit invokes syncfs() prior to
> executing xfs_scrub.
>
> Suggested-by: Darrick J. Wong <djwong@kernel.org>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
> ---
> common/xfs | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/common/xfs b/common/xfs
> index 2156749d..7ec89492 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -467,6 +467,7 @@ _check_xfs_filesystem()
> # Run online scrub if we can.
> mntpt="$(_is_dev_mounted $device)"
> if [ -n "$mntpt" ] && _supports_xfs_scrub "$mntpt" "$device"; then
> + $XFS_IO_PROG -c syncfs $mntpt >> $seqres.full 2>&1
> "$XFS_SCRUB_PROG" $scrubflag -v -d -n $mntpt > $tmp.scrub 2>&1
> if [ $? -ne 0 ]; then
> _log_err "_check_xfs_filesystem: filesystem on $device failed scrub"
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 02/13] common/xfs: Add a helper to get an inode fork's extent count
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
2021-03-08 15:50 ` [PATCH V5 01/13] _check_xfs_filesystem: sync fs before running scrub Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 17:52 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 03/13] common/xfs: Add helper to obtain fsxattr field value Chandan Babu R
` (10 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This commit adds the helper _scratch_get_iext_count() which returns an
inode fork's extent count.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
common/xfs | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/common/xfs b/common/xfs
index 7ec89492..f0ae321e 100644
--- a/common/xfs
+++ b/common/xfs
@@ -914,6 +914,29 @@ _scratch_get_bmx_prefix() {
return 1
}
+_scratch_get_iext_count()
+{
+ local ino=$1
+ local whichfork=$2
+ local nextents=0
+ local field=""
+
+ case $whichfork in
+ "attr")
+ field=core.naextents
+ ;;
+ "data")
+ field=core.nextents
+ ;;
+ *)
+ return 1
+ esac
+
+ nextents=$(_scratch_xfs_get_metadata_field $field "inode $ino")
+
+ echo $nextents
+}
+
#
# Ensures that we don't pass any mount options incompatible with XFS v4
#
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 02/13] common/xfs: Add a helper to get an inode fork's extent count
2021-03-08 15:51 ` [PATCH V5 02/13] common/xfs: Add a helper to get an inode fork's extent count Chandan Babu R
@ 2021-03-08 17:52 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 17:52 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:00PM +0530, Chandan Babu R wrote:
> This commit adds the helper _scratch_get_iext_count() which returns an
> inode fork's extent count.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
> ---
> common/xfs | 23 +++++++++++++++++++++++
> 1 file changed, 23 insertions(+)
>
> diff --git a/common/xfs b/common/xfs
> index 7ec89492..f0ae321e 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -914,6 +914,29 @@ _scratch_get_bmx_prefix() {
> return 1
> }
>
> +_scratch_get_iext_count()
> +{
> + local ino=$1
> + local whichfork=$2
> + local nextents=0
> + local field=""
> +
> + case $whichfork in
> + "attr")
> + field=core.naextents
> + ;;
> + "data")
> + field=core.nextents
> + ;;
> + *)
> + return 1
> + esac
> +
> + nextents=$(_scratch_xfs_get_metadata_field $field "inode $ino")
> +
> + echo $nextents
Any reason why you capture the contents into a variable and then echo
the variable a line later? You could omit all that and just end with
the get_metadata_field call.
--D
> +}
> +
> #
> # Ensures that we don't pass any mount options incompatible with XFS v4
> #
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 03/13] common/xfs: Add helper to obtain fsxattr field value
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
2021-03-08 15:50 ` [PATCH V5 01/13] _check_xfs_filesystem: sync fs before running scrub Chandan Babu R
2021-03-08 15:51 ` [PATCH V5 02/13] common/xfs: Add a helper to get an inode fork's extent count Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 17:53 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 04/13] xfs: Check for extent overflow when trivally adding a new extent Chandan Babu R
` (9 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This commit adds a helper function to obtain the value of a particular field
of an inode's fsxattr fields.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
common/xfs | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/common/xfs b/common/xfs
index f0ae321e..9a0ab484 100644
--- a/common/xfs
+++ b/common/xfs
@@ -194,6 +194,18 @@ _xfs_get_file_block_size()
$XFS_INFO_PROG "$path" | grep realtime | sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g'
}
+xfs_get_fsxattr()
+{
+ local field="$1"
+ local path="$2"
+ local value=""
+
+ value=$($XFS_IO_PROG -c "stat" "$path" | grep "$field")
+ value=${value##fsxattr.${field} = }
+
+ echo "$value"
+}
+
# xfs_check script is planned to be deprecated. But, we want to
# be able to invoke "xfs_check" behavior in xfstests in order to
# maintain the current verification levels.
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 03/13] common/xfs: Add helper to obtain fsxattr field value
2021-03-08 15:51 ` [PATCH V5 03/13] common/xfs: Add helper to obtain fsxattr field value Chandan Babu R
@ 2021-03-08 17:53 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 17:53 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:01PM +0530, Chandan Babu R wrote:
> This commit adds a helper function to obtain the value of a particular field
> of an inode's fsxattr fields.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
> ---
> common/xfs | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/common/xfs b/common/xfs
> index f0ae321e..9a0ab484 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -194,6 +194,18 @@ _xfs_get_file_block_size()
> $XFS_INFO_PROG "$path" | grep realtime | sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g'
> }
>
> +xfs_get_fsxattr()
Shared helpers always begin with an underscore, e.g.
_xfs_get_fsxattr()
> +{
> + local field="$1"
> + local path="$2"
> + local value=""
> +
> + value=$($XFS_IO_PROG -c "stat" "$path" | grep "$field")
> + value=${value##fsxattr.${field} = }
> +
> + echo "$value"
This could be streamlined to:
local value=$($XFS_IO_PROG -c "stat" "$path" | grep "$field")
echo "${value##fsxattr.${field} = }"
Right?
--D
> +}
> +
> # xfs_check script is planned to be deprecated. But, we want to
> # be able to invoke "xfs_check" behavior in xfstests in order to
> # maintain the current verification levels.
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 04/13] xfs: Check for extent overflow when trivally adding a new extent
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (2 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 03/13] common/xfs: Add helper to obtain fsxattr field value Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:08 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 05/13] xfs: Check for extent overflow when growing realtime bitmap/summary inodes Chandan Babu R
` (8 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when adding a single extent while there's no possibility of splitting
an existing mapping.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/528 | 171 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/528.out | 20 ++++++
tests/xfs/group | 1 +
3 files changed, 192 insertions(+)
create mode 100755 tests/xfs/528
create mode 100644 tests/xfs/528.out
diff --git a/tests/xfs/528 b/tests/xfs/528
new file mode 100755
index 00000000..5eb1021a
--- /dev/null
+++ b/tests/xfs/528
@@ -0,0 +1,171 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 528
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# adding a single extent while there's no possibility of splitting an existing
+# mapping.
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/quota
+. ./common/inject
+. ./common/populate
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_quota
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_command "falloc"
+_require_xfs_io_error_injection "reduce_max_iextents"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full
+_scratch_mount -o uquota >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+
+echo "* Delalloc to written extent conversion"
+
+testfile=$SCRATCH_MNT/testfile
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+nr_blks=$((15 * 2))
+
+echo "Create fragmented file"
+for i in $(seq 0 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -s -c "pwrite $((i * bsize)) $bsize" $testfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+echo "Verify \$testfile's extent count"
+
+nextents=$(xfs_get_fsxattr nextents $testfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm $testfile
+
+echo "* Fallocate unwritten extents"
+
+echo "Fallocate fragmented file"
+for i in $(seq 0 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -c "falloc $((i * bsize)) $bsize" $testfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+echo "Verify \$testfile's extent count"
+
+nextents=$(xfs_get_fsxattr nextents $testfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm $testfile
+
+echo "* Directio write"
+
+echo "Create fragmented file via directio writes"
+for i in $(seq 0 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -d -s -f -c "pwrite $((i * bsize)) $bsize" $testfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+echo "Verify \$testfile's extent count"
+
+nextents=$(xfs_get_fsxattr nextents $testfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm $testfile
+
+# Check if XFS gracefully returns with an error code when we try to increase
+# extent count of user quota inode beyond the pseudo max extent count limit.
+echo "* Extend quota inodes"
+
+echo "Disable reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 0
+
+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 reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Inject bmap_alloc_minlen_extent error tag"
+_scratch_inject_error bmap_alloc_minlen_extent 1
+
+nr_blks=20
+
+# This is a rough calculation; It doesn't take block headers into
+# consideration.
+# gdb -batch vmlinux -ex 'print sizeof(struct xfs_dqblk)'
+# $1 = 136
+nr_quotas_per_block=$((bsize / 136))
+nr_quotas=$((nr_quotas_per_block * nr_blks))
+
+echo "Extend uquota file"
+for i in $(seq 0 $nr_quotas_per_block $nr_quotas); do
+ chown $i $testfile >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+_scratch_unmount >> $seqres.full
+
+echo "Verify uquota inode's extent count"
+uquotino=$(_scratch_xfs_get_metadata_field 'uquotino' 'sb 0')
+
+nextents=$(_scratch_get_iext_count $uquotino data || \
+ _fail "Unable to obtain inode fork's extent count")
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/528.out b/tests/xfs/528.out
new file mode 100644
index 00000000..3973cc15
--- /dev/null
+++ b/tests/xfs/528.out
@@ -0,0 +1,20 @@
+QA output created by 528
+Format and mount fs
+* Delalloc to written extent conversion
+Inject reduce_max_iextents error tag
+Create fragmented file
+Verify $testfile's extent count
+* Fallocate unwritten extents
+Fallocate fragmented file
+Verify $testfile's extent count
+* Directio write
+Create fragmented file via directio writes
+Verify $testfile's extent count
+* Extend quota inodes
+Disable reduce_max_iextents error tag
+Consume free space
+Create fragmented filesystem
+Inject reduce_max_iextents error tag
+Inject bmap_alloc_minlen_extent error tag
+Extend uquota file
+Verify uquota inode's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index e861cec9..2356c4a9 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -525,3 +525,4 @@
525 auto quick mkfs
526 auto quick mkfs
527 auto quick quota
+528 auto quick quota
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 04/13] xfs: Check for extent overflow when trivally adding a new extent
2021-03-08 15:51 ` [PATCH V5 04/13] xfs: Check for extent overflow when trivally adding a new extent Chandan Babu R
@ 2021-03-08 18:08 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:08 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:02PM +0530, Chandan Babu R wrote:
> This test verifies that XFS does not cause inode fork's extent count to
> overflow when adding a single extent while there's no possibility of splitting
> an existing mapping.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Looks ok,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> tests/xfs/528 | 171 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/528.out | 20 ++++++
> tests/xfs/group | 1 +
> 3 files changed, 192 insertions(+)
> create mode 100755 tests/xfs/528
> create mode 100644 tests/xfs/528.out
>
> diff --git a/tests/xfs/528 b/tests/xfs/528
> new file mode 100755
> index 00000000..5eb1021a
> --- /dev/null
> +++ b/tests/xfs/528
> @@ -0,0 +1,171 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 528
> +#
> +# Verify that XFS does not cause inode fork's extent count to overflow when
> +# adding a single extent while there's no possibility of splitting an existing
> +# mapping.
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/quota
> +. ./common/inject
> +. ./common/populate
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +_require_scratch
> +_require_xfs_quota
> +_require_xfs_debug
> +_require_test_program "punch-alternating"
> +_require_xfs_io_command "falloc"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
> +
> +echo "Format and mount fs"
> +_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full
> +_scratch_mount -o uquota >> $seqres.full
> +
> +bsize=$(_get_file_block_size $SCRATCH_MNT)
> +
> +echo "* Delalloc to written extent conversion"
> +
> +testfile=$SCRATCH_MNT/testfile
> +
> +echo "Inject reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +nr_blks=$((15 * 2))
> +
> +echo "Create fragmented file"
> +for i in $(seq 0 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -f -s -c "pwrite $((i * bsize)) $bsize" $testfile \
> + >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +echo "Verify \$testfile's extent count"
> +
> +nextents=$(xfs_get_fsxattr nextents $testfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm $testfile
> +
> +echo "* Fallocate unwritten extents"
> +
> +echo "Fallocate fragmented file"
> +for i in $(seq 0 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -f -c "falloc $((i * bsize)) $bsize" $testfile \
> + >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +echo "Verify \$testfile's extent count"
> +
> +nextents=$(xfs_get_fsxattr nextents $testfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm $testfile
> +
> +echo "* Directio write"
> +
> +echo "Create fragmented file via directio writes"
> +for i in $(seq 0 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -d -s -f -c "pwrite $((i * bsize)) $bsize" $testfile \
> + >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +echo "Verify \$testfile's extent count"
> +
> +nextents=$(xfs_get_fsxattr nextents $testfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm $testfile
> +
> +# Check if XFS gracefully returns with an error code when we try to increase
> +# extent count of user quota inode beyond the pseudo max extent count limit.
> +echo "* Extend quota inodes"
> +
> +echo "Disable reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 0
> +
> +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 reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +echo "Inject bmap_alloc_minlen_extent error tag"
> +_scratch_inject_error bmap_alloc_minlen_extent 1
> +
> +nr_blks=20
> +
> +# This is a rough calculation; It doesn't take block headers into
> +# consideration.
> +# gdb -batch vmlinux -ex 'print sizeof(struct xfs_dqblk)'
> +# $1 = 136
> +nr_quotas_per_block=$((bsize / 136))
> +nr_quotas=$((nr_quotas_per_block * nr_blks))
> +
> +echo "Extend uquota file"
> +for i in $(seq 0 $nr_quotas_per_block $nr_quotas); do
> + chown $i $testfile >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +_scratch_unmount >> $seqres.full
> +
> +echo "Verify uquota inode's extent count"
> +uquotino=$(_scratch_xfs_get_metadata_field 'uquotino' 'sb 0')
> +
> +nextents=$(_scratch_get_iext_count $uquotino data || \
> + _fail "Unable to obtain inode fork's extent count")
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/528.out b/tests/xfs/528.out
> new file mode 100644
> index 00000000..3973cc15
> --- /dev/null
> +++ b/tests/xfs/528.out
> @@ -0,0 +1,20 @@
> +QA output created by 528
> +Format and mount fs
> +* Delalloc to written extent conversion
> +Inject reduce_max_iextents error tag
> +Create fragmented file
> +Verify $testfile's extent count
> +* Fallocate unwritten extents
> +Fallocate fragmented file
> +Verify $testfile's extent count
> +* Directio write
> +Create fragmented file via directio writes
> +Verify $testfile's extent count
> +* Extend quota inodes
> +Disable reduce_max_iextents error tag
> +Consume free space
> +Create fragmented filesystem
> +Inject reduce_max_iextents error tag
> +Inject bmap_alloc_minlen_extent error tag
> +Extend uquota file
> +Verify uquota inode's extent count
> diff --git a/tests/xfs/group b/tests/xfs/group
> index e861cec9..2356c4a9 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -525,3 +525,4 @@
> 525 auto quick mkfs
> 526 auto quick mkfs
> 527 auto quick quota
> +528 auto quick quota
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 05/13] xfs: Check for extent overflow when growing realtime bitmap/summary inodes
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (3 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 04/13] xfs: Check for extent overflow when trivally adding a new extent Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:10 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 06/13] xfs: Check for extent overflow when punching a hole Chandan Babu R
` (7 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
Verify that XFS does not cause realtime bitmap/summary inode fork's
extent count to overflow when growing the realtime volume associated
with a filesystem.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/529 | 124 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/529.out | 11 ++++
tests/xfs/group | 1 +
3 files changed, 136 insertions(+)
create mode 100755 tests/xfs/529
create mode 100644 tests/xfs/529.out
diff --git a/tests/xfs/529 b/tests/xfs/529
new file mode 100755
index 00000000..dd7019f5
--- /dev/null
+++ b/tests/xfs/529
@@ -0,0 +1,124 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 529
+#
+# Verify that XFS does not cause bitmap/summary inode fork's extent count to
+# overflow when growing an the realtime volume of the filesystem.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ _scratch_unmount >> $seqres.full 2>&1
+ test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
+ rm -f $tmp.* $TEST_DIR/$seq.rtvol
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+. ./common/populate
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+# Note that we don't _require_realtime because we synthesize a rt volume
+# below.
+_require_test
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_error_injection "reduce_max_iextents"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+_require_scratch_nocheck
+
+echo "* Test extending rt inodes"
+
+_scratch_mkfs | _filter_mkfs >> $seqres.full 2> $tmp.mkfs
+. $tmp.mkfs
+
+echo "Create fake rt volume"
+nr_bitmap_blks=25
+nr_bits=$((nr_bitmap_blks * dbsize * 8))
+
+# Realtime extent size has to be atleast 4k in size.
+if (( $dbsize < 4096 )); then
+ rtextsz=4096
+else
+ rtextsz=$dbsize
+fi
+
+rtdevsz=$((nr_bits * rtextsz))
+truncate -s $rtdevsz $TEST_DIR/$seq.rtvol
+rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
+
+echo "Format and mount rt volume"
+
+export USE_EXTERNAL=yes
+export SCRATCH_RTDEV=$rtdev
+_scratch_mkfs -d size=$((1024 * 1024 * 1024)) -b size=${dbsize} \
+ -r size=${rtextsz},extsize=${rtextsz} >> $seqres.full
+_try_scratch_mount || _notrun "Couldn't mount fs with synthetic rt volume"
+
+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 $((dbsize * nr_free_blks)) $fillerdir $dbsize 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 reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Inject bmap_alloc_minlen_extent error tag"
+_scratch_inject_error bmap_alloc_minlen_extent 1
+
+echo "Grow realtime volume"
+$XFS_GROWFS_PROG -r $SCRATCH_MNT >> $seqres.full 2>&1
+if [[ $? == 0 ]]; then
+ echo "Growfs succeeded; should have failed."
+ exit 1
+fi
+
+_scratch_unmount >> $seqres.full
+
+echo "Verify rbmino's and rsumino's extent count"
+for rtino in rbmino rsumino; do
+ ino=$(_scratch_xfs_get_metadata_field $rtino "sb 0")
+ echo "$rtino = $ino" >> $seqres.full
+
+ nextents=$(_scratch_get_iext_count $ino data || \
+ _fail "Unable to obtain inode fork's extent count")
+ if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+ fi
+done
+
+echo "Check filesystem"
+_check_xfs_filesystem $SCRATCH_DEV none $rtdev
+
+losetup -d $rtdev
+rm -f $TEST_DIR/$seq.rtvol
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/529.out b/tests/xfs/529.out
new file mode 100644
index 00000000..4ee113a4
--- /dev/null
+++ b/tests/xfs/529.out
@@ -0,0 +1,11 @@
+QA output created by 529
+* Test extending rt inodes
+Create fake rt volume
+Format and mount rt volume
+Consume free space
+Create fragmented filesystem
+Inject reduce_max_iextents error tag
+Inject bmap_alloc_minlen_extent error tag
+Grow realtime volume
+Verify rbmino's and rsumino's extent count
+Check filesystem
diff --git a/tests/xfs/group b/tests/xfs/group
index 2356c4a9..5dff7acb 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -526,3 +526,4 @@
526 auto quick mkfs
527 auto quick quota
528 auto quick quota
+529 auto quick realtime growfs
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 05/13] xfs: Check for extent overflow when growing realtime bitmap/summary inodes
2021-03-08 15:51 ` [PATCH V5 05/13] xfs: Check for extent overflow when growing realtime bitmap/summary inodes Chandan Babu R
@ 2021-03-08 18:10 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:10 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:03PM +0530, Chandan Babu R wrote:
> Verify that XFS does not cause realtime bitmap/summary inode fork's
> extent count to overflow when growing the realtime volume associated
> with a filesystem.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Looks good to me,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> tests/xfs/529 | 124 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/529.out | 11 ++++
> tests/xfs/group | 1 +
> 3 files changed, 136 insertions(+)
> create mode 100755 tests/xfs/529
> create mode 100644 tests/xfs/529.out
>
> diff --git a/tests/xfs/529 b/tests/xfs/529
> new file mode 100755
> index 00000000..dd7019f5
> --- /dev/null
> +++ b/tests/xfs/529
> @@ -0,0 +1,124 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 529
> +#
> +# Verify that XFS does not cause bitmap/summary inode fork's extent count to
> +# overflow when growing an the realtime volume of the filesystem.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + _scratch_unmount >> $seqres.full 2>&1
> + test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
> + rm -f $tmp.* $TEST_DIR/$seq.rtvol
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/inject
> +. ./common/populate
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +# Note that we don't _require_realtime because we synthesize a rt volume
> +# below.
> +_require_test
> +_require_xfs_debug
> +_require_test_program "punch-alternating"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
> +_require_scratch_nocheck
> +
> +echo "* Test extending rt inodes"
> +
> +_scratch_mkfs | _filter_mkfs >> $seqres.full 2> $tmp.mkfs
> +. $tmp.mkfs
> +
> +echo "Create fake rt volume"
> +nr_bitmap_blks=25
> +nr_bits=$((nr_bitmap_blks * dbsize * 8))
> +
> +# Realtime extent size has to be atleast 4k in size.
> +if (( $dbsize < 4096 )); then
> + rtextsz=4096
> +else
> + rtextsz=$dbsize
> +fi
> +
> +rtdevsz=$((nr_bits * rtextsz))
> +truncate -s $rtdevsz $TEST_DIR/$seq.rtvol
> +rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> +
> +echo "Format and mount rt volume"
> +
> +export USE_EXTERNAL=yes
> +export SCRATCH_RTDEV=$rtdev
> +_scratch_mkfs -d size=$((1024 * 1024 * 1024)) -b size=${dbsize} \
> + -r size=${rtextsz},extsize=${rtextsz} >> $seqres.full
> +_try_scratch_mount || _notrun "Couldn't mount fs with synthetic rt volume"
> +
> +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 $((dbsize * nr_free_blks)) $fillerdir $dbsize 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 reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +echo "Inject bmap_alloc_minlen_extent error tag"
> +_scratch_inject_error bmap_alloc_minlen_extent 1
> +
> +echo "Grow realtime volume"
> +$XFS_GROWFS_PROG -r $SCRATCH_MNT >> $seqres.full 2>&1
> +if [[ $? == 0 ]]; then
> + echo "Growfs succeeded; should have failed."
> + exit 1
> +fi
> +
> +_scratch_unmount >> $seqres.full
> +
> +echo "Verify rbmino's and rsumino's extent count"
> +for rtino in rbmino rsumino; do
> + ino=$(_scratch_xfs_get_metadata_field $rtino "sb 0")
> + echo "$rtino = $ino" >> $seqres.full
> +
> + nextents=$(_scratch_get_iext_count $ino data || \
> + _fail "Unable to obtain inode fork's extent count")
> + if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> + fi
> +done
> +
> +echo "Check filesystem"
> +_check_xfs_filesystem $SCRATCH_DEV none $rtdev
> +
> +losetup -d $rtdev
> +rm -f $TEST_DIR/$seq.rtvol
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/529.out b/tests/xfs/529.out
> new file mode 100644
> index 00000000..4ee113a4
> --- /dev/null
> +++ b/tests/xfs/529.out
> @@ -0,0 +1,11 @@
> +QA output created by 529
> +* Test extending rt inodes
> +Create fake rt volume
> +Format and mount rt volume
> +Consume free space
> +Create fragmented filesystem
> +Inject reduce_max_iextents error tag
> +Inject bmap_alloc_minlen_extent error tag
> +Grow realtime volume
> +Verify rbmino's and rsumino's extent count
> +Check filesystem
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 2356c4a9..5dff7acb 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -526,3 +526,4 @@
> 526 auto quick mkfs
> 527 auto quick quota
> 528 auto quick quota
> +529 auto quick realtime growfs
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 06/13] xfs: Check for extent overflow when punching a hole
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (4 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 05/13] xfs: Check for extent overflow when growing realtime bitmap/summary inodes Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 15:51 ` [PATCH V5 07/13] xfs: Check for extent overflow when adding/removing xattrs Chandan Babu R
` (6 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when punching out an extent.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/530 | 83 +++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/530.out | 19 +++++++++++
tests/xfs/group | 1 +
3 files changed, 103 insertions(+)
create mode 100755 tests/xfs/530
create mode 100644 tests/xfs/530.out
diff --git a/tests/xfs/530 b/tests/xfs/530
new file mode 100755
index 00000000..33a074bc
--- /dev/null
+++ b/tests/xfs/530
@@ -0,0 +1,83 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 530
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# punching out an extent.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_xfs_io_command "fpunch"
+_require_xfs_io_command "finsert"
+_require_xfs_io_command "fcollapse"
+_require_xfs_io_command "fzero"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "Format and mount fs"
+_scratch_mkfs >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+nr_blks=30
+
+testfile=$SCRATCH_MNT/testfile
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+for op in fpunch finsert fcollapse fzero; do
+ echo "* $op regular file"
+
+ echo "Create \$testfile"
+ $XFS_IO_PROG -f -s \
+ -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
+ $testfile >> $seqres.full
+
+ echo "$op alternating blocks"
+ for i in $(seq 1 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -c "$op $((i * bsize)) $bsize" $testfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+ done
+
+ echo "Verify \$testfile's extent count"
+
+ nextents=$(xfs_get_fsxattr nextents $testfile)
+ if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+ fi
+
+ rm $testfile
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/530.out b/tests/xfs/530.out
new file mode 100644
index 00000000..4df2d9d0
--- /dev/null
+++ b/tests/xfs/530.out
@@ -0,0 +1,19 @@
+QA output created by 530
+Format and mount fs
+Inject reduce_max_iextents error tag
+* fpunch regular file
+Create $testfile
+fpunch alternating blocks
+Verify $testfile's extent count
+* finsert regular file
+Create $testfile
+finsert alternating blocks
+Verify $testfile's extent count
+* fcollapse regular file
+Create $testfile
+fcollapse alternating blocks
+Verify $testfile's extent count
+* fzero regular file
+Create $testfile
+fzero alternating blocks
+Verify $testfile's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index 5dff7acb..463d810d 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -527,3 +527,4 @@
527 auto quick quota
528 auto quick quota
529 auto quick realtime growfs
+530 auto quick punch zero insert collapse
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH V5 07/13] xfs: Check for extent overflow when adding/removing xattrs
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (5 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 06/13] xfs: Check for extent overflow when punching a hole Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 15:51 ` [PATCH V5 08/13] xfs: Check for extent overflow when adding/removing dir entries Chandan Babu R
` (5 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when adding/removing xattrs.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/531 | 139 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/531.out | 18 ++++++
tests/xfs/group | 1 +
3 files changed, 158 insertions(+)
create mode 100755 tests/xfs/531
create mode 100644 tests/xfs/531.out
diff --git a/tests/xfs/531 b/tests/xfs/531
new file mode 100755
index 00000000..a487318f
--- /dev/null
+++ b/tests/xfs/531
@@ -0,0 +1,139 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 531
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# adding/removing xattrs.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/attr
+. ./common/inject
+. ./common/populate
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_attrs
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_error_injection "reduce_max_iextents"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_block_size $SCRATCH_MNT)
+
+attr_len=255
+
+testfile=$SCRATCH_MNT/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 reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Inject bmap_alloc_minlen_extent error tag"
+_scratch_inject_error bmap_alloc_minlen_extent 1
+
+echo "* Set xattrs"
+
+echo "Create \$testfile"
+touch $testfile
+
+echo "Create xattrs"
+nr_attrs=$((bsize * 20 / 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
+
+echo "Verify \$testfile's naextent count"
+
+naextents=$(xfs_get_fsxattr naextents $testfile)
+if (( $naextents > 10 )); then
+ echo "Extent count overflow check failed: naextents = $naextents"
+ exit 1
+fi
+
+echo "Remove \$testfile"
+rm $testfile
+
+echo "* Remove xattrs"
+
+echo "Create \$testfile"
+touch $testfile
+
+echo "Disable reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 0
+
+echo "Create initial xattr extents"
+
+naextents=0
+last=""
+start=1
+nr_attrs=$((bsize / attr_len))
+
+while (( $naextents < 4 )); do
+ end=$((start + nr_attrs - 1))
+
+ for i in $(seq $start $end); do
+ attr="$(printf "trusted.%0247d" $i)"
+ $SETFATTR_PROG -n $attr $testfile
+ done
+
+ start=$((end + 1))
+
+ naextents=$(xfs_get_fsxattr naextents $testfile)
+done
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Remove xattr to trigger -EFBIG"
+attr="$(printf "trusted.%0247d" 1)"
+$SETFATTR_PROG -x "$attr" $testfile >> $seqres.full 2>&1
+if [[ $? == 0 ]]; then
+ echo "Xattr removal succeeded; Should have failed "
+ exit 1
+fi
+
+rm $testfile && echo "Successfully removed \$testfile"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/531.out b/tests/xfs/531.out
new file mode 100644
index 00000000..7b699b7a
--- /dev/null
+++ b/tests/xfs/531.out
@@ -0,0 +1,18 @@
+QA output created by 531
+Format and mount fs
+Consume free space
+Create fragmented filesystem
+Inject reduce_max_iextents error tag
+Inject bmap_alloc_minlen_extent error tag
+* Set xattrs
+Create $testfile
+Create xattrs
+Verify $testfile's naextent count
+Remove $testfile
+* Remove xattrs
+Create $testfile
+Disable reduce_max_iextents error tag
+Create initial xattr extents
+Inject reduce_max_iextents error tag
+Remove xattr to trigger -EFBIG
+Successfully removed $testfile
diff --git a/tests/xfs/group b/tests/xfs/group
index 463d810d..7e284841 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -528,3 +528,4 @@
528 auto quick quota
529 auto quick realtime growfs
530 auto quick punch zero insert collapse
+531 auto quick attr
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH V5 08/13] xfs: Check for extent overflow when adding/removing dir entries
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (6 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 07/13] xfs: Check for extent overflow when adding/removing xattrs Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:15 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 09/13] xfs: Check for extent overflow when writing to unwritten extent Chandan Babu R
` (4 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when adding/removing directory entries.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/532 | 182 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/532.out | 17 +++++
tests/xfs/group | 1 +
3 files changed, 200 insertions(+)
create mode 100755 tests/xfs/532
create mode 100644 tests/xfs/532.out
diff --git a/tests/xfs/532 b/tests/xfs/532
new file mode 100755
index 00000000..235b60b5
--- /dev/null
+++ b/tests/xfs/532
@@ -0,0 +1,182 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 532
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# adding/removing directory entries.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+. ./common/populate
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_error_injection "reduce_max_iextents"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) | _filter_mkfs >> $seqres.full 2> $tmp.mkfs
+. $tmp.mkfs
+
+# Filesystems with directory block size greater than one FSB will not be tested,
+# since "7 (i.e. XFS_DA_NODE_MAXDEPTH + 1 data block + 1 free block) * 2 (fsb
+# count) = 14" is greater than the pseudo max extent count limit of 10.
+# Extending the pseudo max limit won't help either. Consider the case where 1
+# FSB is 1k in size and 1 dir block is 64k in size (i.e. fsb count = 64). In
+# this case, the pseudo max limit has to be greater than 7 * 64 = 448 extents.
+if (( $dirbsize > $dbsize )); then
+ _notrun "Directory block size ($dirbsize) is larger than FSB size ($dbsize)"
+fi
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+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 $((dbsize * nr_free_blks)) $fillerdir $dbsize 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 reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Inject bmap_alloc_minlen_extent error tag"
+_scratch_inject_error bmap_alloc_minlen_extent 1
+
+dent_len=255
+
+echo "* Create directory entries"
+
+testdir=$SCRATCH_MNT/testdir
+mkdir $testdir
+
+nr_dents=$((dbsize * 20 / dent_len))
+for i in $(seq 1 $nr_dents); do
+ dentry="$(printf "%0255d" $i)"
+ touch ${testdir}/$dentry >> $seqres.full 2>&1 || break
+done
+
+echo "Verify directory's extent count"
+nextents=$(xfs_get_fsxattr nextents $testdir)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm -rf $testdir
+
+echo "* Rename: Populate destination directory"
+
+dstdir=$SCRATCH_MNT/dstdir
+mkdir $dstdir
+
+nr_dents=$((dirbsize * 20 / dent_len))
+
+echo "Populate \$dstdir by moving new directory entries"
+for i in $(seq 1 $nr_dents); do
+ dentry="$(printf "%0255d" $i)"
+ dentry=${SCRATCH_MNT}/${dentry}
+ touch $dentry || break
+ mv $dentry $dstdir >> $seqres.full 2>&1 || break
+done
+
+rm $dentry
+
+echo "Verify \$dstdir's extent count"
+
+nextents=$(xfs_get_fsxattr nextents $dstdir)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm -rf $dstdir
+
+echo "* Create multiple hard links to a single file"
+
+testdir=$SCRATCH_MNT/testdir
+mkdir $testdir
+
+testfile=$SCRATCH_MNT/testfile
+touch $testfile
+
+nr_dents=$((dirbsize * 20 / dent_len))
+
+echo "Create multiple hardlinks"
+for i in $(seq 1 $nr_dents); do
+ dentry="$(printf "%0255d" $i)"
+ ln $testfile ${testdir}/${dentry} >> $seqres.full 2>&1 || break
+done
+
+rm $testfile
+
+echo "Verify directory's extent count"
+nextents=$(xfs_get_fsxattr nextents $testdir)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm -rf $testdir
+
+echo "* Create multiple symbolic links to a single file"
+
+testdir=$SCRATCH_MNT/testdir
+mkdir $testdir
+
+testfile=$SCRATCH_MNT/testfile
+touch $testfile
+
+nr_dents=$((dirbsize * 20 / dent_len))
+
+echo "Create multiple symbolic links"
+for i in $(seq 1 $nr_dents); do
+ dentry="$(printf "%0255d" $i)"
+ ln -s $testfile ${testdir}/${dentry} >> $seqres.full 2>&1 || break;
+done
+
+rm $testfile
+
+echo "Verify directory's extent count"
+nextents=$(xfs_get_fsxattr nextents $testdir)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm -rf $testdir
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/532.out b/tests/xfs/532.out
new file mode 100644
index 00000000..2766c211
--- /dev/null
+++ b/tests/xfs/532.out
@@ -0,0 +1,17 @@
+QA output created by 532
+Format and mount fs
+Consume free space
+Create fragmented filesystem
+Inject reduce_max_iextents error tag
+Inject bmap_alloc_minlen_extent error tag
+* Create directory entries
+Verify directory's extent count
+* Rename: Populate destination directory
+Populate $dstdir by moving new directory entries
+Verify $dstdir's extent count
+* Create multiple hard links to a single file
+Create multiple hardlinks
+Verify directory's extent count
+* Create multiple symbolic links to a single file
+Create multiple symbolic links
+Verify directory's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index 7e284841..77abeefa 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -529,3 +529,4 @@
529 auto quick realtime growfs
530 auto quick punch zero insert collapse
531 auto quick attr
+532 auto quick dir hardlink symlink
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 08/13] xfs: Check for extent overflow when adding/removing dir entries
2021-03-08 15:51 ` [PATCH V5 08/13] xfs: Check for extent overflow when adding/removing dir entries Chandan Babu R
@ 2021-03-08 18:15 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:15 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:06PM +0530, Chandan Babu R wrote:
> This test verifies that XFS does not cause inode fork's extent count to
> overflow when adding/removing directory entries.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Looks reasonable,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> tests/xfs/532 | 182 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/532.out | 17 +++++
> tests/xfs/group | 1 +
> 3 files changed, 200 insertions(+)
> create mode 100755 tests/xfs/532
> create mode 100644 tests/xfs/532.out
>
> diff --git a/tests/xfs/532 b/tests/xfs/532
> new file mode 100755
> index 00000000..235b60b5
> --- /dev/null
> +++ b/tests/xfs/532
> @@ -0,0 +1,182 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 532
> +#
> +# Verify that XFS does not cause inode fork's extent count to overflow when
> +# adding/removing directory entries.
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/inject
> +. ./common/populate
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +_require_scratch
> +_require_xfs_debug
> +_require_test_program "punch-alternating"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
> +
> +_scratch_mkfs_sized $((1024 * 1024 * 1024)) | _filter_mkfs >> $seqres.full 2> $tmp.mkfs
> +. $tmp.mkfs
> +
> +# Filesystems with directory block size greater than one FSB will not be tested,
> +# since "7 (i.e. XFS_DA_NODE_MAXDEPTH + 1 data block + 1 free block) * 2 (fsb
> +# count) = 14" is greater than the pseudo max extent count limit of 10.
> +# Extending the pseudo max limit won't help either. Consider the case where 1
> +# FSB is 1k in size and 1 dir block is 64k in size (i.e. fsb count = 64). In
> +# this case, the pseudo max limit has to be greater than 7 * 64 = 448 extents.
> +if (( $dirbsize > $dbsize )); then
> + _notrun "Directory block size ($dirbsize) is larger than FSB size ($dbsize)"
> +fi
> +
> +echo "Format and mount fs"
> +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +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 $((dbsize * nr_free_blks)) $fillerdir $dbsize 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 reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +echo "Inject bmap_alloc_minlen_extent error tag"
> +_scratch_inject_error bmap_alloc_minlen_extent 1
> +
> +dent_len=255
> +
> +echo "* Create directory entries"
> +
> +testdir=$SCRATCH_MNT/testdir
> +mkdir $testdir
> +
> +nr_dents=$((dbsize * 20 / dent_len))
> +for i in $(seq 1 $nr_dents); do
> + dentry="$(printf "%0255d" $i)"
> + touch ${testdir}/$dentry >> $seqres.full 2>&1 || break
> +done
> +
> +echo "Verify directory's extent count"
> +nextents=$(xfs_get_fsxattr nextents $testdir)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm -rf $testdir
> +
> +echo "* Rename: Populate destination directory"
> +
> +dstdir=$SCRATCH_MNT/dstdir
> +mkdir $dstdir
> +
> +nr_dents=$((dirbsize * 20 / dent_len))
> +
> +echo "Populate \$dstdir by moving new directory entries"
> +for i in $(seq 1 $nr_dents); do
> + dentry="$(printf "%0255d" $i)"
> + dentry=${SCRATCH_MNT}/${dentry}
> + touch $dentry || break
> + mv $dentry $dstdir >> $seqres.full 2>&1 || break
> +done
> +
> +rm $dentry
> +
> +echo "Verify \$dstdir's extent count"
> +
> +nextents=$(xfs_get_fsxattr nextents $dstdir)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm -rf $dstdir
> +
> +echo "* Create multiple hard links to a single file"
> +
> +testdir=$SCRATCH_MNT/testdir
> +mkdir $testdir
> +
> +testfile=$SCRATCH_MNT/testfile
> +touch $testfile
> +
> +nr_dents=$((dirbsize * 20 / dent_len))
> +
> +echo "Create multiple hardlinks"
> +for i in $(seq 1 $nr_dents); do
> + dentry="$(printf "%0255d" $i)"
> + ln $testfile ${testdir}/${dentry} >> $seqres.full 2>&1 || break
> +done
> +
> +rm $testfile
> +
> +echo "Verify directory's extent count"
> +nextents=$(xfs_get_fsxattr nextents $testdir)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm -rf $testdir
> +
> +echo "* Create multiple symbolic links to a single file"
> +
> +testdir=$SCRATCH_MNT/testdir
> +mkdir $testdir
> +
> +testfile=$SCRATCH_MNT/testfile
> +touch $testfile
> +
> +nr_dents=$((dirbsize * 20 / dent_len))
> +
> +echo "Create multiple symbolic links"
> +for i in $(seq 1 $nr_dents); do
> + dentry="$(printf "%0255d" $i)"
> + ln -s $testfile ${testdir}/${dentry} >> $seqres.full 2>&1 || break;
> +done
> +
> +rm $testfile
> +
> +echo "Verify directory's extent count"
> +nextents=$(xfs_get_fsxattr nextents $testdir)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm -rf $testdir
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/532.out b/tests/xfs/532.out
> new file mode 100644
> index 00000000..2766c211
> --- /dev/null
> +++ b/tests/xfs/532.out
> @@ -0,0 +1,17 @@
> +QA output created by 532
> +Format and mount fs
> +Consume free space
> +Create fragmented filesystem
> +Inject reduce_max_iextents error tag
> +Inject bmap_alloc_minlen_extent error tag
> +* Create directory entries
> +Verify directory's extent count
> +* Rename: Populate destination directory
> +Populate $dstdir by moving new directory entries
> +Verify $dstdir's extent count
> +* Create multiple hard links to a single file
> +Create multiple hardlinks
> +Verify directory's extent count
> +* Create multiple symbolic links to a single file
> +Create multiple symbolic links
> +Verify directory's extent count
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 7e284841..77abeefa 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -529,3 +529,4 @@
> 529 auto quick realtime growfs
> 530 auto quick punch zero insert collapse
> 531 auto quick attr
> +532 auto quick dir hardlink symlink
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 09/13] xfs: Check for extent overflow when writing to unwritten extent
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (7 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 08/13] xfs: Check for extent overflow when adding/removing dir entries Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:16 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 10/13] xfs: Check for extent overflow when moving extent from cow to data fork Chandan Babu R
` (3 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when writing to an unwritten extent.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/533 | 84 +++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/533.out | 11 +++++++
tests/xfs/group | 1 +
3 files changed, 96 insertions(+)
create mode 100755 tests/xfs/533
create mode 100644 tests/xfs/533.out
diff --git a/tests/xfs/533 b/tests/xfs/533
new file mode 100755
index 00000000..af7475f0
--- /dev/null
+++ b/tests/xfs/533
@@ -0,0 +1,84 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 533
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# writing to an unwritten extent.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_xfs_io_command "falloc"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+
+testfile=${SCRATCH_MNT}/testfile
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+nr_blks=15
+
+for io in Buffered Direct; do
+ echo "* $io write to unwritten extent"
+
+ echo "Fallocate $nr_blks blocks"
+ $XFS_IO_PROG -f -c "falloc 0 $((nr_blks * bsize))" $testfile >> $seqres.full
+
+ if [[ $io == "Buffered" ]]; then
+ xfs_io_flag=""
+ else
+ xfs_io_flag="-d"
+ fi
+
+ echo "$io write to every other block of fallocated space"
+ for i in $(seq 1 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -s $xfs_io_flag -c "pwrite $((i * bsize)) $bsize" \
+ $testfile >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+ done
+
+ echo "Verify \$testfile's extent count"
+ nextents=$(xfs_get_fsxattr nextents $testfile)
+ if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+ fi
+
+ rm $testfile
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/533.out b/tests/xfs/533.out
new file mode 100644
index 00000000..5b93964a
--- /dev/null
+++ b/tests/xfs/533.out
@@ -0,0 +1,11 @@
+QA output created by 533
+Format and mount fs
+Inject reduce_max_iextents error tag
+* Buffered write to unwritten extent
+Fallocate 15 blocks
+Buffered write to every other block of fallocated space
+Verify $testfile's extent count
+* Direct write to unwritten extent
+Fallocate 15 blocks
+Direct write to every other block of fallocated space
+Verify $testfile's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index 77abeefa..3ad47d07 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -530,3 +530,4 @@
530 auto quick punch zero insert collapse
531 auto quick attr
532 auto quick dir hardlink symlink
+533 auto quick
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 09/13] xfs: Check for extent overflow when writing to unwritten extent
2021-03-08 15:51 ` [PATCH V5 09/13] xfs: Check for extent overflow when writing to unwritten extent Chandan Babu R
@ 2021-03-08 18:16 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:16 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:07PM +0530, Chandan Babu R wrote:
> This test verifies that XFS does not cause inode fork's extent count to
> overflow when writing to an unwritten extent.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
> ---
Looks fine to me now,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> tests/xfs/533 | 84 +++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/533.out | 11 +++++++
> tests/xfs/group | 1 +
> 3 files changed, 96 insertions(+)
> create mode 100755 tests/xfs/533
> create mode 100644 tests/xfs/533.out
>
> diff --git a/tests/xfs/533 b/tests/xfs/533
> new file mode 100755
> index 00000000..af7475f0
> --- /dev/null
> +++ b/tests/xfs/533
> @@ -0,0 +1,84 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 533
> +#
> +# Verify that XFS does not cause inode fork's extent count to overflow when
> +# writing to an unwritten extent.
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/inject
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +_require_scratch
> +_require_xfs_debug
> +_require_xfs_io_command "falloc"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +
> +echo "Format and mount fs"
> +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +bsize=$(_get_file_block_size $SCRATCH_MNT)
> +
> +testfile=${SCRATCH_MNT}/testfile
> +
> +echo "Inject reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +nr_blks=15
> +
> +for io in Buffered Direct; do
> + echo "* $io write to unwritten extent"
> +
> + echo "Fallocate $nr_blks blocks"
> + $XFS_IO_PROG -f -c "falloc 0 $((nr_blks * bsize))" $testfile >> $seqres.full
> +
> + if [[ $io == "Buffered" ]]; then
> + xfs_io_flag=""
> + else
> + xfs_io_flag="-d"
> + fi
> +
> + echo "$io write to every other block of fallocated space"
> + for i in $(seq 1 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -f -s $xfs_io_flag -c "pwrite $((i * bsize)) $bsize" \
> + $testfile >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> + done
> +
> + echo "Verify \$testfile's extent count"
> + nextents=$(xfs_get_fsxattr nextents $testfile)
> + if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> + fi
> +
> + rm $testfile
> +done
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/533.out b/tests/xfs/533.out
> new file mode 100644
> index 00000000..5b93964a
> --- /dev/null
> +++ b/tests/xfs/533.out
> @@ -0,0 +1,11 @@
> +QA output created by 533
> +Format and mount fs
> +Inject reduce_max_iextents error tag
> +* Buffered write to unwritten extent
> +Fallocate 15 blocks
> +Buffered write to every other block of fallocated space
> +Verify $testfile's extent count
> +* Direct write to unwritten extent
> +Fallocate 15 blocks
> +Direct write to every other block of fallocated space
> +Verify $testfile's extent count
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 77abeefa..3ad47d07 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -530,3 +530,4 @@
> 530 auto quick punch zero insert collapse
> 531 auto quick attr
> 532 auto quick dir hardlink symlink
> +533 auto quick
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 10/13] xfs: Check for extent overflow when moving extent from cow to data fork
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (8 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 09/13] xfs: Check for extent overflow when writing to unwritten extent Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:18 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 11/13] xfs: Check for extent overflow when remapping an extent Chandan Babu R
` (2 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when writing to/funshare-ing a shared extent.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/534 | 104 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/534.out | 12 ++++++
tests/xfs/group | 1 +
3 files changed, 117 insertions(+)
create mode 100755 tests/xfs/534
create mode 100644 tests/xfs/534.out
diff --git a/tests/xfs/534 b/tests/xfs/534
new file mode 100755
index 00000000..c2fa6cb6
--- /dev/null
+++ b/tests/xfs/534
@@ -0,0 +1,104 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 534
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# writing to a shared extent.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_scratch_reflink
+_require_xfs_debug
+_require_xfs_io_command "reflink"
+_require_xfs_io_command "funshare"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_block_size $SCRATCH_MNT)
+
+nr_blks=15
+
+srcfile=${SCRATCH_MNT}/srcfile
+dstfile=${SCRATCH_MNT}/dstfile
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Create a \$srcfile having an extent of length $nr_blks blocks"
+$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
+ -c fsync $srcfile >> $seqres.full
+
+echo "* Write to shared extent"
+
+echo "Share the extent with \$dstfile"
+_reflink $srcfile $dstfile >> $seqres.full
+
+echo "Buffered write to every other block of \$dstfile's shared extent"
+for i in $(seq 1 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -s -c "pwrite $((i * bsize)) $bsize" $dstfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+echo "Verify \$dstfile's extent count"
+nextents=$(xfs_get_fsxattr nextents $dstfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+rm $dstfile
+
+echo "* Funshare shared extent"
+
+echo "Share the extent with \$dstfile"
+_reflink $srcfile $dstfile >> $seqres.full
+
+echo "Funshare every other block of \$dstfile's shared extent"
+for i in $(seq 1 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -s -c "funshare $((i * bsize)) $bsize" $dstfile \
+ >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+done
+
+echo "Verify \$dstfile's extent count"
+nextents=$(xfs_get_fsxattr nextents $dstfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+# success, all done
+status=0
+exit
+
diff --git a/tests/xfs/534.out b/tests/xfs/534.out
new file mode 100644
index 00000000..53288d12
--- /dev/null
+++ b/tests/xfs/534.out
@@ -0,0 +1,12 @@
+QA output created by 534
+Format and mount fs
+Inject reduce_max_iextents error tag
+Create a $srcfile having an extent of length 15 blocks
+* Write to shared extent
+Share the extent with $dstfile
+Buffered write to every other block of $dstfile's shared extent
+Verify $dstfile's extent count
+* Funshare shared extent
+Share the extent with $dstfile
+Funshare every other block of $dstfile's shared extent
+Verify $dstfile's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index 3ad47d07..b4f0c777 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -531,3 +531,4 @@
531 auto quick attr
532 auto quick dir hardlink symlink
533 auto quick
+534 auto quick reflink
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 10/13] xfs: Check for extent overflow when moving extent from cow to data fork
2021-03-08 15:51 ` [PATCH V5 10/13] xfs: Check for extent overflow when moving extent from cow to data fork Chandan Babu R
@ 2021-03-08 18:18 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:18 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:08PM +0530, Chandan Babu R wrote:
> This test verifies that XFS does not cause inode fork's extent count to
> overflow when writing to/funshare-ing a shared extent.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Looks fine,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> tests/xfs/534 | 104 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/534.out | 12 ++++++
> tests/xfs/group | 1 +
> 3 files changed, 117 insertions(+)
> create mode 100755 tests/xfs/534
> create mode 100644 tests/xfs/534.out
>
> diff --git a/tests/xfs/534 b/tests/xfs/534
> new file mode 100755
> index 00000000..c2fa6cb6
> --- /dev/null
> +++ b/tests/xfs/534
> @@ -0,0 +1,104 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 534
> +#
> +# Verify that XFS does not cause inode fork's extent count to overflow when
> +# writing to a shared extent.
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/reflink
> +. ./common/inject
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +_require_scratch
> +_require_scratch_reflink
> +_require_xfs_debug
> +_require_xfs_io_command "reflink"
> +_require_xfs_io_command "funshare"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +
> +echo "Format and mount fs"
> +_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +bsize=$(_get_block_size $SCRATCH_MNT)
> +
> +nr_blks=15
> +
> +srcfile=${SCRATCH_MNT}/srcfile
> +dstfile=${SCRATCH_MNT}/dstfile
> +
> +echo "Inject reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +echo "Create a \$srcfile having an extent of length $nr_blks blocks"
> +$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
> + -c fsync $srcfile >> $seqres.full
> +
> +echo "* Write to shared extent"
> +
> +echo "Share the extent with \$dstfile"
> +_reflink $srcfile $dstfile >> $seqres.full
> +
> +echo "Buffered write to every other block of \$dstfile's shared extent"
> +for i in $(seq 1 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -f -s -c "pwrite $((i * bsize)) $bsize" $dstfile \
> + >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +echo "Verify \$dstfile's extent count"
> +nextents=$(xfs_get_fsxattr nextents $dstfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +rm $dstfile
> +
> +echo "* Funshare shared extent"
> +
> +echo "Share the extent with \$dstfile"
> +_reflink $srcfile $dstfile >> $seqres.full
> +
> +echo "Funshare every other block of \$dstfile's shared extent"
> +for i in $(seq 1 2 $((nr_blks - 1))); do
> + $XFS_IO_PROG -f -s -c "funshare $((i * bsize)) $bsize" $dstfile \
> + >> $seqres.full 2>&1
> + [[ $? != 0 ]] && break
> +done
> +
> +echo "Verify \$dstfile's extent count"
> +nextents=$(xfs_get_fsxattr nextents $dstfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +# success, all done
> +status=0
> +exit
> +
> diff --git a/tests/xfs/534.out b/tests/xfs/534.out
> new file mode 100644
> index 00000000..53288d12
> --- /dev/null
> +++ b/tests/xfs/534.out
> @@ -0,0 +1,12 @@
> +QA output created by 534
> +Format and mount fs
> +Inject reduce_max_iextents error tag
> +Create a $srcfile having an extent of length 15 blocks
> +* Write to shared extent
> +Share the extent with $dstfile
> +Buffered write to every other block of $dstfile's shared extent
> +Verify $dstfile's extent count
> +* Funshare shared extent
> +Share the extent with $dstfile
> +Funshare every other block of $dstfile's shared extent
> +Verify $dstfile's extent count
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 3ad47d07..b4f0c777 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -531,3 +531,4 @@
> 531 auto quick attr
> 532 auto quick dir hardlink symlink
> 533 auto quick
> +534 auto quick reflink
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 11/13] xfs: Check for extent overflow when remapping an extent
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (9 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 10/13] xfs: Check for extent overflow when moving extent from cow to data fork Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 18:19 ` Darrick J. Wong
2021-03-08 15:51 ` [PATCH V5 12/13] xfs: Check for extent overflow when swapping extents Chandan Babu R
2021-03-08 15:51 ` [PATCH V5 13/13] xfs: Stress test with bmap_alloc_minlen_extent error tag enabled Chandan Babu R
12 siblings, 1 reply; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when remapping extents from one file's inode fork to another.
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/535 | 81 +++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/535.out | 8 +++++
tests/xfs/group | 1 +
3 files changed, 90 insertions(+)
create mode 100755 tests/xfs/535
create mode 100644 tests/xfs/535.out
diff --git a/tests/xfs/535 b/tests/xfs/535
new file mode 100755
index 00000000..6bb27c92
--- /dev/null
+++ b/tests/xfs/535
@@ -0,0 +1,81 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 535
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# remapping extents from one file's inode fork to another.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_scratch_reflink
+_require_xfs_debug
+_require_xfs_io_command "reflink"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "* Reflink remap extents"
+
+echo "Format and mount fs"
+_scratch_mkfs >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_block_size $SCRATCH_MNT)
+
+srcfile=${SCRATCH_MNT}/srcfile
+dstfile=${SCRATCH_MNT}/dstfile
+
+nr_blks=15
+
+echo "Create \$srcfile having an extent of length $nr_blks blocks"
+$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
+ -c fsync $srcfile >> $seqres.full
+
+echo "Create \$dstfile having an extent of length $nr_blks blocks"
+$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
+ -c fsync $dstfile >> $seqres.full
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Reflink every other block from \$srcfile into \$dstfile"
+for i in $(seq 1 2 $((nr_blks - 1))); do
+ _reflink_range $srcfile $((i * bsize)) $dstfile $((i * bsize)) $bsize \
+ >> $seqres.full 2>&1
+done
+
+echo "Verify \$dstfile's extent count"
+nextents=$(xfs_get_fsxattr nextents $dstfile)
+if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/535.out b/tests/xfs/535.out
new file mode 100644
index 00000000..cfe50f45
--- /dev/null
+++ b/tests/xfs/535.out
@@ -0,0 +1,8 @@
+QA output created by 535
+* Reflink remap extents
+Format and mount fs
+Create $srcfile having an extent of length 15 blocks
+Create $dstfile having an extent of length 15 blocks
+Inject reduce_max_iextents error tag
+Reflink every other block from $srcfile into $dstfile
+Verify $dstfile's extent count
diff --git a/tests/xfs/group b/tests/xfs/group
index b4f0c777..aed06494 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -532,3 +532,4 @@
532 auto quick dir hardlink symlink
533 auto quick
534 auto quick reflink
+535 auto quick reflink
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH V5 11/13] xfs: Check for extent overflow when remapping an extent
2021-03-08 15:51 ` [PATCH V5 11/13] xfs: Check for extent overflow when remapping an extent Chandan Babu R
@ 2021-03-08 18:19 ` Darrick J. Wong
0 siblings, 0 replies; 23+ messages in thread
From: Darrick J. Wong @ 2021-03-08 18:19 UTC (permalink / raw)
To: Chandan Babu R; +Cc: fstests, linux-xfs
On Mon, Mar 08, 2021 at 09:21:09PM +0530, Chandan Babu R wrote:
> This test verifies that XFS does not cause inode fork's extent count to
> overflow when remapping extents from one file's inode fork to another.
>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Seems sensible,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> tests/xfs/535 | 81 +++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/535.out | 8 +++++
> tests/xfs/group | 1 +
> 3 files changed, 90 insertions(+)
> create mode 100755 tests/xfs/535
> create mode 100644 tests/xfs/535.out
>
> diff --git a/tests/xfs/535 b/tests/xfs/535
> new file mode 100755
> index 00000000..6bb27c92
> --- /dev/null
> +++ b/tests/xfs/535
> @@ -0,0 +1,81 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
> +#
> +# FS QA Test 535
> +#
> +# Verify that XFS does not cause inode fork's extent count to overflow when
> +# remapping extents from one file's inode fork to another.
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/reflink
> +. ./common/inject
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs xfs
> +_require_scratch
> +_require_scratch_reflink
> +_require_xfs_debug
> +_require_xfs_io_command "reflink"
> +_require_xfs_io_error_injection "reduce_max_iextents"
> +
> +echo "* Reflink remap extents"
> +
> +echo "Format and mount fs"
> +_scratch_mkfs >> $seqres.full
> +_scratch_mount >> $seqres.full
> +
> +bsize=$(_get_block_size $SCRATCH_MNT)
> +
> +srcfile=${SCRATCH_MNT}/srcfile
> +dstfile=${SCRATCH_MNT}/dstfile
> +
> +nr_blks=15
> +
> +echo "Create \$srcfile having an extent of length $nr_blks blocks"
> +$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
> + -c fsync $srcfile >> $seqres.full
> +
> +echo "Create \$dstfile having an extent of length $nr_blks blocks"
> +$XFS_IO_PROG -f -c "pwrite -b $((nr_blks * bsize)) 0 $((nr_blks * bsize))" \
> + -c fsync $dstfile >> $seqres.full
> +
> +echo "Inject reduce_max_iextents error tag"
> +_scratch_inject_error reduce_max_iextents 1
> +
> +echo "Reflink every other block from \$srcfile into \$dstfile"
> +for i in $(seq 1 2 $((nr_blks - 1))); do
> + _reflink_range $srcfile $((i * bsize)) $dstfile $((i * bsize)) $bsize \
> + >> $seqres.full 2>&1
> +done
> +
> +echo "Verify \$dstfile's extent count"
> +nextents=$(xfs_get_fsxattr nextents $dstfile)
> +if (( $nextents > 10 )); then
> + echo "Extent count overflow check failed: nextents = $nextents"
> + exit 1
> +fi
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/535.out b/tests/xfs/535.out
> new file mode 100644
> index 00000000..cfe50f45
> --- /dev/null
> +++ b/tests/xfs/535.out
> @@ -0,0 +1,8 @@
> +QA output created by 535
> +* Reflink remap extents
> +Format and mount fs
> +Create $srcfile having an extent of length 15 blocks
> +Create $dstfile having an extent of length 15 blocks
> +Inject reduce_max_iextents error tag
> +Reflink every other block from $srcfile into $dstfile
> +Verify $dstfile's extent count
> diff --git a/tests/xfs/group b/tests/xfs/group
> index b4f0c777..aed06494 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -532,3 +532,4 @@
> 532 auto quick dir hardlink symlink
> 533 auto quick
> 534 auto quick reflink
> +535 auto quick reflink
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH V5 12/13] xfs: Check for extent overflow when swapping extents
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (10 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 11/13] xfs: Check for extent overflow when remapping an extent Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
2021-03-08 15:51 ` [PATCH V5 13/13] xfs: Stress test with bmap_alloc_minlen_extent error tag enabled Chandan Babu R
12 siblings, 0 replies; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This test verifies that XFS does not cause inode fork's extent count to
overflow when swapping forks across two files.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/536 | 105 ++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/536.out | 13 ++++++
tests/xfs/group | 1 +
3 files changed, 119 insertions(+)
create mode 100755 tests/xfs/536
create mode 100644 tests/xfs/536.out
diff --git a/tests/xfs/536 b/tests/xfs/536
new file mode 100755
index 00000000..245c2feb
--- /dev/null
+++ b/tests/xfs/536
@@ -0,0 +1,105 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 536
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# swapping forks between files
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_xfs_scratch_rmapbt
+_require_xfs_io_command "fcollapse"
+_require_xfs_io_command "swapext"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "* Swap extent forks"
+
+echo "Format and mount fs"
+_scratch_mkfs >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_block_size $SCRATCH_MNT)
+
+srcfile=${SCRATCH_MNT}/srcfile
+donorfile=${SCRATCH_MNT}/donorfile
+
+echo "Create \$donorfile having an extent of length 67 blocks"
+$XFS_IO_PROG -f -s -c "pwrite -b $((17 * bsize)) 0 $((17 * bsize))" $donorfile \
+ >> $seqres.full
+
+# After the for loop the donor file will have the following extent layout
+# | 0-4 | 5 | 6 | 7 | 8 | 9 | 10 |
+echo "Fragment \$donorfile"
+for i in $(seq 5 10); do
+ start_offset=$((i * bsize))
+ $XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $donorfile >> $seqres.full
+done
+
+echo "Create \$srcfile having an extent of length 18 blocks"
+$XFS_IO_PROG -f -s -c "pwrite -b $((18 * bsize)) 0 $((18 * bsize))" $srcfile \
+ >> $seqres.full
+
+echo "Fragment \$srcfile"
+# After the for loop the src file will have the following extent layout
+# | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7-10 |
+for i in $(seq 1 7); do
+ start_offset=$((i * bsize))
+ $XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $srcfile >> $seqres.full
+done
+
+echo "Collect \$donorfile's extent count"
+donor_nr_exts=$(xfs_get_fsxattr nextents $donorfile)
+
+echo "Collect \$srcfile's extent count"
+src_nr_exts=$(xfs_get_fsxattr nextents $srcfile)
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+echo "Swap \$srcfile's and \$donorfile's extent forks"
+$XFS_IO_PROG -f -c "swapext $donorfile" $srcfile >> $seqres.full 2>&1
+
+echo "Check for \$donorfile's extent count overflow"
+nextents=$(xfs_get_fsxattr nextents $donorfile)
+
+if (( $nextents == $src_nr_exts )); then
+ echo "\$donorfile: Extent count overflow check failed"
+fi
+
+echo "Check for \$srcfile's extent count overflow"
+nextents=$(xfs_get_fsxattr nextents $srcfile)
+
+if (( $nextents == $donor_nr_exts )); then
+ echo "\$srcfile: Extent count overflow check failed"
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/536.out b/tests/xfs/536.out
new file mode 100644
index 00000000..f550aa1e
--- /dev/null
+++ b/tests/xfs/536.out
@@ -0,0 +1,13 @@
+QA output created by 536
+* Swap extent forks
+Format and mount fs
+Create $donorfile having an extent of length 67 blocks
+Fragment $donorfile
+Create $srcfile having an extent of length 18 blocks
+Fragment $srcfile
+Collect $donorfile's extent count
+Collect $srcfile's extent count
+Inject reduce_max_iextents error tag
+Swap $srcfile's and $donorfile's extent forks
+Check for $donorfile's extent count overflow
+Check for $srcfile's extent count overflow
diff --git a/tests/xfs/group b/tests/xfs/group
index aed06494..ba674a58 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -533,3 +533,4 @@
533 auto quick
534 auto quick reflink
535 auto quick reflink
+536 auto quick
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH V5 13/13] xfs: Stress test with bmap_alloc_minlen_extent error tag enabled
2021-03-08 15:50 [PATCH V5 00/13] xfs: Tests to verify inode fork extent count overflow detection Chandan Babu R
` (11 preceding siblings ...)
2021-03-08 15:51 ` [PATCH V5 12/13] xfs: Check for extent overflow when swapping extents Chandan Babu R
@ 2021-03-08 15:51 ` Chandan Babu R
12 siblings, 0 replies; 23+ messages in thread
From: Chandan Babu R @ 2021-03-08 15:51 UTC (permalink / raw)
To: fstests; +Cc: Chandan Babu R, linux-xfs, djwong
This commit adds a stress test that executes fsstress with
bmap_alloc_minlen_extent error tag enabled.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
---
tests/xfs/537 | 84 +++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/537.out | 7 ++++
tests/xfs/group | 1 +
3 files changed, 92 insertions(+)
create mode 100755 tests/xfs/537
create mode 100644 tests/xfs/537.out
diff --git a/tests/xfs/537 b/tests/xfs/537
new file mode 100755
index 00000000..77fa60d9
--- /dev/null
+++ b/tests/xfs/537
@@ -0,0 +1,84 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 537
+#
+# Execute fsstress with bmap_alloc_minlen_extent error tag enabled.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+. ./common/populate
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_test_program "punch-alternating"
+_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+
+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 "Scale fsstress args"
+args=$(_scale_fsstress_args -p $((LOAD_FACTOR * 75)) -n $((TIME_FACTOR * 1000)))
+
+echo "Execute fsstress in background"
+$FSSTRESS_PROG -d $SCRATCH_MNT $args \
+ -f bulkstat=0 \
+ -f bulkstat1=0 \
+ -f fiemap=0 \
+ -f getattr=0 \
+ -f getdents=0 \
+ -f getfattr=0 \
+ -f listfattr=0 \
+ -f mread=0 \
+ -f read=0 \
+ -f readlink=0 \
+ -f readv=0 \
+ -f stat=0 \
+ -f aread=0 \
+ -f dread=0 > /dev/null 2>&1
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/537.out b/tests/xfs/537.out
new file mode 100644
index 00000000..19633a07
--- /dev/null
+++ b/tests/xfs/537.out
@@ -0,0 +1,7 @@
+QA output created by 537
+Format and mount fs
+Consume free space
+Create fragmented filesystem
+Inject bmap_alloc_minlen_extent error tag
+Scale fsstress args
+Execute fsstress in background
diff --git a/tests/xfs/group b/tests/xfs/group
index ba674a58..5c827727 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -534,3 +534,4 @@
534 auto quick reflink
535 auto quick reflink
536 auto quick
+537 auto stress
--
2.29.2
^ permalink raw reply related [flat|nested] 23+ messages in thread