Linux-XFS Archive on lore.kernel.org
 help / color / Atom feed
* [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	[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	[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, back to index

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

Linux-XFS Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-xfs/0 linux-xfs/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-xfs linux-xfs/ https://lore.kernel.org/linux-xfs \
		linux-xfs@vger.kernel.org
	public-inbox-index linux-xfs

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-xfs


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git