* [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1
@ 2020-10-17 21:50 Darrick J. Wong
2020-10-17 21:51 ` [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2 Darrick J. Wong
2020-10-19 12:53 ` [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Chandan Babu R
0 siblings, 2 replies; 4+ messages in thread
From: Darrick J. Wong @ 2020-10-17 21:50 UTC (permalink / raw)
To: Christoph Hellwig, Chandan Babu R; +Cc: xfs
From: Darrick J. Wong <darrick.wong@oracle.com>
In commit fe341eb151ec, I forgot that xfs_free_file_space isn't strictly
a "remove mapped blocks" function. It is actually a function to zero
file space by punching out the middle and writing zeroes to the
unaligned ends of the specified range. Therefore, putting a rtextsize
alignment check in that function is wrong because that breaks unaligned
ZERO_RANGE on the realtime volume.
Furthermore, xfs_file_fallocate already has alignment checks for the
functions require the file range to be aligned to the size of a
fundamental allocation unit (which is 1 FSB on the data volume and 1 rt
extent on the realtime volume). Create a new helper to check fallocate
arguments against the realtiem allocation unit size, fix the fallocate
frontend to use it, fix free_file_space to delete the correct range, and
remove a now redundant check from insert_file_space.
NOTE: The realtime extent size is not required to be a power of two!
Fixes: fe341eb151ec ("xfs: ensure that fpunch, fcollapse, and finsert operations are aligned to rt extent size")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: fix this to actually handle rtextsize not being a power of 2, add
testcase
---
fs/xfs/xfs_bmap_util.c | 17 ++++-------------
fs/xfs/xfs_file.c | 40 +++++++++++++++++++++++++++++++++++-----
2 files changed, 39 insertions(+), 18 deletions(-)
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index f2a8a0e75e1f..52cddcfee8a1 100644
--- a/fs/xfs/xfs_bmap_util.c
+++ b/fs/xfs/xfs_bmap_util.c
@@ -947,11 +947,10 @@ xfs_free_file_space(
endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len);
/* We can only free complete realtime extents. */
- if (XFS_IS_REALTIME_INODE(ip)) {
- xfs_extlen_t extsz = xfs_get_extsz_hint(ip);
-
- if ((startoffset_fsb | endoffset_fsb) & (extsz - 1))
- return -EINVAL;
+ if (XFS_IS_REALTIME_INODE(ip) && mp->m_sb.sb_rextsize > 0) {
+ startoffset_fsb = round_up(startoffset_fsb,
+ mp->m_sb.sb_rextsize);
+ endoffset_fsb = round_down(endoffset_fsb, mp->m_sb.sb_rextsize);
}
/*
@@ -1147,14 +1146,6 @@ xfs_insert_file_space(
trace_xfs_insert_file_space(ip);
- /* We can only insert complete realtime extents. */
- if (XFS_IS_REALTIME_INODE(ip)) {
- xfs_extlen_t extsz = xfs_get_extsz_hint(ip);
-
- if ((stop_fsb | shift_fsb) & (extsz - 1))
- return -EINVAL;
- }
-
error = xfs_bmap_can_insert_extents(ip, stop_fsb, shift_fsb);
if (error)
return error;
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 3d1b95124744..9e97815887c5 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -785,6 +785,39 @@ xfs_break_layouts(
return error;
}
+/*
+ * Decide if the given file range is aligned to the size of the fundamental
+ * allocation unit for the file.
+ */
+static bool
+xfs_is_falloc_aligned(
+ struct xfs_inode *ip,
+ loff_t pos,
+ long long int len)
+{
+ struct xfs_mount *mp = ip->i_mount;
+ uint64_t mask;
+
+ if (XFS_IS_REALTIME_INODE(ip)) {
+ if (!is_power_of_2(mp->m_sb.sb_rextsize)) {
+ u64 rextbytes;
+ u32 mod;
+
+ rextbytes = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize);
+ div_u64_rem(pos, rextbytes, &mod);
+ if (mod)
+ return false;
+ div_u64_rem(len, rextbytes, &mod);
+ return mod == 0;
+ }
+ mask = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize) - 1;
+ } else {
+ mask = mp->m_sb.sb_blocksize - 1;
+ }
+
+ return !((pos | len) & mask);
+}
+
#define XFS_FALLOC_FL_SUPPORTED \
(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \
FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \
@@ -850,9 +883,7 @@ xfs_file_fallocate(
if (error)
goto out_unlock;
} else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
- unsigned int blksize_mask = i_blocksize(inode) - 1;
-
- if (offset & blksize_mask || len & blksize_mask) {
+ if (!xfs_is_falloc_aligned(ip, offset, len)) {
error = -EINVAL;
goto out_unlock;
}
@@ -872,10 +903,9 @@ xfs_file_fallocate(
if (error)
goto out_unlock;
} else if (mode & FALLOC_FL_INSERT_RANGE) {
- unsigned int blksize_mask = i_blocksize(inode) - 1;
loff_t isize = i_size_read(inode);
- if (offset & blksize_mask || len & blksize_mask) {
+ if (!xfs_is_falloc_aligned(ip, offset, len)) {
error = -EINVAL;
goto out_unlock;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2
2020-10-17 21:50 [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Darrick J. Wong
@ 2020-10-17 21:51 ` Darrick J. Wong
2020-10-20 5:00 ` Chandan Babu R
2020-10-19 12:53 ` [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Chandan Babu R
1 sibling, 1 reply; 4+ messages in thread
From: Darrick J. Wong @ 2020-10-17 21:51 UTC (permalink / raw)
To: Christoph Hellwig, Chandan Babu R; +Cc: xfs
From: Darrick J. Wong <darrick.wong@oracle.com>
Make sure that fallocate works when the rt extent size is and isn't a
power of 2.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
tests/xfs/763 | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/xfs/763.out | 55 +++++++++++++++++++
tests/xfs/group | 1
3 files changed, 208 insertions(+)
create mode 100755 tests/xfs/763
create mode 100644 tests/xfs/763.out
diff --git a/tests/xfs/763 b/tests/xfs/763
new file mode 100755
index 00000000..a4351bd9
--- /dev/null
+++ b/tests/xfs/763
@@ -0,0 +1,152 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved.
+#
+# FS QA Test No. 763
+#
+# Make sure that regular fallocate functions work ok when the realtime extent
+# size is and isn't a power of 2.
+#
+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
+
+# real QA test starts here
+_supported_fs xfs
+_require_xfs_io_command "fpunch"
+_require_xfs_io_command "fzero"
+_require_xfs_io_command "fcollapse"
+_require_xfs_io_command "finsert"
+# Note that we don't _require_realtime because we synthesize a rt volume
+# below. This also means we cannot run the post-test check.
+_require_scratch_nocheck
+
+log() {
+ echo "$@" | tee -a $seqres.full
+}
+
+mk_file() {
+ local file="$1"
+ local rextsize="$2"
+
+ $XFS_IO_PROG -f \
+ -c "pwrite -S 0x57 -b $rextsize 0 $rextsize" \
+ -c "pwrite -S 0x58 -b $rextsize $rextsize $rextsize" \
+ -c "pwrite -S 0x59 -b $rextsize $((rextsize * 2)) $rextsize" \
+ -c fsync \
+ "$file" >> $seqres.full
+}
+
+check_file() {
+ filefrag -v "$1" >> $seqres.full
+ od -tx1 -Ad -c "$1" >> $seqres.full
+ md5sum "$1" | _filter_scratch | tee -a $seqres.full
+}
+
+test_ops() {
+ local rextsize=$1
+ local unaligned_sz=65536
+ local sz=$((rextsize * 3))
+
+ log "Format rtextsize=$rextsize"
+ _scratch_unmount
+ _scratch_mkfs -r extsize=$rextsize >> $seqres.full
+ _scratch_mount || \
+ _notrun "Could not mount rextsize=$rextsize with synthetic rt volume"
+
+ # Force all files to be realtime files
+ $XFS_IO_PROG -c 'chattr +t' $SCRATCH_MNT
+
+ log "Test regular write, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/write $rextsize
+ check_file $SCRATCH_MNT/write
+
+ log "Test aligned falloc, rextsize=$rextsize"
+ $XFS_IO_PROG -f -c "falloc 0 $sz" $SCRATCH_MNT/falloc >> $seqres.full
+ check_file $SCRATCH_MNT/falloc
+
+ log "Test aligned fcollapse, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/collapse $rextsize
+ $XFS_IO_PROG -f -c "fcollapse $rextsize $rextsize" $SCRATCH_MNT/collapse >> $seqres.full
+ check_file $SCRATCH_MNT/collapse
+
+ log "Test aligned finsert, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/insert $rextsize
+ $XFS_IO_PROG -f -c "finsert $rextsize $rextsize" $SCRATCH_MNT/insert >> $seqres.full
+ check_file $SCRATCH_MNT/insert
+
+ log "Test aligned fzero, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/zero $rextsize
+ $XFS_IO_PROG -f -c "fzero $rextsize $rextsize" $SCRATCH_MNT/zero >> $seqres.full
+ check_file $SCRATCH_MNT/zero
+
+ log "Test aligned fpunch, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/punch $rextsize
+ $XFS_IO_PROG -f -c "fpunch $rextsize $rextsize" $SCRATCH_MNT/punch >> $seqres.full
+ check_file $SCRATCH_MNT/punch
+
+ log "Test unaligned falloc, rextsize=$rextsize"
+ $XFS_IO_PROG -f -c "falloc $unaligned_sz $unaligned_sz" $SCRATCH_MNT/ufalloc >> $seqres.full
+ check_file $SCRATCH_MNT/ufalloc
+
+ log "Test unaligned fcollapse, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/ucollapse $rextsize
+ $XFS_IO_PROG -f -c "fcollapse $unaligned_sz $unaligned_sz" $SCRATCH_MNT/ucollapse >> $seqres.full
+ check_file $SCRATCH_MNT/ucollapse
+
+ log "Test unaligned finsert, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/uinsert $rextsize
+ $XFS_IO_PROG -f -c "finsert $unaligned_sz $unaligned_sz" $SCRATCH_MNT/uinsert >> $seqres.full
+ check_file $SCRATCH_MNT/uinsert
+
+ log "Test unaligned fzero, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/uzero $rextsize
+ $XFS_IO_PROG -f -c "fzero $unaligned_sz $unaligned_sz" $SCRATCH_MNT/uzero >> $seqres.full
+ check_file $SCRATCH_MNT/uzero
+
+ log "Test unaligned fpunch, rextsize=$rextsize"
+ mk_file $SCRATCH_MNT/upunch $rextsize
+ $XFS_IO_PROG -f -c "fpunch $unaligned_sz $unaligned_sz" $SCRATCH_MNT/upunch >> $seqres.full
+ check_file $SCRATCH_MNT/upunch
+
+ log "Check everything, rextsize=$rextsize"
+ _check_scratch_fs
+}
+
+echo "Create fake rt volume"
+truncate -s 400m $TEST_DIR/$seq.rtvol
+rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
+
+echo "Make sure synth rt volume works"
+export USE_EXTERNAL=yes
+export SCRATCH_RTDEV=$rtdev
+_scratch_mkfs > $seqres.full
+_scratch_mount || \
+ _notrun "Could not mount with synthetic rt volume"
+
+# power of two
+test_ops 262144
+
+# not a power of two
+test_ops 327680
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/763.out b/tests/xfs/763.out
new file mode 100644
index 00000000..b6633fd2
--- /dev/null
+++ b/tests/xfs/763.out
@@ -0,0 +1,55 @@
+QA output created by 763
+Create fake rt volume
+Make sure synth rt volume works
+Format rtextsize=262144
+Test regular write, rextsize=262144
+2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/write
+Test aligned falloc, rextsize=262144
+cb18a5d28e77522dfec6a6255bc3847e SCRATCH_MNT/falloc
+Test aligned fcollapse, rextsize=262144
+2e94746ab733025c21a9cae7d19c18d0 SCRATCH_MNT/collapse
+Test aligned finsert, rextsize=262144
+24e228d3d5f68b612eceec47f8416a7d SCRATCH_MNT/insert
+Test aligned fzero, rextsize=262144
+ecb6eb78ceb5c43ce86d523437b1fa95 SCRATCH_MNT/zero
+Test aligned fpunch, rextsize=262144
+ecb6eb78ceb5c43ce86d523437b1fa95 SCRATCH_MNT/punch
+Test unaligned falloc, rextsize=262144
+0dfbe8aa4c20b52e1b8bf3cb6cbdf193 SCRATCH_MNT/ufalloc
+Test unaligned fcollapse, rextsize=262144
+fallocate: Invalid argument
+2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/ucollapse
+Test unaligned finsert, rextsize=262144
+fallocate: Invalid argument
+2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/uinsert
+Test unaligned fzero, rextsize=262144
+8d87ed880ce111829bab56322a26bad0 SCRATCH_MNT/uzero
+Test unaligned fpunch, rextsize=262144
+8d87ed880ce111829bab56322a26bad0 SCRATCH_MNT/upunch
+Check everything, rextsize=262144
+Format rtextsize=327680
+Test regular write, rextsize=327680
+dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/write
+Test aligned falloc, rextsize=327680
+63a6c5a8b8da92e30cd0ef23c56d4f06 SCRATCH_MNT/falloc
+Test aligned fcollapse, rextsize=327680
+8bdd728a7a4af4ac18bbcbe39dea14d5 SCRATCH_MNT/collapse
+Test aligned finsert, rextsize=327680
+2b178c860f7bef4c0e55399be5172c5e SCRATCH_MNT/insert
+Test aligned fzero, rextsize=327680
+350defefe2530d8eb8d6a6772c81c206 SCRATCH_MNT/zero
+Test aligned fpunch, rextsize=327680
+350defefe2530d8eb8d6a6772c81c206 SCRATCH_MNT/punch
+Test unaligned falloc, rextsize=327680
+0dfbe8aa4c20b52e1b8bf3cb6cbdf193 SCRATCH_MNT/ufalloc
+Test unaligned fcollapse, rextsize=327680
+fallocate: Invalid argument
+dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/ucollapse
+Test unaligned finsert, rextsize=327680
+fallocate: Invalid argument
+dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/uinsert
+Test unaligned fzero, rextsize=327680
+7b728ff6048f52fa533fd902995da41b SCRATCH_MNT/uzero
+Test unaligned fpunch, rextsize=327680
+7b728ff6048f52fa533fd902995da41b SCRATCH_MNT/upunch
+Check everything, rextsize=327680
diff --git a/tests/xfs/group b/tests/xfs/group
index 61d9e82b..2b3159ec 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -543,6 +543,7 @@
760 auto quick rw collapse punch insert zero prealloc
761 auto quick realtime
762 auto quick rw scrub realtime
+763 auto quick rw realtime
908 auto quick bigtime
909 auto quick bigtime quota
910 auto quick inobtcount
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1
2020-10-17 21:50 [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Darrick J. Wong
2020-10-17 21:51 ` [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2 Darrick J. Wong
@ 2020-10-19 12:53 ` Chandan Babu R
1 sibling, 0 replies; 4+ messages in thread
From: Chandan Babu R @ 2020-10-19 12:53 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Christoph Hellwig, xfs
On Sunday 18 October 2020 3:20:11 AM IST Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> In commit fe341eb151ec, I forgot that xfs_free_file_space isn't strictly
> a "remove mapped blocks" function. It is actually a function to zero
> file space by punching out the middle and writing zeroes to the
> unaligned ends of the specified range. Therefore, putting a rtextsize
> alignment check in that function is wrong because that breaks unaligned
> ZERO_RANGE on the realtime volume.
>
> Furthermore, xfs_file_fallocate already has alignment checks for the
> functions require the file range to be aligned to the size of a
> fundamental allocation unit (which is 1 FSB on the data volume and 1 rt
> extent on the realtime volume). Create a new helper to check fallocate
> arguments against the realtiem allocation unit size, fix the fallocate
> frontend to use it, fix free_file_space to delete the correct range, and
> remove a now redundant check from insert_file_space.
>
> NOTE: The realtime extent size is not required to be a power of two!
>
Looks good to me.
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
> Fixes: fe341eb151ec ("xfs: ensure that fpunch, fcollapse, and finsert operations are aligned to rt extent size")
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> v2: fix this to actually handle rtextsize not being a power of 2, add
> testcase
> ---
> fs/xfs/xfs_bmap_util.c | 17 ++++-------------
> fs/xfs/xfs_file.c | 40 +++++++++++++++++++++++++++++++++++-----
> 2 files changed, 39 insertions(+), 18 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index f2a8a0e75e1f..52cddcfee8a1 100644
> --- a/fs/xfs/xfs_bmap_util.c
> +++ b/fs/xfs/xfs_bmap_util.c
> @@ -947,11 +947,10 @@ xfs_free_file_space(
> endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len);
>
> /* We can only free complete realtime extents. */
> - if (XFS_IS_REALTIME_INODE(ip)) {
> - xfs_extlen_t extsz = xfs_get_extsz_hint(ip);
> -
> - if ((startoffset_fsb | endoffset_fsb) & (extsz - 1))
> - return -EINVAL;
> + if (XFS_IS_REALTIME_INODE(ip) && mp->m_sb.sb_rextsize > 0) {
> + startoffset_fsb = round_up(startoffset_fsb,
> + mp->m_sb.sb_rextsize);
> + endoffset_fsb = round_down(endoffset_fsb, mp->m_sb.sb_rextsize);
> }
>
> /*
> @@ -1147,14 +1146,6 @@ xfs_insert_file_space(
>
> trace_xfs_insert_file_space(ip);
>
> - /* We can only insert complete realtime extents. */
> - if (XFS_IS_REALTIME_INODE(ip)) {
> - xfs_extlen_t extsz = xfs_get_extsz_hint(ip);
> -
> - if ((stop_fsb | shift_fsb) & (extsz - 1))
> - return -EINVAL;
> - }
> -
> error = xfs_bmap_can_insert_extents(ip, stop_fsb, shift_fsb);
> if (error)
> return error;
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 3d1b95124744..9e97815887c5 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -785,6 +785,39 @@ xfs_break_layouts(
> return error;
> }
>
> +/*
> + * Decide if the given file range is aligned to the size of the fundamental
> + * allocation unit for the file.
> + */
> +static bool
> +xfs_is_falloc_aligned(
> + struct xfs_inode *ip,
> + loff_t pos,
> + long long int len)
> +{
> + struct xfs_mount *mp = ip->i_mount;
> + uint64_t mask;
> +
> + if (XFS_IS_REALTIME_INODE(ip)) {
> + if (!is_power_of_2(mp->m_sb.sb_rextsize)) {
> + u64 rextbytes;
> + u32 mod;
> +
> + rextbytes = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize);
> + div_u64_rem(pos, rextbytes, &mod);
> + if (mod)
> + return false;
> + div_u64_rem(len, rextbytes, &mod);
> + return mod == 0;
> + }
> + mask = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize) - 1;
> + } else {
> + mask = mp->m_sb.sb_blocksize - 1;
> + }
> +
> + return !((pos | len) & mask);
> +}
> +
> #define XFS_FALLOC_FL_SUPPORTED \
> (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \
> FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \
> @@ -850,9 +883,7 @@ xfs_file_fallocate(
> if (error)
> goto out_unlock;
> } else if (mode & FALLOC_FL_COLLAPSE_RANGE) {
> - unsigned int blksize_mask = i_blocksize(inode) - 1;
> -
> - if (offset & blksize_mask || len & blksize_mask) {
> + if (!xfs_is_falloc_aligned(ip, offset, len)) {
> error = -EINVAL;
> goto out_unlock;
> }
> @@ -872,10 +903,9 @@ xfs_file_fallocate(
> if (error)
> goto out_unlock;
> } else if (mode & FALLOC_FL_INSERT_RANGE) {
> - unsigned int blksize_mask = i_blocksize(inode) - 1;
> loff_t isize = i_size_read(inode);
>
> - if (offset & blksize_mask || len & blksize_mask) {
> + if (!xfs_is_falloc_aligned(ip, offset, len)) {
> error = -EINVAL;
> goto out_unlock;
> }
>
--
chandan
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2
2020-10-17 21:51 ` [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2 Darrick J. Wong
@ 2020-10-20 5:00 ` Chandan Babu R
0 siblings, 0 replies; 4+ messages in thread
From: Chandan Babu R @ 2020-10-20 5:00 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Christoph Hellwig, xfs
On Sunday 18 October 2020 3:21:58 AM IST Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> Make sure that fallocate works when the rt extent size is and isn't a
> power of 2.
The changes look good to me.
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> tests/xfs/763 | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/xfs/763.out | 55 +++++++++++++++++++
> tests/xfs/group | 1
> 3 files changed, 208 insertions(+)
> create mode 100755 tests/xfs/763
> create mode 100644 tests/xfs/763.out
>
> diff --git a/tests/xfs/763 b/tests/xfs/763
> new file mode 100755
> index 00000000..a4351bd9
> --- /dev/null
> +++ b/tests/xfs/763
> @@ -0,0 +1,152 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved.
> +#
> +# FS QA Test No. 763
> +#
> +# Make sure that regular fallocate functions work ok when the realtime extent
> +# size is and isn't a power of 2.
> +#
> +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
> +
> +# real QA test starts here
> +_supported_fs xfs
> +_require_xfs_io_command "fpunch"
> +_require_xfs_io_command "fzero"
> +_require_xfs_io_command "fcollapse"
> +_require_xfs_io_command "finsert"
> +# Note that we don't _require_realtime because we synthesize a rt volume
> +# below. This also means we cannot run the post-test check.
> +_require_scratch_nocheck
> +
> +log() {
> + echo "$@" | tee -a $seqres.full
> +}
> +
> +mk_file() {
> + local file="$1"
> + local rextsize="$2"
> +
> + $XFS_IO_PROG -f \
> + -c "pwrite -S 0x57 -b $rextsize 0 $rextsize" \
> + -c "pwrite -S 0x58 -b $rextsize $rextsize $rextsize" \
> + -c "pwrite -S 0x59 -b $rextsize $((rextsize * 2)) $rextsize" \
> + -c fsync \
> + "$file" >> $seqres.full
> +}
> +
> +check_file() {
> + filefrag -v "$1" >> $seqres.full
> + od -tx1 -Ad -c "$1" >> $seqres.full
> + md5sum "$1" | _filter_scratch | tee -a $seqres.full
> +}
> +
> +test_ops() {
> + local rextsize=$1
> + local unaligned_sz=65536
> + local sz=$((rextsize * 3))
> +
> + log "Format rtextsize=$rextsize"
> + _scratch_unmount
> + _scratch_mkfs -r extsize=$rextsize >> $seqres.full
> + _scratch_mount || \
> + _notrun "Could not mount rextsize=$rextsize with synthetic rt volume"
> +
> + # Force all files to be realtime files
> + $XFS_IO_PROG -c 'chattr +t' $SCRATCH_MNT
> +
> + log "Test regular write, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/write $rextsize
> + check_file $SCRATCH_MNT/write
> +
> + log "Test aligned falloc, rextsize=$rextsize"
> + $XFS_IO_PROG -f -c "falloc 0 $sz" $SCRATCH_MNT/falloc >> $seqres.full
> + check_file $SCRATCH_MNT/falloc
> +
> + log "Test aligned fcollapse, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/collapse $rextsize
> + $XFS_IO_PROG -f -c "fcollapse $rextsize $rextsize" $SCRATCH_MNT/collapse >> $seqres.full
> + check_file $SCRATCH_MNT/collapse
> +
> + log "Test aligned finsert, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/insert $rextsize
> + $XFS_IO_PROG -f -c "finsert $rextsize $rextsize" $SCRATCH_MNT/insert >> $seqres.full
> + check_file $SCRATCH_MNT/insert
> +
> + log "Test aligned fzero, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/zero $rextsize
> + $XFS_IO_PROG -f -c "fzero $rextsize $rextsize" $SCRATCH_MNT/zero >> $seqres.full
> + check_file $SCRATCH_MNT/zero
> +
> + log "Test aligned fpunch, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/punch $rextsize
> + $XFS_IO_PROG -f -c "fpunch $rextsize $rextsize" $SCRATCH_MNT/punch >> $seqres.full
> + check_file $SCRATCH_MNT/punch
> +
> + log "Test unaligned falloc, rextsize=$rextsize"
> + $XFS_IO_PROG -f -c "falloc $unaligned_sz $unaligned_sz" $SCRATCH_MNT/ufalloc >> $seqres.full
> + check_file $SCRATCH_MNT/ufalloc
> +
> + log "Test unaligned fcollapse, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/ucollapse $rextsize
> + $XFS_IO_PROG -f -c "fcollapse $unaligned_sz $unaligned_sz" $SCRATCH_MNT/ucollapse >> $seqres.full
> + check_file $SCRATCH_MNT/ucollapse
> +
> + log "Test unaligned finsert, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/uinsert $rextsize
> + $XFS_IO_PROG -f -c "finsert $unaligned_sz $unaligned_sz" $SCRATCH_MNT/uinsert >> $seqres.full
> + check_file $SCRATCH_MNT/uinsert
> +
> + log "Test unaligned fzero, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/uzero $rextsize
> + $XFS_IO_PROG -f -c "fzero $unaligned_sz $unaligned_sz" $SCRATCH_MNT/uzero >> $seqres.full
> + check_file $SCRATCH_MNT/uzero
> +
> + log "Test unaligned fpunch, rextsize=$rextsize"
> + mk_file $SCRATCH_MNT/upunch $rextsize
> + $XFS_IO_PROG -f -c "fpunch $unaligned_sz $unaligned_sz" $SCRATCH_MNT/upunch >> $seqres.full
> + check_file $SCRATCH_MNT/upunch
> +
> + log "Check everything, rextsize=$rextsize"
> + _check_scratch_fs
> +}
> +
> +echo "Create fake rt volume"
> +truncate -s 400m $TEST_DIR/$seq.rtvol
> +rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
> +
> +echo "Make sure synth rt volume works"
> +export USE_EXTERNAL=yes
> +export SCRATCH_RTDEV=$rtdev
> +_scratch_mkfs > $seqres.full
> +_scratch_mount || \
> + _notrun "Could not mount with synthetic rt volume"
> +
> +# power of two
> +test_ops 262144
> +
> +# not a power of two
> +test_ops 327680
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/763.out b/tests/xfs/763.out
> new file mode 100644
> index 00000000..b6633fd2
> --- /dev/null
> +++ b/tests/xfs/763.out
> @@ -0,0 +1,55 @@
> +QA output created by 763
> +Create fake rt volume
> +Make sure synth rt volume works
> +Format rtextsize=262144
> +Test regular write, rextsize=262144
> +2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/write
> +Test aligned falloc, rextsize=262144
> +cb18a5d28e77522dfec6a6255bc3847e SCRATCH_MNT/falloc
> +Test aligned fcollapse, rextsize=262144
> +2e94746ab733025c21a9cae7d19c18d0 SCRATCH_MNT/collapse
> +Test aligned finsert, rextsize=262144
> +24e228d3d5f68b612eceec47f8416a7d SCRATCH_MNT/insert
> +Test aligned fzero, rextsize=262144
> +ecb6eb78ceb5c43ce86d523437b1fa95 SCRATCH_MNT/zero
> +Test aligned fpunch, rextsize=262144
> +ecb6eb78ceb5c43ce86d523437b1fa95 SCRATCH_MNT/punch
> +Test unaligned falloc, rextsize=262144
> +0dfbe8aa4c20b52e1b8bf3cb6cbdf193 SCRATCH_MNT/ufalloc
> +Test unaligned fcollapse, rextsize=262144
> +fallocate: Invalid argument
> +2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/ucollapse
> +Test unaligned finsert, rextsize=262144
> +fallocate: Invalid argument
> +2dce060217cb2293dde96f7fdb3b9232 SCRATCH_MNT/uinsert
> +Test unaligned fzero, rextsize=262144
> +8d87ed880ce111829bab56322a26bad0 SCRATCH_MNT/uzero
> +Test unaligned fpunch, rextsize=262144
> +8d87ed880ce111829bab56322a26bad0 SCRATCH_MNT/upunch
> +Check everything, rextsize=262144
> +Format rtextsize=327680
> +Test regular write, rextsize=327680
> +dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/write
> +Test aligned falloc, rextsize=327680
> +63a6c5a8b8da92e30cd0ef23c56d4f06 SCRATCH_MNT/falloc
> +Test aligned fcollapse, rextsize=327680
> +8bdd728a7a4af4ac18bbcbe39dea14d5 SCRATCH_MNT/collapse
> +Test aligned finsert, rextsize=327680
> +2b178c860f7bef4c0e55399be5172c5e SCRATCH_MNT/insert
> +Test aligned fzero, rextsize=327680
> +350defefe2530d8eb8d6a6772c81c206 SCRATCH_MNT/zero
> +Test aligned fpunch, rextsize=327680
> +350defefe2530d8eb8d6a6772c81c206 SCRATCH_MNT/punch
> +Test unaligned falloc, rextsize=327680
> +0dfbe8aa4c20b52e1b8bf3cb6cbdf193 SCRATCH_MNT/ufalloc
> +Test unaligned fcollapse, rextsize=327680
> +fallocate: Invalid argument
> +dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/ucollapse
> +Test unaligned finsert, rextsize=327680
> +fallocate: Invalid argument
> +dcc4a2d49adcac61bceae7db66611880 SCRATCH_MNT/uinsert
> +Test unaligned fzero, rextsize=327680
> +7b728ff6048f52fa533fd902995da41b SCRATCH_MNT/uzero
> +Test unaligned fpunch, rextsize=327680
> +7b728ff6048f52fa533fd902995da41b SCRATCH_MNT/upunch
> +Check everything, rextsize=327680
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 61d9e82b..2b3159ec 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -543,6 +543,7 @@
> 760 auto quick rw collapse punch insert zero prealloc
> 761 auto quick realtime
> 762 auto quick rw scrub realtime
> +763 auto quick rw realtime
> 908 auto quick bigtime
> 909 auto quick bigtime quota
> 910 auto quick inobtcount
>
--
chandan
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-10-20 5:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-17 21:50 [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Darrick J. Wong
2020-10-17 21:51 ` [PATCH] xfstest: test fallocate ops when rt extent size is and isn't a power of 2 Darrick J. Wong
2020-10-20 5:00 ` Chandan Babu R
2020-10-19 12:53 ` [PATCH v2] xfs: fix fallocate functions when rtextsize is larger than 1 Chandan Babu R
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.