Re: [PATCH 5/5] xfs: regression tests for reflink quota bugs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 24, 2018 at 03:53:47PM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> 
> Add three tests to look for quota bugs in xfs reflink.  The first
> test looks for problems when we have speculative cow reservations
> in memory, we chown the file, but the reservations don't move to
> the new owner.  The second test checks that we remembered to
> dqattach the inodes before performing reflink operations; and the
> third exercises reflink quota handling near enospc.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> ---
>  tests/xfs/904     |   93 ++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/904.out |   17 ++++++++
>  tests/xfs/905     |   88 ++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/905.out |   13 ++++++
>  tests/xfs/906     |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/906.out |    6 +++
>  tests/xfs/group   |    3 +
>  7 files changed, 331 insertions(+)
>  create mode 100755 tests/xfs/904
>  create mode 100644 tests/xfs/904.out
>  create mode 100755 tests/xfs/905
>  create mode 100644 tests/xfs/905.out
>  create mode 100755 tests/xfs/906
>  create mode 100644 tests/xfs/906.out
> 
> 
> diff --git a/tests/xfs/904 b/tests/xfs/904
> new file mode 100755
> index 0000000..ef78f1a
> --- /dev/null
> +++ b/tests/xfs/904
> @@ -0,0 +1,93 @@
> +#! /bin/bash
> +# FS QA Test No. 904
> +#
> +# Regression test for a quota accounting bug when changing the owner of
> +# a file that has CoW reservations and no dirty pages.  The reservations
> +# should shift over to the new owner, but they do not.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2018 Oracle, Inc.  All Rights Reserved.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write the Free Software Foundation,
> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +#-----------------------------------------------------------------------
> +#
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/reflink
> +. ./common/quota
> +. ./common/filter
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_supported_os Linux
> +
> +_require_quota
> +_require_scratch_reflink
> +_require_cp_reflink
> +_require_user
> +
> +rm -f $seqres.full
> +
> +echo "Format and mount"
> +_scratch_mkfs > "$seqres.full" 2>&1
> +_scratch_mount "-o usrquota,grpquota" >> "$seqres.full" 2>&1
> +
> +echo "Create files"
> +$XFS_IO_PROG -c "cowextsize 1m" $SCRATCH_MNT

Add comments on why we need this?

