linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] generic: Addition of new tests for extsize hints
@ 2024-10-22 19:26 Nirjhar Roy
  2024-10-22 19:26 ` [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file Nirjhar Roy
  2024-10-22 19:26 ` [PATCH 2/2] generic: Addition of new tests for extsize hints Nirjhar Roy
  0 siblings, 2 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-22 19:26 UTC (permalink / raw)
  To: fstests; +Cc: linux-ext4, linux-xfs, ritesh.list, ojaswin, djwong, zlang

This test is basically to check the functionality of setting extsize
hints for xfs filesystem through an ioctl. It covers various scenarios 
like setting and then getting extsize hints for various types of files 
like an empty file, non-empty file (with delayed allocation and allocated
extents). This test set also tests one of scenarios where setting extsize
hints on files with delayed allocated (incorrectly) succeeds and there is 
an ongoing patch series[1] that fixes it.

Currently this test only runs in xfs but there is an patch series[2] in review 
that adds support for the extsize hints for ext4 as well.

I have tested it on ppc64le (with page size 64k) and x86_64 (with page size 4k).
The block sizes I have tested with are 2k, 4k, 8k, 16k, 64k with extsize being 
twice of the block size. I had to enable CONFIG_TRANSPARENT_HUGEPAGE 
to enable block size greater than 4k on x86_64.

[1] https://lore.kernel.org/all/20241015094509.678082-1-ojaswin@linux.ibm.com/
[2] https://lore.kernel.org/linux-ext4/cover.1726034272.git.ojaswin@linux.ibm.com/

Nirjhar Roy (2):
  common/xfs,xfs/207: Adding a common helper function to check xflag
    bits on a given file
  generic: Addition of new tests for extsize hints

 common/xfs            |   9 +++
 tests/generic/365     | 156 ++++++++++++++++++++++++++++++++++++++++++
 tests/generic/365.out |  26 +++++++
 tests/xfs/207         |  14 +---
 4 files changed, 194 insertions(+), 11 deletions(-)
 create mode 100755 tests/generic/365
 create mode 100644 tests/generic/365.out

-- 
2.43.5


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

* [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-22 19:26 [PATCH 0/2] generic: Addition of new tests for extsize hints Nirjhar Roy
@ 2024-10-22 19:26 ` Nirjhar Roy
  2024-10-24 18:08   ` Darrick J. Wong
  2024-10-25  2:56   ` Zorro Lang
  2024-10-22 19:26 ` [PATCH 2/2] generic: Addition of new tests for extsize hints Nirjhar Roy
  1 sibling, 2 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-22 19:26 UTC (permalink / raw)
  To: fstests; +Cc: linux-ext4, linux-xfs, ritesh.list, ojaswin, djwong, zlang

This patch defines a common helper function to test whether any of
fsxattr xflags field is set or not. We will use this helper in the next
patch for checking extsize (e) flag.

Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
---
 common/xfs    |  9 +++++++++
 tests/xfs/207 | 14 +++-----------
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/common/xfs b/common/xfs
index 62e3100e..7340ccbf 100644
--- a/common/xfs
+++ b/common/xfs
@@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
 	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
 }
 
+# Check whether a fsxattr xflags character field is set on a given file.
+# e.g. fsxattr.xflags = 0x0 [--------------C-]
+# Returns 0 if passed flag character is set, otherwise returns 1
+_test_xfs_xflags_field()
+{
+    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
+        && return 0 || return 1
+}
+
 _setup_large_xfs_fs()
 {
 	fs_size=$1
diff --git a/tests/xfs/207 b/tests/xfs/207
index bbe21307..adb925df 100755
--- a/tests/xfs/207
+++ b/tests/xfs/207
@@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
 # Import common functions.
 . ./common/filter
 . ./common/reflink
+. ./common/xfs
 
 _require_scratch_reflink
 _require_cp_reflink
 _require_xfs_io_command "fiemap"
 _require_xfs_io_command "cowextsize"
 
-# Takes the fsxattr.xflags line,
-# i.e. fsxattr.xflags = 0x0 [--------------C-]
-# and tests whether a flag character is set
-test_xflag()
-{
-    local flg=$1
-    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
-}
-
 echo "Format and mount"
 _scratch_mkfs > $seqres.full 2>&1
 _scratch_mount >> $seqres.full 2>&1
@@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
 $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
 _scratch_cycle_mount
 
-$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
+_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
 $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
 
 echo "Unset cowextsize and check flag"
 $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
 _scratch_cycle_mount
 
-$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
+_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
 $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
 
 status=0
-- 
2.43.5


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

* [PATCH 2/2] generic: Addition of new tests for extsize hints
  2024-10-22 19:26 [PATCH 0/2] generic: Addition of new tests for extsize hints Nirjhar Roy
  2024-10-22 19:26 ` [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file Nirjhar Roy
@ 2024-10-22 19:26 ` Nirjhar Roy
  2024-10-24 18:14   ` Darrick J. Wong
  1 sibling, 1 reply; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-22 19:26 UTC (permalink / raw)
  To: fstests; +Cc: linux-ext4, linux-xfs, ritesh.list, ojaswin, djwong, zlang

This commit adds new tests that checks the behaviour of xfs/ext4
filesystems when extsize hint is set on file with inode size as 0, non-empty
files with allocated and delalloc extents and so on.
Although currently this test is placed under tests/generic, it
only runs on xfs and there is an ongoing patch series[1] to enable
extsize hints for ext4 as well.

[1] https://lore.kernel.org/linux-ext4/cover.1726034272.git.ojaswin@linux.ibm.com/

Suggested-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
---
 tests/generic/365     | 156 ++++++++++++++++++++++++++++++++++++++++++
 tests/generic/365.out |  26 +++++++
 2 files changed, 182 insertions(+)
 create mode 100755 tests/generic/365
 create mode 100644 tests/generic/365.out

diff --git a/tests/generic/365 b/tests/generic/365
new file mode 100755
index 00000000..85a7ce9a
--- /dev/null
+++ b/tests/generic/365
@@ -0,0 +1,156 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024 Nirjhar Roy (nirjhar@linux.ibm.com).  All Rights Reserved.
+#
+# FS QA Test 365
+#
+# This test verifies that extent allocation hint setting works correctly on files with
+# no extents allocated and non-empty files which are truncated. It also checks that the
+# extent hints setting fails with non-empty file i.e, with any file with allocated
+# extents or delayed allocation. We also check if the extsize value and the
+# xflag bit actually got reflected after setting/re-setting the extsize value.
+
+. ./common/config
+. ./common/filter
+. ./common/preamble
+. ./common/xfs
+
+_begin_fstest ioctl quick
+
+_supported_fs xfs
+
+_fixed_by_kernel_commit XXXXXXXXXXXX \
+    "xfs: Check for delayed allocations before setting extsize",
+
+_require_scratch
+
+FILE_DATA_SIZE=1M
+
+filter_extsz()
+{
+    sed "s/$EXTSIZE/EXTSIZE/g"
+}
+
+setup()
+{
+    _scratch_mkfs >> "$seqres.full"  2>&1
+    _scratch_mount >> "$seqres.full" 2>&1
+    BLKSZ=`_get_block_size $SCRATCH_MNT`
+    EXTSIZE=$(( BLKSZ*2 ))
+}
+
+read_file_extsize()
+{
+    $XFS_IO_PROG -c "extsize" $1 | _filter_scratch | filter_extsz
+}
+
+check_extsz_and_xflag()
+{
+    local filename=$1
+    read_file_extsize $filename
+    _test_xfs_xflags_field $filename "e" && echo "e flag set" || echo "e flag unset"
+}
+
+check_extsz_xflag_across_remount()
+{
+    local filename=$1
+    _scratch_cycle_mount
+    check_extsz_and_xflag $filename
+}
+
+# Extsize flag should be cleared when extsize is reset, so this function
+# checks that this behavior is followed.
+reset_extsz_and_recheck_extsz_xflag()
+{
+    local filename=$1
+    echo "Re-setting extsize hint to 0"
+    $XFS_IO_PROG -c "extsize 0" $filename
+    check_extsz_xflag_across_remount $filename
+}
+
+check_extsz_xflag_before_and_after_reset()
+{
+    local filename=$1
+    check_extsz_xflag_across_remount $filename
+    reset_extsz_and_recheck_extsz_xflag $filename
+}
+
+test_empty_file()
+{
+    echo "TEST: Set extsize on empty file"
+    local filename=$1
+    $XFS_IO_PROG \
+        -c "open -f $filename" \
+        -c "extsize $EXTSIZE" \
+
+    check_extsz_xflag_before_and_after_reset $filename
+    echo
+}
+
+test_data_delayed()
+{
+    echo "TEST: Set extsize on non-empty file with delayed allocation"
+    local filename=$1
+    $XFS_IO_PROG \
+        -c "open -f $filename" \
+        -c "pwrite -q  0 $FILE_DATA_SIZE" \
+        -c "extsize $EXTSIZE" | _filter_scratch
+
+    check_extsz_xflag_across_remount $filename
+    echo
+}
+
+test_data_allocated()
+{
+    echo "TEST: Set extsize on non-empty file with allocated extents"
+    local filename=$1
+    $XFS_IO_PROG \
+        -c "open -f $filename" \
+        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
+        -c "extsize $EXTSIZE" | _filter_scratch
+
+    check_extsz_xflag_across_remount $filename
+    echo
+}
+
+test_truncate_allocated()
+{
+    echo "TEST: Set extsize after truncating a file with allocated extents"
+    local filename=$1
+    $XFS_IO_PROG \
+        -c "open -f $filename" \
+        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
+        -c "truncate 0" \
+        -c "extsize $EXTSIZE" \
+
+    check_extsz_xflag_across_remount $filename
+    echo
+}
+
+test_truncate_delayed()
+{
+    echo "TEST: Set extsize after truncating a file with delayed allocation"
+    local filename=$1
+    $XFS_IO_PROG \
+        -c "open -f $filename" \
+        -c "pwrite -q  0 $FILE_DATA_SIZE" \
+        -c "truncate 0" \
+        -c "extsize $EXTSIZE" \
+
+    check_extsz_xflag_across_remount $filename
+    echo
+}
+
+setup
+echo -e "EXTSIZE = $EXTSIZE BLOCKSIZE = $BLKSZ\n" >> "$seqres.full"
+
+NEW_FILE_NAME_PREFIX=$SCRATCH_MNT/new-file-
+
+test_empty_file "$NEW_FILE_NAME_PREFIX"00
+test_data_delayed "$NEW_FILE_NAME_PREFIX"01
+test_data_allocated "$NEW_FILE_NAME_PREFIX"02
+test_truncate_allocated "$NEW_FILE_NAME_PREFIX"03
+test_truncate_delayed "$NEW_FILE_NAME_PREFIX"04
+
+status=0
+exit
diff --git a/tests/generic/365.out b/tests/generic/365.out
new file mode 100644
index 00000000..38cd0885
--- /dev/null
+++ b/tests/generic/365.out
@@ -0,0 +1,26 @@
+QA output created by 365
+TEST: Set extsize on empty file
+[EXTSIZE] SCRATCH_MNT/new-file-00
+e flag set
+Re-setting extsize hint to 0
+[0] SCRATCH_MNT/new-file-00
+e flag unset
+
+TEST: Set extsize on non-empty file with delayed allocation
+xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-01: Invalid argument
+[0] SCRATCH_MNT/new-file-01
+e flag unset
+
+TEST: Set extsize on non-empty file with allocated extents
+xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-02: Invalid argument
+[0] SCRATCH_MNT/new-file-02
+e flag unset
+
+TEST: Set extsize after truncating a file with allocated extents
+[EXTSIZE] SCRATCH_MNT/new-file-03
+e flag set
+
+TEST: Set extsize after truncating a file with delayed allocation
+[EXTSIZE] SCRATCH_MNT/new-file-04
+e flag set
+
-- 
2.43.5


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-22 19:26 ` [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file Nirjhar Roy
@ 2024-10-24 18:08   ` Darrick J. Wong
  2024-10-25  2:56   ` Zorro Lang
  1 sibling, 0 replies; 14+ messages in thread
From: Darrick J. Wong @ 2024-10-24 18:08 UTC (permalink / raw)
  To: Nirjhar Roy; +Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang

On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
> This patch defines a common helper function to test whether any of
> fsxattr xflags field is set or not. We will use this helper in the next
> patch for checking extsize (e) flag.
> 
> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> ---
>  common/xfs    |  9 +++++++++
>  tests/xfs/207 | 14 +++-----------
>  2 files changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/common/xfs b/common/xfs
> index 62e3100e..7340ccbf 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
>  	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
>  }
>  
> +# Check whether a fsxattr xflags character field is set on a given file.
> +# e.g. fsxattr.xflags = 0x0 [--------------C-]
> +# Returns 0 if passed flag character is set, otherwise returns 1
> +_test_xfs_xflags_field()

Seeing as fsxattr got added to ext4 and others, this probably should be
called _test_fsxattr_xflags() and live in common/rc.

> +{
> +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
> +        && return 0 || return 1

No need for this bit, the grep -q will set the return value to 0 or 1
and bash will leave that set for the caller.

--D

> +}
> +
>  _setup_large_xfs_fs()
>  {
>  	fs_size=$1
> diff --git a/tests/xfs/207 b/tests/xfs/207
> index bbe21307..adb925df 100755
> --- a/tests/xfs/207
> +++ b/tests/xfs/207
> @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
>  # Import common functions.
>  . ./common/filter
>  . ./common/reflink
> +. ./common/xfs
>  
>  _require_scratch_reflink
>  _require_cp_reflink
>  _require_xfs_io_command "fiemap"
>  _require_xfs_io_command "cowextsize"
>  
> -# Takes the fsxattr.xflags line,
> -# i.e. fsxattr.xflags = 0x0 [--------------C-]
> -# and tests whether a flag character is set
> -test_xflag()
> -{
> -    local flg=$1
> -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
> -}
> -
>  echo "Format and mount"
>  _scratch_mkfs > $seqres.full 2>&1
>  _scratch_mount >> $seqres.full 2>&1
> @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
>  $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
>  _scratch_cycle_mount
>  
> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>  
>  echo "Unset cowextsize and check flag"
>  $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
>  _scratch_cycle_mount
>  
> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>  
>  status=0
> -- 
> 2.43.5
> 
> 

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

* Re: [PATCH 2/2] generic: Addition of new tests for extsize hints
  2024-10-22 19:26 ` [PATCH 2/2] generic: Addition of new tests for extsize hints Nirjhar Roy
@ 2024-10-24 18:14   ` Darrick J. Wong
  2024-10-25  6:12     ` Nirjhar Roy
  2024-11-14  9:45     ` Nirjhar Roy
  0 siblings, 2 replies; 14+ messages in thread
From: Darrick J. Wong @ 2024-10-24 18:14 UTC (permalink / raw)
  To: Nirjhar Roy; +Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang

On Wed, Oct 23, 2024 at 12:56:20AM +0530, Nirjhar Roy wrote:
> This commit adds new tests that checks the behaviour of xfs/ext4
> filesystems when extsize hint is set on file with inode size as 0, non-empty
> files with allocated and delalloc extents and so on.
> Although currently this test is placed under tests/generic, it
> only runs on xfs and there is an ongoing patch series[1] to enable
> extsize hints for ext4 as well.
> 
> [1] https://lore.kernel.org/linux-ext4/cover.1726034272.git.ojaswin@linux.ibm.com/
> 
> Suggested-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> ---
>  tests/generic/365     | 156 ++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/365.out |  26 +++++++
>  2 files changed, 182 insertions(+)
>  create mode 100755 tests/generic/365
>  create mode 100644 tests/generic/365.out
> 
> diff --git a/tests/generic/365 b/tests/generic/365
> new file mode 100755
> index 00000000..85a7ce9a
> --- /dev/null
> +++ b/tests/generic/365
> @@ -0,0 +1,156 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2024 Nirjhar Roy (nirjhar@linux.ibm.com).  All Rights Reserved.
> +#
> +# FS QA Test 365
> +#
> +# This test verifies that extent allocation hint setting works correctly on files with
> +# no extents allocated and non-empty files which are truncated. It also checks that the
> +# extent hints setting fails with non-empty file i.e, with any file with allocated
> +# extents or delayed allocation. We also check if the extsize value and the
> +# xflag bit actually got reflected after setting/re-setting the extsize value.
> +
> +. ./common/config
> +. ./common/filter
> +. ./common/preamble
> +. ./common/xfs
> +
> +_begin_fstest ioctl quick
> +
> +_supported_fs xfs
> +
> +_fixed_by_kernel_commit XXXXXXXXXXXX \
> +    "xfs: Check for delayed allocations before setting extsize",
> +
> +_require_scratch
> +
> +FILE_DATA_SIZE=1M

Do these tests work correctly with fsblock size of 64k?  Just curious
since Pankaj just sent a series doing 1M -> 4M bumps to fix quota
issues.

> +filter_extsz()
> +{
> +    sed "s/$EXTSIZE/EXTSIZE/g"
> +}
> +
> +setup()
> +{
> +    _scratch_mkfs >> "$seqres.full"  2>&1
> +    _scratch_mount >> "$seqres.full" 2>&1
> +    BLKSZ=`_get_block_size $SCRATCH_MNT`
> +    EXTSIZE=$(( BLKSZ*2 ))

Might want to check that there isn't an extsize/cowextsize set on the
root directory due to mkfs options.

> +}
> +
> +read_file_extsize()
> +{
> +    $XFS_IO_PROG -c "extsize" $1 | _filter_scratch | filter_extsz
> +}
> +
> +check_extsz_and_xflag()
> +{
> +    local filename=$1
> +    read_file_extsize $filename
> +    _test_xfs_xflags_field $filename "e" && echo "e flag set" || echo "e flag unset"
> +}
> +
> +check_extsz_xflag_across_remount()
> +{
> +    local filename=$1
> +    _scratch_cycle_mount
> +    check_extsz_and_xflag $filename
> +}
> +
> +# Extsize flag should be cleared when extsize is reset, so this function
> +# checks that this behavior is followed.
> +reset_extsz_and_recheck_extsz_xflag()
> +{
> +    local filename=$1
> +    echo "Re-setting extsize hint to 0"
> +    $XFS_IO_PROG -c "extsize 0" $filename
> +    check_extsz_xflag_across_remount $filename
> +}
> +
> +check_extsz_xflag_before_and_after_reset()
> +{
> +    local filename=$1
> +    check_extsz_xflag_across_remount $filename
> +    reset_extsz_and_recheck_extsz_xflag $filename
> +}
> +
> +test_empty_file()
> +{
> +    echo "TEST: Set extsize on empty file"
> +    local filename=$1
> +    $XFS_IO_PROG \
> +        -c "open -f $filename" \
> +        -c "extsize $EXTSIZE" \
> +
> +    check_extsz_xflag_before_and_after_reset $filename
> +    echo
> +}
> +
> +test_data_delayed()
> +{
> +    echo "TEST: Set extsize on non-empty file with delayed allocation"
> +    local filename=$1
> +    $XFS_IO_PROG \
> +        -c "open -f $filename" \
> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
> +        -c "extsize $EXTSIZE" | _filter_scratch
> +
> +    check_extsz_xflag_across_remount $filename
> +    echo
> +}
> +
> +test_data_allocated()
> +{
> +    echo "TEST: Set extsize on non-empty file with allocated extents"
> +    local filename=$1
> +    $XFS_IO_PROG \
> +        -c "open -f $filename" \
> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
> +        -c "extsize $EXTSIZE" | _filter_scratch
> +
> +    check_extsz_xflag_across_remount $filename
> +    echo
> +}
> +
> +test_truncate_allocated()
> +{
> +    echo "TEST: Set extsize after truncating a file with allocated extents"
> +    local filename=$1
> +    $XFS_IO_PROG \
> +        -c "open -f $filename" \
> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
> +        -c "truncate 0" \
> +        -c "extsize $EXTSIZE" \
> +
> +    check_extsz_xflag_across_remount $filename
> +    echo
> +}
> +
> +test_truncate_delayed()
> +{
> +    echo "TEST: Set extsize after truncating a file with delayed allocation"
> +    local filename=$1
> +    $XFS_IO_PROG \
> +        -c "open -f $filename" \
> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
> +        -c "truncate 0" \
> +        -c "extsize $EXTSIZE" \
> +
> +    check_extsz_xflag_across_remount $filename
> +    echo
> +}

Does this work for filesystems that don't have delalloc?  Like fsdax
filesystems?

--D

> +setup
> +echo -e "EXTSIZE = $EXTSIZE BLOCKSIZE = $BLKSZ\n" >> "$seqres.full"
> +
> +NEW_FILE_NAME_PREFIX=$SCRATCH_MNT/new-file-
> +
> +test_empty_file "$NEW_FILE_NAME_PREFIX"00
> +test_data_delayed "$NEW_FILE_NAME_PREFIX"01
> +test_data_allocated "$NEW_FILE_NAME_PREFIX"02
> +test_truncate_allocated "$NEW_FILE_NAME_PREFIX"03
> +test_truncate_delayed "$NEW_FILE_NAME_PREFIX"04
> +
> +status=0
> +exit
> diff --git a/tests/generic/365.out b/tests/generic/365.out
> new file mode 100644
> index 00000000..38cd0885
> --- /dev/null
> +++ b/tests/generic/365.out
> @@ -0,0 +1,26 @@
> +QA output created by 365
> +TEST: Set extsize on empty file
> +[EXTSIZE] SCRATCH_MNT/new-file-00
> +e flag set
> +Re-setting extsize hint to 0
> +[0] SCRATCH_MNT/new-file-00
> +e flag unset
> +
> +TEST: Set extsize on non-empty file with delayed allocation
> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-01: Invalid argument
> +[0] SCRATCH_MNT/new-file-01
> +e flag unset
> +
> +TEST: Set extsize on non-empty file with allocated extents
> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-02: Invalid argument
> +[0] SCRATCH_MNT/new-file-02
> +e flag unset
> +
> +TEST: Set extsize after truncating a file with allocated extents
> +[EXTSIZE] SCRATCH_MNT/new-file-03
> +e flag set
> +
> +TEST: Set extsize after truncating a file with delayed allocation
> +[EXTSIZE] SCRATCH_MNT/new-file-04
> +e flag set
> +
> -- 
> 2.43.5
> 
> 

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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-22 19:26 ` [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file Nirjhar Roy
  2024-10-24 18:08   ` Darrick J. Wong
@ 2024-10-25  2:56   ` Zorro Lang
  2024-10-25  4:07     ` Darrick J. Wong
  2024-10-25  6:14     ` Nirjhar Roy
  1 sibling, 2 replies; 14+ messages in thread
From: Zorro Lang @ 2024-10-25  2:56 UTC (permalink / raw)
  To: Nirjhar Roy
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, djwong,
	zlang

On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
> This patch defines a common helper function to test whether any of
> fsxattr xflags field is set or not. We will use this helper in the next
> patch for checking extsize (e) flag.
> 
> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> ---
>  common/xfs    |  9 +++++++++
>  tests/xfs/207 | 14 +++-----------
>  2 files changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/common/xfs b/common/xfs
> index 62e3100e..7340ccbf 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
>  	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
>  }
>  
> +# Check whether a fsxattr xflags character field is set on a given file.

Better to explain the arguments, e.g.

# Check whether a fsxattr xflags character ($2) field is set on a given file ($1).

> +# e.g. fsxattr.xflags = 0x0 [--------------C-]
> +# Returns 0 if passed flag character is set, otherwise returns 1
> +_test_xfs_xflags_field()
> +{
> +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
> +        && return 0 || return 1

That's too complex. Those "return" aren't needed as Darrick metioned. About
that two "grep", how about combine them, e.g.

_test_xfs_xflags_field()
{
	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
}



> +}
> +
>  _setup_large_xfs_fs()
>  {
>  	fs_size=$1
> diff --git a/tests/xfs/207 b/tests/xfs/207
> index bbe21307..adb925df 100755
> --- a/tests/xfs/207
> +++ b/tests/xfs/207
> @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
>  # Import common functions.
>  . ./common/filter
>  . ./common/reflink
> +. ./common/xfs

Is this really necessary? Will this test fail without this line?
The common/$FSTYP file is imported automatically, if it's not, that a bug.

Thanks,
Zorro

>  
>  _require_scratch_reflink
>  _require_cp_reflink
>  _require_xfs_io_command "fiemap"
>  _require_xfs_io_command "cowextsize"
>  
> -# Takes the fsxattr.xflags line,
> -# i.e. fsxattr.xflags = 0x0 [--------------C-]
> -# and tests whether a flag character is set
> -test_xflag()
> -{
> -    local flg=$1
> -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
> -}
> -
>  echo "Format and mount"
>  _scratch_mkfs > $seqres.full 2>&1
>  _scratch_mount >> $seqres.full 2>&1
> @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
>  $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
>  _scratch_cycle_mount
>  
> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>  
>  echo "Unset cowextsize and check flag"
>  $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
>  _scratch_cycle_mount
>  
> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>  
>  status=0
> -- 
> 2.43.5
> 
> 


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  2:56   ` Zorro Lang
@ 2024-10-25  4:07     ` Darrick J. Wong
  2024-10-25  4:15       ` Zorro Lang
  2024-10-25  6:16       ` Nirjhar Roy
  2024-10-25  6:14     ` Nirjhar Roy
  1 sibling, 2 replies; 14+ messages in thread
From: Darrick J. Wong @ 2024-10-25  4:07 UTC (permalink / raw)
  To: Zorro Lang
  Cc: Nirjhar Roy, fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin,
	zlang

On Fri, Oct 25, 2024 at 10:56:51AM +0800, Zorro Lang wrote:
> On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
> > This patch defines a common helper function to test whether any of
> > fsxattr xflags field is set or not. We will use this helper in the next
> > patch for checking extsize (e) flag.
> > 
> > Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> > Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> > Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> > ---
> >  common/xfs    |  9 +++++++++
> >  tests/xfs/207 | 14 +++-----------
> >  2 files changed, 12 insertions(+), 11 deletions(-)
> > 
> > diff --git a/common/xfs b/common/xfs
> > index 62e3100e..7340ccbf 100644
> > --- a/common/xfs
> > +++ b/common/xfs
> > @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
> >  	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
> >  }
> >  
> > +# Check whether a fsxattr xflags character field is set on a given file.
> 
> Better to explain the arguments, e.g.
> 
> # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
> 
> > +# e.g. fsxattr.xflags = 0x0 [--------------C-]
> > +# Returns 0 if passed flag character is set, otherwise returns 1
> > +_test_xfs_xflags_field()
> > +{
> > +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
> > +        && return 0 || return 1
> 
> That's too complex. Those "return" aren't needed as Darrick metioned. About
> that two "grep", how about combine them, e.g.
> 
> _test_xfs_xflags_field()
> {
> 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
> }
> 
> 
> 
> > +}
> > +
> >  _setup_large_xfs_fs()
> >  {
> >  	fs_size=$1
> > diff --git a/tests/xfs/207 b/tests/xfs/207
> > index bbe21307..adb925df 100755
> > --- a/tests/xfs/207
> > +++ b/tests/xfs/207
> > @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
> >  # Import common functions.
> >  . ./common/filter
> >  . ./common/reflink
> > +. ./common/xfs
> 
> Is this really necessary? Will this test fail without this line?
> The common/$FSTYP file is imported automatically, if it's not, that a bug.

If the generic helper goes in common/rc instead then it's not necessary
at all.

--D

> Thanks,
> Zorro
> 
> >  
> >  _require_scratch_reflink
> >  _require_cp_reflink
> >  _require_xfs_io_command "fiemap"
> >  _require_xfs_io_command "cowextsize"
> >  
> > -# Takes the fsxattr.xflags line,
> > -# i.e. fsxattr.xflags = 0x0 [--------------C-]
> > -# and tests whether a flag character is set
> > -test_xflag()
> > -{
> > -    local flg=$1
> > -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
> > -}
> > -
> >  echo "Format and mount"
> >  _scratch_mkfs > $seqres.full 2>&1
> >  _scratch_mount >> $seqres.full 2>&1
> > @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
> >  $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
> >  _scratch_cycle_mount
> >  
> > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> >  
> >  echo "Unset cowextsize and check flag"
> >  $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
> >  _scratch_cycle_mount
> >  
> > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> >  
> >  status=0
> > -- 
> > 2.43.5
> > 
> > 
> 

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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  4:07     ` Darrick J. Wong
@ 2024-10-25  4:15       ` Zorro Lang
  2024-10-25  5:27         ` Darrick J. Wong
  2024-10-25  6:17         ` Nirjhar Roy
  2024-10-25  6:16       ` Nirjhar Roy
  1 sibling, 2 replies; 14+ messages in thread
From: Zorro Lang @ 2024-10-25  4:15 UTC (permalink / raw)
  To: Darrick J. Wong
  Cc: Nirjhar Roy, fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin,
	zlang

On Thu, Oct 24, 2024 at 09:07:03PM -0700, Darrick J. Wong wrote:
> On Fri, Oct 25, 2024 at 10:56:51AM +0800, Zorro Lang wrote:
> > On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
> > > This patch defines a common helper function to test whether any of
> > > fsxattr xflags field is set or not. We will use this helper in the next
> > > patch for checking extsize (e) flag.
> > > 
> > > Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> > > Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> > > Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> > > ---
> > >  common/xfs    |  9 +++++++++
> > >  tests/xfs/207 | 14 +++-----------
> > >  2 files changed, 12 insertions(+), 11 deletions(-)
> > > 
> > > diff --git a/common/xfs b/common/xfs
> > > index 62e3100e..7340ccbf 100644
> > > --- a/common/xfs
> > > +++ b/common/xfs
> > > @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
> > >  	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
> > >  }
> > >  
> > > +# Check whether a fsxattr xflags character field is set on a given file.
> > 
> > Better to explain the arguments, e.g.
> > 
> > # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
> > 
> > > +# e.g. fsxattr.xflags = 0x0 [--------------C-]
> > > +# Returns 0 if passed flag character is set, otherwise returns 1
> > > +_test_xfs_xflags_field()
> > > +{
> > > +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
> > > +        && return 0 || return 1
> > 
> > That's too complex. Those "return" aren't needed as Darrick metioned. About
> > that two "grep", how about combine them, e.g.
> > 
> > _test_xfs_xflags_field()
> > {
> > 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
> > }
> > 
> > 
> > 
> > > +}
> > > +
> > >  _setup_large_xfs_fs()
> > >  {
> > >  	fs_size=$1
> > > diff --git a/tests/xfs/207 b/tests/xfs/207
> > > index bbe21307..adb925df 100755
> > > --- a/tests/xfs/207
> > > +++ b/tests/xfs/207
> > > @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
> > >  # Import common functions.
> > >  . ./common/filter
> > >  . ./common/reflink
> > > +. ./common/xfs
> > 
> > Is this really necessary? Will this test fail without this line?
> > The common/$FSTYP file is imported automatically, if it's not, that a bug.
> 
> If the generic helper goes in common/rc instead then it's not necessary
> at all.

Won't the "_source_specific_fs $FSTYP" in common/rc helps to import common/xfs?

> 
> --D
> 
> > Thanks,
> > Zorro
> > 
> > >  
> > >  _require_scratch_reflink
> > >  _require_cp_reflink
> > >  _require_xfs_io_command "fiemap"
> > >  _require_xfs_io_command "cowextsize"
> > >  
> > > -# Takes the fsxattr.xflags line,
> > > -# i.e. fsxattr.xflags = 0x0 [--------------C-]
> > > -# and tests whether a flag character is set
> > > -test_xflag()
> > > -{
> > > -    local flg=$1
> > > -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
> > > -}
> > > -
> > >  echo "Format and mount"
> > >  _scratch_mkfs > $seqres.full 2>&1
> > >  _scratch_mount >> $seqres.full 2>&1
> > > @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
> > >  $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
> > >  _scratch_cycle_mount
> > >  
> > > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> > >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> > >  
> > >  echo "Unset cowextsize and check flag"
> > >  $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
> > >  _scratch_cycle_mount
> > >  
> > > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> > >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> > >  
> > >  status=0
> > > -- 
> > > 2.43.5
> > > 
> > > 
> > 
> 


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  4:15       ` Zorro Lang
@ 2024-10-25  5:27         ` Darrick J. Wong
  2024-10-25  6:17         ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Darrick J. Wong @ 2024-10-25  5:27 UTC (permalink / raw)
  To: Zorro Lang
  Cc: Nirjhar Roy, fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin,
	zlang

On Fri, Oct 25, 2024 at 12:15:01PM +0800, Zorro Lang wrote:
> On Thu, Oct 24, 2024 at 09:07:03PM -0700, Darrick J. Wong wrote:
> > On Fri, Oct 25, 2024 at 10:56:51AM +0800, Zorro Lang wrote:
> > > On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
> > > > This patch defines a common helper function to test whether any of
> > > > fsxattr xflags field is set or not. We will use this helper in the next
> > > > patch for checking extsize (e) flag.
> > > > 
> > > > Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> > > > Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> > > > Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> > > > ---
> > > >  common/xfs    |  9 +++++++++
> > > >  tests/xfs/207 | 14 +++-----------
> > > >  2 files changed, 12 insertions(+), 11 deletions(-)
> > > > 
> > > > diff --git a/common/xfs b/common/xfs
> > > > index 62e3100e..7340ccbf 100644
> > > > --- a/common/xfs
> > > > +++ b/common/xfs
> > > > @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
> > > >  	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
> > > >  }
> > > >  
> > > > +# Check whether a fsxattr xflags character field is set on a given file.
> > > 
> > > Better to explain the arguments, e.g.
> > > 
> > > # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
> > > 
> > > > +# e.g. fsxattr.xflags = 0x0 [--------------C-]
> > > > +# Returns 0 if passed flag character is set, otherwise returns 1
> > > > +_test_xfs_xflags_field()
> > > > +{
> > > > +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
> > > > +        && return 0 || return 1
> > > 
> > > That's too complex. Those "return" aren't needed as Darrick metioned. About
> > > that two "grep", how about combine them, e.g.
> > > 
> > > _test_xfs_xflags_field()
> > > {
> > > 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
> > > }
> > > 
> > > 
> > > 
> > > > +}
> > > > +
> > > >  _setup_large_xfs_fs()
> > > >  {
> > > >  	fs_size=$1
> > > > diff --git a/tests/xfs/207 b/tests/xfs/207
> > > > index bbe21307..adb925df 100755
> > > > --- a/tests/xfs/207
> > > > +++ b/tests/xfs/207
> > > > @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > >  . ./common/reflink
> > > > +. ./common/xfs
> > > 
> > > Is this really necessary? Will this test fail without this line?
> > > The common/$FSTYP file is imported automatically, if it's not, that a bug.
> > 
> > If the generic helper goes in common/rc instead then it's not necessary
> > at all.
> 
> Won't the "_source_specific_fs $FSTYP" in common/rc helps to import common/xfs?

Yeah, that too.

--D

> > 
> > --D
> > 
> > > Thanks,
> > > Zorro
> > > 
> > > >  
> > > >  _require_scratch_reflink
> > > >  _require_cp_reflink
> > > >  _require_xfs_io_command "fiemap"
> > > >  _require_xfs_io_command "cowextsize"
> > > >  
> > > > -# Takes the fsxattr.xflags line,
> > > > -# i.e. fsxattr.xflags = 0x0 [--------------C-]
> > > > -# and tests whether a flag character is set
> > > > -test_xflag()
> > > > -{
> > > > -    local flg=$1
> > > > -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
> > > > -}
> > > > -
> > > >  echo "Format and mount"
> > > >  _scratch_mkfs > $seqres.full 2>&1
> > > >  _scratch_mount >> $seqres.full 2>&1
> > > > @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
> > > >  $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
> > > >  _scratch_cycle_mount
> > > >  
> > > > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > > > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> > > >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> > > >  
> > > >  echo "Unset cowextsize and check flag"
> > > >  $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
> > > >  _scratch_cycle_mount
> > > >  
> > > > -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
> > > > +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
> > > >  $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
> > > >  
> > > >  status=0
> > > > -- 
> > > > 2.43.5
> > > > 
> > > > 
> > > 
> > 
> 
> 

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

* Re: [PATCH 2/2] generic: Addition of new tests for extsize hints
  2024-10-24 18:14   ` Darrick J. Wong
@ 2024-10-25  6:12     ` Nirjhar Roy
  2024-11-14  9:45     ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-25  6:12 UTC (permalink / raw)
  To: Darrick J. Wong
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang


On 10/24/24 23:44, Darrick J. Wong wrote:
> On Wed, Oct 23, 2024 at 12:56:20AM +0530, Nirjhar Roy wrote:
>> This commit adds new tests that checks the behaviour of xfs/ext4
>> filesystems when extsize hint is set on file with inode size as 0, non-empty
>> files with allocated and delalloc extents and so on.
>> Although currently this test is placed under tests/generic, it
>> only runs on xfs and there is an ongoing patch series[1] to enable
>> extsize hints for ext4 as well.
>>
>> [1] https://lore.kernel.org/linux-ext4/cover.1726034272.git.ojaswin@linux.ibm.com/
>>
>> Suggested-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>> ---
>>   tests/generic/365     | 156 ++++++++++++++++++++++++++++++++++++++++++
>>   tests/generic/365.out |  26 +++++++
>>   2 files changed, 182 insertions(+)
>>   create mode 100755 tests/generic/365
>>   create mode 100644 tests/generic/365.out
>>
>> diff --git a/tests/generic/365 b/tests/generic/365
>> new file mode 100755
>> index 00000000..85a7ce9a
>> --- /dev/null
>> +++ b/tests/generic/365
>> @@ -0,0 +1,156 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2024 Nirjhar Roy (nirjhar@linux.ibm.com).  All Rights Reserved.
>> +#
>> +# FS QA Test 365
>> +#
>> +# This test verifies that extent allocation hint setting works correctly on files with
>> +# no extents allocated and non-empty files which are truncated. It also checks that the
>> +# extent hints setting fails with non-empty file i.e, with any file with allocated
>> +# extents or delayed allocation. We also check if the extsize value and the
>> +# xflag bit actually got reflected after setting/re-setting the extsize value.
>> +
>> +. ./common/config
>> +. ./common/filter
>> +. ./common/preamble
>> +. ./common/xfs
>> +
>> +_begin_fstest ioctl quick
>> +
>> +_supported_fs xfs
>> +
>> +_fixed_by_kernel_commit XXXXXXXXXXXX \
>> +    "xfs: Check for delayed allocations before setting extsize",
>> +
>> +_require_scratch
>> +
>> +FILE_DATA_SIZE=1M
> Do these tests work correctly with fsblock size of 64k?  Just curious
> since Pankaj just sent a series doing 1M -> 4M bumps to fix quota
> issues.
Yes I have tested this with 2k, 4k, 16k, 64k on ppc64le and x86_64
>> +filter_extsz()
>> +{
>> +    sed "s/$EXTSIZE/EXTSIZE/g"
>> +}
>> +
>> +setup()
>> +{
>> +    _scratch_mkfs >> "$seqres.full"  2>&1
>> +    _scratch_mount >> "$seqres.full" 2>&1
>> +    BLKSZ=`_get_block_size $SCRATCH_MNT`
>> +    EXTSIZE=$(( BLKSZ*2 ))
> Might want to check that there isn't an extsize/cowextsize set on the
> root directory due to mkfs options.
Noted.
>
>> +}
>> +
>> +read_file_extsize()
>> +{
>> +    $XFS_IO_PROG -c "extsize" $1 | _filter_scratch | filter_extsz
>> +}
>> +
>> +check_extsz_and_xflag()
>> +{
>> +    local filename=$1
>> +    read_file_extsize $filename
>> +    _test_xfs_xflags_field $filename "e" && echo "e flag set" || echo "e flag unset"
>> +}
>> +
>> +check_extsz_xflag_across_remount()
>> +{
>> +    local filename=$1
>> +    _scratch_cycle_mount
>> +    check_extsz_and_xflag $filename
>> +}
>> +
>> +# Extsize flag should be cleared when extsize is reset, so this function
>> +# checks that this behavior is followed.
>> +reset_extsz_and_recheck_extsz_xflag()
>> +{
>> +    local filename=$1
>> +    echo "Re-setting extsize hint to 0"
>> +    $XFS_IO_PROG -c "extsize 0" $filename
>> +    check_extsz_xflag_across_remount $filename
>> +}
>> +
>> +check_extsz_xflag_before_and_after_reset()
>> +{
>> +    local filename=$1
>> +    check_extsz_xflag_across_remount $filename
>> +    reset_extsz_and_recheck_extsz_xflag $filename
>> +}
>> +
>> +test_empty_file()
>> +{
>> +    echo "TEST: Set extsize on empty file"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_before_and_after_reset $filename
>> +    echo
>> +}
>> +
>> +test_data_delayed()
>> +{
>> +    echo "TEST: Set extsize on non-empty file with delayed allocation"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
>> +        -c "extsize $EXTSIZE" | _filter_scratch
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_data_allocated()
>> +{
>> +    echo "TEST: Set extsize on non-empty file with allocated extents"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
>> +        -c "extsize $EXTSIZE" | _filter_scratch
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_truncate_allocated()
>> +{
>> +    echo "TEST: Set extsize after truncating a file with allocated extents"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
>> +        -c "truncate 0" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_truncate_delayed()
>> +{
>> +    echo "TEST: Set extsize after truncating a file with delayed allocation"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
>> +        -c "truncate 0" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
> Does this work for filesystems that don't have delalloc?  Like fsdax
> filesystems?
>
> --D
I haven't tested this on fsdax filesystem. Only tested on xfs with 
various bs.
>
>> +setup
>> +echo -e "EXTSIZE = $EXTSIZE BLOCKSIZE = $BLKSZ\n" >> "$seqres.full"
>> +
>> +NEW_FILE_NAME_PREFIX=$SCRATCH_MNT/new-file-
>> +
>> +test_empty_file "$NEW_FILE_NAME_PREFIX"00
>> +test_data_delayed "$NEW_FILE_NAME_PREFIX"01
>> +test_data_allocated "$NEW_FILE_NAME_PREFIX"02
>> +test_truncate_allocated "$NEW_FILE_NAME_PREFIX"03
>> +test_truncate_delayed "$NEW_FILE_NAME_PREFIX"04
>> +
>> +status=0
>> +exit
>> diff --git a/tests/generic/365.out b/tests/generic/365.out
>> new file mode 100644
>> index 00000000..38cd0885
>> --- /dev/null
>> +++ b/tests/generic/365.out
>> @@ -0,0 +1,26 @@
>> +QA output created by 365
>> +TEST: Set extsize on empty file
>> +[EXTSIZE] SCRATCH_MNT/new-file-00
>> +e flag set
>> +Re-setting extsize hint to 0
>> +[0] SCRATCH_MNT/new-file-00
>> +e flag unset
>> +
>> +TEST: Set extsize on non-empty file with delayed allocation
>> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-01: Invalid argument
>> +[0] SCRATCH_MNT/new-file-01
>> +e flag unset
>> +
>> +TEST: Set extsize on non-empty file with allocated extents
>> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-02: Invalid argument
>> +[0] SCRATCH_MNT/new-file-02
>> +e flag unset
>> +
>> +TEST: Set extsize after truncating a file with allocated extents
>> +[EXTSIZE] SCRATCH_MNT/new-file-03
>> +e flag set
>> +
>> +TEST: Set extsize after truncating a file with delayed allocation
>> +[EXTSIZE] SCRATCH_MNT/new-file-04
>> +e flag set
>> +
>> -- 
>> 2.43.5
>>
>>
-- 
---
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  2:56   ` Zorro Lang
  2024-10-25  4:07     ` Darrick J. Wong
@ 2024-10-25  6:14     ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-25  6:14 UTC (permalink / raw)
  To: Zorro Lang
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, djwong,
	zlang


On 10/25/24 08:26, Zorro Lang wrote:
> On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
>> This patch defines a common helper function to test whether any of
>> fsxattr xflags field is set or not. We will use this helper in the next
>> patch for checking extsize (e) flag.
>>
>> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>> ---
>>   common/xfs    |  9 +++++++++
>>   tests/xfs/207 | 14 +++-----------
>>   2 files changed, 12 insertions(+), 11 deletions(-)
>>
>> diff --git a/common/xfs b/common/xfs
>> index 62e3100e..7340ccbf 100644
>> --- a/common/xfs
>> +++ b/common/xfs
>> @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
>>   	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
>>   }
>>   
>> +# Check whether a fsxattr xflags character field is set on a given file.
> Better to explain the arguments, e.g.
>
> # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
Noted.
>
>> +# e.g. fsxattr.xflags = 0x0 [--------------C-]
>> +# Returns 0 if passed flag character is set, otherwise returns 1
>> +_test_xfs_xflags_field()
>> +{
>> +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
>> +        && return 0 || return 1
> That's too complex. Those "return" aren't needed as Darrick metioned. About
> that two "grep", how about combine them, e.g.
>
> _test_xfs_xflags_field()
> {
> 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
> }
>
Yes. This looks better. Thank you for the suggestion.
>
>> +}
>> +
>>   _setup_large_xfs_fs()
>>   {
>>   	fs_size=$1
>> diff --git a/tests/xfs/207 b/tests/xfs/207
>> index bbe21307..adb925df 100755
>> --- a/tests/xfs/207
>> +++ b/tests/xfs/207
>> @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
>>   # Import common functions.
>>   . ./common/filter
>>   . ./common/reflink
>> +. ./common/xfs
> Is this really necessary? Will this test fail without this line?
> The common/$FSTYP file is imported automatically, if it's not, that a bug.
>
> Thanks,
> Zorro
No, actually, it isn't. I have verified. Also, I am moving the helper 
function to common/rc, so this will not be required anyway.
>
>>   
>>   _require_scratch_reflink
>>   _require_cp_reflink
>>   _require_xfs_io_command "fiemap"
>>   _require_xfs_io_command "cowextsize"
>>   
>> -# Takes the fsxattr.xflags line,
>> -# i.e. fsxattr.xflags = 0x0 [--------------C-]
>> -# and tests whether a flag character is set
>> -test_xflag()
>> -{
>> -    local flg=$1
>> -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
>> -}
>> -
>>   echo "Format and mount"
>>   _scratch_mkfs > $seqres.full 2>&1
>>   _scratch_mount >> $seqres.full 2>&1
>> @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
>>   $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
>>   _scratch_cycle_mount
>>   
>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>   
>>   echo "Unset cowextsize and check flag"
>>   $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
>>   _scratch_cycle_mount
>>   
>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>   
>>   status=0
>> -- 
>> 2.43.5
>>
>>
-- 
---
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  4:07     ` Darrick J. Wong
  2024-10-25  4:15       ` Zorro Lang
@ 2024-10-25  6:16       ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-25  6:16 UTC (permalink / raw)
  To: Darrick J. Wong, Zorro Lang
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang


On 10/25/24 09:37, Darrick J. Wong wrote:
> On Fri, Oct 25, 2024 at 10:56:51AM +0800, Zorro Lang wrote:
>> On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
>>> This patch defines a common helper function to test whether any of
>>> fsxattr xflags field is set or not. We will use this helper in the next
>>> patch for checking extsize (e) flag.
>>>
>>> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>>> ---
>>>   common/xfs    |  9 +++++++++
>>>   tests/xfs/207 | 14 +++-----------
>>>   2 files changed, 12 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/common/xfs b/common/xfs
>>> index 62e3100e..7340ccbf 100644
>>> --- a/common/xfs
>>> +++ b/common/xfs
>>> @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
>>>   	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
>>>   }
>>>   
>>> +# Check whether a fsxattr xflags character field is set on a given file.
>> Better to explain the arguments, e.g.
>>
>> # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
>>
>>> +# e.g. fsxattr.xflags = 0x0 [--------------C-]
>>> +# Returns 0 if passed flag character is set, otherwise returns 1
>>> +_test_xfs_xflags_field()
>>> +{
>>> +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
>>> +        && return 0 || return 1
>> That's too complex. Those "return" aren't needed as Darrick metioned. About
>> that two "grep", how about combine them, e.g.
>>
>> _test_xfs_xflags_field()
>> {
>> 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
>> }
>>
>>
>>
>>> +}
>>> +
>>>   _setup_large_xfs_fs()
>>>   {
>>>   	fs_size=$1
>>> diff --git a/tests/xfs/207 b/tests/xfs/207
>>> index bbe21307..adb925df 100755
>>> --- a/tests/xfs/207
>>> +++ b/tests/xfs/207
>>> @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
>>>   # Import common functions.
>>>   . ./common/filter
>>>   . ./common/reflink
>>> +. ./common/xfs
>> Is this really necessary? Will this test fail without this line?
>> The common/$FSTYP file is imported automatically, if it's not, that a bug.
> If the generic helper goes in common/rc instead then it's not necessary
> at all.
>
> --D
Yeah, this makes sense.
>
>> Thanks,
>> Zorro
>>
>>>   
>>>   _require_scratch_reflink
>>>   _require_cp_reflink
>>>   _require_xfs_io_command "fiemap"
>>>   _require_xfs_io_command "cowextsize"
>>>   
>>> -# Takes the fsxattr.xflags line,
>>> -# i.e. fsxattr.xflags = 0x0 [--------------C-]
>>> -# and tests whether a flag character is set
>>> -test_xflag()
>>> -{
>>> -    local flg=$1
>>> -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
>>> -}
>>> -
>>>   echo "Format and mount"
>>>   _scratch_mkfs > $seqres.full 2>&1
>>>   _scratch_mount >> $seqres.full 2>&1
>>> @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
>>>   $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
>>>   _scratch_cycle_mount
>>>   
>>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>>   
>>>   echo "Unset cowextsize and check flag"
>>>   $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
>>>   _scratch_cycle_mount
>>>   
>>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>>   
>>>   status=0
>>> -- 
>>> 2.43.5
>>>
>>>
-- 
---
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


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

* Re: [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file
  2024-10-25  4:15       ` Zorro Lang
  2024-10-25  5:27         ` Darrick J. Wong
@ 2024-10-25  6:17         ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-10-25  6:17 UTC (permalink / raw)
  To: Zorro Lang, Darrick J. Wong
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang


On 10/25/24 09:45, Zorro Lang wrote:
> On Thu, Oct 24, 2024 at 09:07:03PM -0700, Darrick J. Wong wrote:
>> On Fri, Oct 25, 2024 at 10:56:51AM +0800, Zorro Lang wrote:
>>> On Wed, Oct 23, 2024 at 12:56:19AM +0530, Nirjhar Roy wrote:
>>>> This patch defines a common helper function to test whether any of
>>>> fsxattr xflags field is set or not. We will use this helper in the next
>>>> patch for checking extsize (e) flag.
>>>>
>>>> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>>>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>>>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>>>> ---
>>>>   common/xfs    |  9 +++++++++
>>>>   tests/xfs/207 | 14 +++-----------
>>>>   2 files changed, 12 insertions(+), 11 deletions(-)
>>>>
>>>> diff --git a/common/xfs b/common/xfs
>>>> index 62e3100e..7340ccbf 100644
>>>> --- a/common/xfs
>>>> +++ b/common/xfs
>>>> @@ -13,6 +13,15 @@ __generate_xfs_report_vars() {
>>>>   	REPORT_ENV_LIST_OPT+=("TEST_XFS_REPAIR_REBUILD" "TEST_XFS_SCRUB_REBUILD")
>>>>   }
>>>>   
>>>> +# Check whether a fsxattr xflags character field is set on a given file.
>>> Better to explain the arguments, e.g.
>>>
>>> # Check whether a fsxattr xflags character ($2) field is set on a given file ($1).
>>>
>>>> +# e.g. fsxattr.xflags = 0x0 [--------------C-]
>>>> +# Returns 0 if passed flag character is set, otherwise returns 1
>>>> +_test_xfs_xflags_field()
>>>> +{
>>>> +    $XFS_IO_PROG -c "stat" "$1" | grep "fsxattr.xflags" | grep -q "\[.*$2.*\]" \
>>>> +        && return 0 || return 1
>>> That's too complex. Those "return" aren't needed as Darrick metioned. About
>>> that two "grep", how about combine them, e.g.
>>>
>>> _test_xfs_xflags_field()
>>> {
>>> 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat" "$1")
>>> }
>>>
>>>
>>>
>>>> +}
>>>> +
>>>>   _setup_large_xfs_fs()
>>>>   {
>>>>   	fs_size=$1
>>>> diff --git a/tests/xfs/207 b/tests/xfs/207
>>>> index bbe21307..adb925df 100755
>>>> --- a/tests/xfs/207
>>>> +++ b/tests/xfs/207
>>>> @@ -15,21 +15,13 @@ _begin_fstest auto quick clone fiemap
>>>>   # Import common functions.
>>>>   . ./common/filter
>>>>   . ./common/reflink
>>>> +. ./common/xfs
>>> Is this really necessary? Will this test fail without this line?
>>> The common/$FSTYP file is imported automatically, if it's not, that a bug.
>> If the generic helper goes in common/rc instead then it's not necessary
>> at all.
> Won't the "_source_specific_fs $FSTYP" in common/rc helps to import common/xfs?
Yeah, it gets imported automatically(I have verified). Anyway, I am 
moving the helper function to common/rc, so this won't be required.
>
>> --D
>>
>>> Thanks,
>>> Zorro
>>>
>>>>   
>>>>   _require_scratch_reflink
>>>>   _require_cp_reflink
>>>>   _require_xfs_io_command "fiemap"
>>>>   _require_xfs_io_command "cowextsize"
>>>>   
>>>> -# Takes the fsxattr.xflags line,
>>>> -# i.e. fsxattr.xflags = 0x0 [--------------C-]
>>>> -# and tests whether a flag character is set
>>>> -test_xflag()
>>>> -{
>>>> -    local flg=$1
>>>> -    grep -q "\[.*${flg}.*\]" && echo "$flg flag set" || echo "$flg flag unset"
>>>> -}
>>>> -
>>>>   echo "Format and mount"
>>>>   _scratch_mkfs > $seqres.full 2>&1
>>>>   _scratch_mount >> $seqres.full 2>&1
>>>> @@ -65,14 +57,14 @@ echo "Set cowextsize and check flag"
>>>>   $XFS_IO_PROG -c "cowextsize 1048576" $testdir/file3 | _filter_scratch
>>>>   _scratch_cycle_mount
>>>>   
>>>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>>>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>>>   
>>>>   echo "Unset cowextsize and check flag"
>>>>   $XFS_IO_PROG -c "cowextsize 0" $testdir/file3 | _filter_scratch
>>>>   _scratch_cycle_mount
>>>>   
>>>> -$XFS_IO_PROG -c "stat" $testdir/file3 | grep 'fsxattr.xflags' | test_xflag "C"
>>>> +_test_xfs_xflags_field "$testdir/file3" "C" && echo "C flag set" || echo "C flag unset"
>>>>   $XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
>>>>   
>>>>   status=0
>>>> -- 
>>>> 2.43.5
>>>>
>>>>
-- 
---
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


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

* Re: [PATCH 2/2] generic: Addition of new tests for extsize hints
  2024-10-24 18:14   ` Darrick J. Wong
  2024-10-25  6:12     ` Nirjhar Roy
@ 2024-11-14  9:45     ` Nirjhar Roy
  1 sibling, 0 replies; 14+ messages in thread
From: Nirjhar Roy @ 2024-11-14  9:45 UTC (permalink / raw)
  To: Darrick J. Wong
  Cc: fstests, linux-ext4, linux-xfs, ritesh.list, ojaswin, zlang


On 10/24/24 23:44, Darrick J. Wong wrote:
> On Wed, Oct 23, 2024 at 12:56:20AM +0530, Nirjhar Roy wrote:
>> This commit adds new tests that checks the behaviour of xfs/ext4
>> filesystems when extsize hint is set on file with inode size as 0, non-empty
>> files with allocated and delalloc extents and so on.
>> Although currently this test is placed under tests/generic, it
>> only runs on xfs and there is an ongoing patch series[1] to enable
>> extsize hints for ext4 as well.
>>
>> [1] https://lore.kernel.org/linux-ext4/cover.1726034272.git.ojaswin@linux.ibm.com/
>>
>> Suggested-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>> ---
>>   tests/generic/365     | 156 ++++++++++++++++++++++++++++++++++++++++++
>>   tests/generic/365.out |  26 +++++++
>>   2 files changed, 182 insertions(+)
>>   create mode 100755 tests/generic/365
>>   create mode 100644 tests/generic/365.out
>>
>> diff --git a/tests/generic/365 b/tests/generic/365
>> new file mode 100755
>> index 00000000..85a7ce9a
>> --- /dev/null
>> +++ b/tests/generic/365
>> @@ -0,0 +1,156 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2024 Nirjhar Roy (nirjhar@linux.ibm.com).  All Rights Reserved.
>> +#
>> +# FS QA Test 365
>> +#
>> +# This test verifies that extent allocation hint setting works correctly on files with
>> +# no extents allocated and non-empty files which are truncated. It also checks that the
>> +# extent hints setting fails with non-empty file i.e, with any file with allocated
>> +# extents or delayed allocation. We also check if the extsize value and the
>> +# xflag bit actually got reflected after setting/re-setting the extsize value.
>> +
>> +. ./common/config
>> +. ./common/filter
>> +. ./common/preamble
>> +. ./common/xfs
>> +
>> +_begin_fstest ioctl quick
>> +
>> +_supported_fs xfs
>> +
>> +_fixed_by_kernel_commit XXXXXXXXXXXX \
>> +    "xfs: Check for delayed allocations before setting extsize",
>> +
>> +_require_scratch
>> +
>> +FILE_DATA_SIZE=1M
> Do these tests work correctly with fsblock size of 64k?  Just curious
> since Pankaj just sent a series doing 1M -> 4M bumps to fix quota
> issues.
>
>> +filter_extsz()
>> +{
>> +    sed "s/$EXTSIZE/EXTSIZE/g"
>> +}
>> +
>> +setup()
>> +{
>> +    _scratch_mkfs >> "$seqres.full"  2>&1
>> +    _scratch_mount >> "$seqres.full" 2>&1
>> +    BLKSZ=`_get_block_size $SCRATCH_MNT`
>> +    EXTSIZE=$(( BLKSZ*2 ))
> Might want to check that there isn't an extsize/cowextsize set on the
> root directory due to mkfs options.

We have made some changes in the tests in v2 so that the test behaves as 
expected with preset extsize/extszinherit mkfs options on the root. Also 
tested with  mkfs.xfs from [1]. I will send PATCH v2 shortly.

[1]. 
https://lore.kernel.org/all/20230929095342.2976587-7-john.g.garry@oracle.com/

>
>> +}
>> +
>> +read_file_extsize()
>> +{
>> +    $XFS_IO_PROG -c "extsize" $1 | _filter_scratch | filter_extsz
>> +}
>> +
>> +check_extsz_and_xflag()
>> +{
>> +    local filename=$1
>> +    read_file_extsize $filename
>> +    _test_xfs_xflags_field $filename "e" && echo "e flag set" || echo "e flag unset"
>> +}
>> +
>> +check_extsz_xflag_across_remount()
>> +{
>> +    local filename=$1
>> +    _scratch_cycle_mount
>> +    check_extsz_and_xflag $filename
>> +}
>> +
>> +# Extsize flag should be cleared when extsize is reset, so this function
>> +# checks that this behavior is followed.
>> +reset_extsz_and_recheck_extsz_xflag()
>> +{
>> +    local filename=$1
>> +    echo "Re-setting extsize hint to 0"
>> +    $XFS_IO_PROG -c "extsize 0" $filename
>> +    check_extsz_xflag_across_remount $filename
>> +}
>> +
>> +check_extsz_xflag_before_and_after_reset()
>> +{
>> +    local filename=$1
>> +    check_extsz_xflag_across_remount $filename
>> +    reset_extsz_and_recheck_extsz_xflag $filename
>> +}
>> +
>> +test_empty_file()
>> +{
>> +    echo "TEST: Set extsize on empty file"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_before_and_after_reset $filename
>> +    echo
>> +}
>> +
>> +test_data_delayed()
>> +{
>> +    echo "TEST: Set extsize on non-empty file with delayed allocation"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
>> +        -c "extsize $EXTSIZE" | _filter_scratch
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_data_allocated()
>> +{
>> +    echo "TEST: Set extsize on non-empty file with allocated extents"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
>> +        -c "extsize $EXTSIZE" | _filter_scratch
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_truncate_allocated()
>> +{
>> +    echo "TEST: Set extsize after truncating a file with allocated extents"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -qW  0 $FILE_DATA_SIZE" \
>> +        -c "truncate 0" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
>> +
>> +test_truncate_delayed()
>> +{
>> +    echo "TEST: Set extsize after truncating a file with delayed allocation"
>> +    local filename=$1
>> +    $XFS_IO_PROG \
>> +        -c "open -f $filename" \
>> +        -c "pwrite -q  0 $FILE_DATA_SIZE" \
>> +        -c "truncate 0" \
>> +        -c "extsize $EXTSIZE" \
>> +
>> +    check_extsz_xflag_across_remount $filename
>> +    echo
>> +}
> Does this work for filesystems that don't have delalloc?  Like fsdax
> filesystems?
>
> --D
>
>> +setup
>> +echo -e "EXTSIZE = $EXTSIZE BLOCKSIZE = $BLKSZ\n" >> "$seqres.full"
>> +
>> +NEW_FILE_NAME_PREFIX=$SCRATCH_MNT/new-file-
>> +
>> +test_empty_file "$NEW_FILE_NAME_PREFIX"00
>> +test_data_delayed "$NEW_FILE_NAME_PREFIX"01
>> +test_data_allocated "$NEW_FILE_NAME_PREFIX"02
>> +test_truncate_allocated "$NEW_FILE_NAME_PREFIX"03
>> +test_truncate_delayed "$NEW_FILE_NAME_PREFIX"04
>> +
>> +status=0
>> +exit
>> diff --git a/tests/generic/365.out b/tests/generic/365.out
>> new file mode 100644
>> index 00000000..38cd0885
>> --- /dev/null
>> +++ b/tests/generic/365.out
>> @@ -0,0 +1,26 @@
>> +QA output created by 365
>> +TEST: Set extsize on empty file
>> +[EXTSIZE] SCRATCH_MNT/new-file-00
>> +e flag set
>> +Re-setting extsize hint to 0
>> +[0] SCRATCH_MNT/new-file-00
>> +e flag unset
>> +
>> +TEST: Set extsize on non-empty file with delayed allocation
>> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-01: Invalid argument
>> +[0] SCRATCH_MNT/new-file-01
>> +e flag unset
>> +
>> +TEST: Set extsize on non-empty file with allocated extents
>> +xfs_io: FS_IOC_FSSETXATTR SCRATCH_MNT/new-file-02: Invalid argument
>> +[0] SCRATCH_MNT/new-file-02
>> +e flag unset
>> +
>> +TEST: Set extsize after truncating a file with allocated extents
>> +[EXTSIZE] SCRATCH_MNT/new-file-03
>> +e flag set
>> +
>> +TEST: Set extsize after truncating a file with delayed allocation
>> +[EXTSIZE] SCRATCH_MNT/new-file-04
>> +e flag set
>> +
>> -- 
>> 2.43.5
>>
>>
-- 
---
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


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

end of thread, other threads:[~2024-11-14  9:46 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-22 19:26 [PATCH 0/2] generic: Addition of new tests for extsize hints Nirjhar Roy
2024-10-22 19:26 ` [PATCH 1/2] common/xfs,xfs/207: Adding a common helper function to check xflag bits on a given file Nirjhar Roy
2024-10-24 18:08   ` Darrick J. Wong
2024-10-25  2:56   ` Zorro Lang
2024-10-25  4:07     ` Darrick J. Wong
2024-10-25  4:15       ` Zorro Lang
2024-10-25  5:27         ` Darrick J. Wong
2024-10-25  6:17         ` Nirjhar Roy
2024-10-25  6:16       ` Nirjhar Roy
2024-10-25  6:14     ` Nirjhar Roy
2024-10-22 19:26 ` [PATCH 2/2] generic: Addition of new tests for extsize hints Nirjhar Roy
2024-10-24 18:14   ` Darrick J. Wong
2024-10-25  6:12     ` Nirjhar Roy
2024-11-14  9:45     ` Nirjhar Roy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).