> +touch $SCRATCH_MNT/a $SCRATCH_MNT/force_fsgqa
> +chown $qa_user $SCRATCH_MNT/a $SCRATCH_MNT/force_fsgqa
> +_pwrite_byte 0x58 0 64k $SCRATCH_MNT/a >> $seqres.full
> +$XFS_IO_PROG -c 'stat -r' $SCRATCH_MNT/a | grep stat.size >> $seqres.full
> +_report_quota_blocks "-u $SCRATCH_MNT"
> +
> +echo "Reflink and CoW"
> +_cp_reflink $SCRATCH_MNT/a $SCRATCH_MNT/b
> +_pwrite_byte 0x59 0 64k $SCRATCH_MNT/a >> $seqres.full
> +$XFS_IO_PROG -c 'stat -r' $SCRATCH_MNT/a | grep stat.size >> $seqres.full
> +_report_quota_blocks "-u $SCRATCH_MNT"
> +
> +echo "Sync"
> +sync
> +_report_quota_blocks "-u $SCRATCH_MNT"
> +
> +echo "Chown and check quota"
> +chown root $SCRATCH_MNT/a
> +$XFS_IO_PROG -c 'stat -r' $SCRATCH_MNT/a | grep stat.size >> $seqres.full
> +_report_quota_blocks "-u $SCRATCH_MNT"
> +
> +echo "Remount"
> +_scratch_unmount
> +_scratch_mount "-o usrquota,grpquota" >> "$seqres.full" 2>&1
> +$XFS_IO_PROG -c 'stat -r' $SCRATCH_MNT/a | grep stat.size >> $seqres.full
> +_report_quota_blocks "-u $SCRATCH_MNT"
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/904.out b/tests/xfs/904.out
> new file mode 100644
> index 0000000..4c2f508
> --- /dev/null
> +++ b/tests/xfs/904.out
> @@ -0,0 +1,17 @@
> +QA output created by 904
> +Format and mount
> +Create files
> +root 0 0 0
> +fsgqa 64 0 0
> +Reflink and CoW
> +root 0 0 0
> +fsgqa 1152 0 0
> +Sync
> +root 0 0 0
> +fsgqa 1088 0 0
> +Chown and check quota
> +root 1024 0 0
> +fsgqa 64 0 0
> +Remount
> +root 64 0 0
> +fsgqa 64 0 0
> diff --git a/tests/xfs/905 b/tests/xfs/905
> new file mode 100755
> index 0000000..a457c84
> --- /dev/null
> +++ b/tests/xfs/905
> @@ -0,0 +1,88 @@
> +#! /bin/bash
> +# FS QA Test No. 905
> +#
> +# Regression test for a quota accounting bug when reflinking across EOF
> +# of a file in which we forgot dq_attach.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2018 Oracle, Inc.  All Rights Reserved.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write the Free Software Foundation,
> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +#-----------------------------------------------------------------------
> +#
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/reflink
> +. ./common/quota
> +. ./common/filter
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_supported_os Linux
> +
> +_require_quota
> +_require_scratch_reflink
> +_require_cp_reflink
> +_require_user
> +
> +rm -f $seqres.full
> +
> +check_quota() {
> +	du_total="$(du -ksc $SCRATCH_MNT/a $SCRATCH_MNT/b | tail -n 1 | awk '{print $1}')"
> +	qu_total="$(_report_quota_blocks "-u $SCRATCH_MNT" | grep $qa_user | awk '{print $2}')"
> +	echo "du: $du_total; quota: $qu_total"
> +}
> +
> +echo "Format and mount (noquota)"
> +_scratch_mkfs > "$seqres.full" 2>&1
> +_scratch_mount "-o noquota" >> $seqres.full 2>&1
> +
> +echo "Create files"
> +_pwrite_byte 0x58 0 1m $SCRATCH_MNT/a >> $seqres.full
> +_pwrite_byte 0x58 0 1m $SCRATCH_MNT/b >> $seqres.full
> +chown $qa_user $SCRATCH_MNT/a $SCRATCH_MNT/b
> +check_quota 2>&1 | _filter_scratch
> +
> +echo "Mount (usrquota) and check quota"
> +_scratch_unmount
> +_scratch_mount "-o usrquota,grpquota" >> "$seqres.full" 2>&1
> +check_quota
> +
> +echo "Reflink and check quota again"
> +_reflink_range $SCRATCH_MNT/a 256k $SCRATCH_MNT/b 384k 128k >> $seqres.full
> +_reflink_range $SCRATCH_MNT/a 256k $SCRATCH_MNT/b 960k 128k >> $seqres.full
> +check_quota
> +
> +echo "Force quotacheck"
> +_check_quota_usage
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/905.out b/tests/xfs/905.out
> new file mode 100644
> index 0000000..fa95624
> --- /dev/null
> +++ b/tests/xfs/905.out
> @@ -0,0 +1,13 @@
> +QA output created by 905
> +Format and mount (noquota)
> +Create files
> +repquota: Mountpoint (or device) SCRATCH_MNT not found or has no quota enabled.
> +repquota: Not all specified mountpoints are using quota.
> +du: 2048; quota: 
> +Mount (usrquota) and check quota
> +du: 2048; quota: 2048
> +Reflink and check quota again
> +du: 2112; quota: 2112
> +Force quotacheck
> +Comparing user usage
> +Comparing group usage
> diff --git a/tests/xfs/906 b/tests/xfs/906
> new file mode 100755
> index 0000000..17dcd2e
> --- /dev/null
> +++ b/tests/xfs/906
> @@ -0,0 +1,111 @@
> +#! /bin/bash
> +# FS QA Test No. 906
> +#
> +# Force enable all XFS quotas, run fsstress until the fs runs out of
> +# space, and make sure the quotas are still correct when we're done.
> +# This is a general regression/stress test for numerous quota bugs with
> +# reflink and copy on write.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2018 Oracle, Inc.  All Rights Reserved.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it would be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write the Free Software Foundation,
> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +#-----------------------------------------------------------------------
> +#
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +	$KILLALL_PROG -9 fsstress > /dev/null 2>&1
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/quota
> +. ./common/filter
> +. ./common/reflink
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_supported_os Linux
> +
> +_require_scratch_reflink
> +_require_quota
> +_require_command "$KILLALL_PROG" "killall"
> +
> +rm -f $seqres.full
> +
> +report_quota_blocks() {
> +	$XFS_QUOTA_PROG -x -c "report $1" $SCRATCH_MNT | \
> +			awk '{x += $2;} END { print(x); }'
> +}
> +
> +compare_quota_to_du() {
> +	test $1 -eq $2 || echo "$3 quota $2 blocks does not match du $1 blocks?"
> +}
> +
> +# Make sure the user/group/project quota block counts match the du output.
> +# This ensures that we did the quota accounting correctly and that we're
> +# accurately reporting cow preallocation blocks in stat.
> +check_quota_du_blocks() {
> +	sync
> +	$XFS_QUOTA_PROG -x -c 'report' $SCRATCH_MNT >> $seqres.full
> +	du_rep=$(du -ks $SCRATCH_MNT | awk '{print $1}')
> +	u_rep=$(report_quota_blocks -u)
> +	g_rep=$(report_quota_blocks -g)
> +	p_rep=$(report_quota_blocks -p)
> +
> +	compare_quota_to_du $du_rep $u_rep "user"
> +	compare_quota_to_du $du_rep $g_rep "group"
> +	compare_quota_to_du $du_rep $p_rep "project"
> +}
> +
> +echo "Format and fsstress"
> +
> +_qmount_option "usrquota,grpquota,prjquota"
> +_scratch_mkfs > $seqres.full 2>&1

Do we need to limit the fs size? If we're running on a large SCRATCH_DEV
test will run for longer time.

> +_scratch_mount >> $seqres.full 2>&1

I'd check mount status here and _fail if mount failed, otherwise we may
eat all space on underlying fs (usually rootfs).

> +
> +nr_cpus=$((LOAD_FACTOR * 4))
> +nr_ops=$((25000 * nr_cpus * TIME_FACTOR))
> +$FSSTRESS_PROG $FSSTRESS_AVOID -w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus >> $seqres.full
> +
> +echo "Check quota before remount"
> +check_quota_du_blocks
> +
> +# Clear out all the preallocations before we quotacheck.
> +# The count comparison in _check_quota_usage will be unhappy if we don't
> +# manage to clean out all the cow preallocations before the remount.
> +_scratch_unmount
> +_scratch_mount
> +
> +# Make sure the usage doesn't change after quotacheck.
> +echo "Check quota after remount"
> +_check_quota_usage
> +
> +check_quota_du_blocks
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/906.out b/tests/xfs/906.out
> new file mode 100644
> index 0000000..201daf3
> --- /dev/null
> +++ b/tests/xfs/906.out
> @@ -0,0 +1,6 @@
> +QA output created by 906
> +Format and fsstress
> +Check quota before remount
> +Check quota after remount
> +Comparing user usage
> +Comparing group usage
> diff --git a/tests/xfs/group b/tests/xfs/group
> index cf81451..aa8b49f 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -437,3 +437,6 @@
>  437 auto quick other
>  438 auto quick quota dangerous
>  439 auto quick fuzzers log
> +904 auto quick clone quota
> +905 auto quick clone quota
> +906 auto quick clone quota

I think 906 can be a 'stress' test instead of 'quick'.

Thanks,
Eryu
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux