linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Filipe David Borba Manana <fdmanana@gmail.com>
Cc: fstests@vger.kernel.org, linux-btrfs@vger.kernel.org,
	lczerner@redhat.com
Subject: Re: [PATCH v5] xfstests: add test for btrfs cloning with file holes
Date: Tue, 10 Jun 2014 11:39:25 +1000	[thread overview]
Message-ID: <20140610013925.GJ4453@dastard> (raw)
In-Reply-To: <1401806261-14232-1-git-send-email-fdmanana@gmail.com>

On Tue, Jun 03, 2014 at 03:37:41PM +0100, Filipe David Borba Manana wrote:
> Regression test for the btrfs ioctl clone operation when the source range
> contains hole(s) and the FS has the NO_HOLES feature enabled (file holes
> don't need file extent items in the btree to represent them).
> 
> This issue is fixed by the following linux kernel btrfs patch:
> 
>     Btrfs: fix clone to deal with holes when NO_HOLES feature is enabled
> 
> Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
> ---
> 
> V2: Increased test coverage by testing the cases where a hole overlaps
>     the start and end of the cloning range.
> 
> V3: Test the case where the cloning range includes an hole at the end
>     of the source file and might increase the size of the target file.
> 
> V4: Added test for the case where the clone range covers only a hole at
>     the beginning of the source file.
>     Made the test be skipped if the available version of mkfs.btrfs
>     doesn't support the no-holes feature. And when testing the case
>     where the no-holes feature isn't enabled, explicitly ask mkfs.btrfs
>     to disable no-holes (future versions of mkfs.btrfs might enable
>     this feature by default).
> 
> V5: Detect if kernel supports NO_HOLES feature too. Added some messages
>     (echoes) before each od call to make it easier to match output
>     with each specific test.
> 
>  common/rc           |  25 ++++
>  tests/btrfs/055     | 173 ++++++++++++++++++++++++++
>  tests/btrfs/055.out | 347 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/btrfs/group   |   1 +
>  4 files changed, 546 insertions(+)
>  create mode 100755 tests/btrfs/055
>  create mode 100644 tests/btrfs/055.out
> 
> diff --git a/common/rc b/common/rc
> index f27ee53..e2136d0 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -2177,6 +2177,31 @@ _require_btrfs_send_stream_version()
>  	fi
>  }
>  
> +_require_btrfs_mkfs_feature()
> +{
> +	if [ -z $1 ]; then
> +		echo "Missing feature name argument for _require_btrfs_mkfs_feature"
> +		exit 1
> +	fi
> +	feat=$1
> +	$MKFS_BTRFS_PROG -O list-all 2>&1 | \
> +		grep '^[ \t]*'"$feat"'\b' > /dev/null 2>&1
> +	[ $? -eq 0 ] || \
> +		_notrun "Feature $feat not supported in the available version of mkfs.btrfs"
> +}
> +
> +_require_btrfs_fs_feature()
> +{
> +	if [ -z $1 ]; then
> +		echo "Missing feature name argument for _require_btrfs_fs_feature"
> +		exit 1
> +	fi
> +	feat=$1
> +	modprobe btrfs > /dev/null 2>&1
> +	[ -e /sys/fs/btrfs/features/$feat ] || \
> +		_notrun "Feature $feat not supported by the available btrfs version"
> +}
> +
>  init_rc()
>  {
>  	if [ "$iam" == new ]
> diff --git a/tests/btrfs/055 b/tests/btrfs/055
> new file mode 100755
> index 0000000..be38d09
> --- /dev/null
> +++ b/tests/btrfs/055
> @@ -0,0 +1,173 @@
> +#! /bin/bash
> +# FS QA Test No. btrfs/055
> +#
> +# Regression test for the btrfs ioctl clone operation when the source range
> +# contains hole(s) and the FS has the NO_HOLES feature enabled (file holes
> +# don't need file extent items in the btree to represent them).
> +#
> +# This issue is fixed by the following linux kernel btrfs patch:
> +#
> +#    Btrfs: fix clone to deal with holes when NO_HOLES feature is enabled
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2014 Filipe Manana.  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"
> +
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +    rm -fr $tmp
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# real QA test starts here
> +_supported_fs btrfs
> +_supported_os Linux
> +_require_scratch
> +_require_btrfs_cloner
> +_require_btrfs_fs_feature "no_holes"
> +_require_btrfs_mkfs_feature "no-holes"

Nice kernel/userspace consistency in naming there ;)

> +_need_to_be_root
> +
> +rm -f $seqres.full
> +
> +test_btrfs_clone_with_holes()
> +{
> +	_scratch_mkfs "$1" >/dev/null 2>&1
> +	_scratch_mount
> +
> +	# Create a file with 4 extents and 1 hole, all with a size of 8Kb each.
> +	$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 8192 0 8192" $SCRATCH_MNT/foo \
> +		| _filter_xfs_io
> +	sync
> +	$XFS_IO_PROG -c "pwrite -S 0x02 -b 8192 8192 8192" $SCRATCH_MNT/foo \
> +		| _filter_xfs_io
> +	sync
> +	# After the following write we get an hole in the range [16384, 24576[
> +	$XFS_IO_PROG -c "pwrite -S 0x04 -b 8192 24576 8192" $SCRATCH_MNT/foo \
> +		| _filter_xfs_io
> +	sync
> +	$XFS_IO_PROG -c "pwrite -S 0x05 -b 8192 32768 8192" $SCRATCH_MNT/foo \
> +		| _filter_xfs_io
> +	sync
> +
> +	# Clone destination file, 1 extent of 96kb.
> +	$XFS_IO_PROG -f -c "pwrite -S 0xff -b 98304 0 98304" $SCRATCH_MNT/bar \
> +		| _filter_xfs_io
> +	sync

As Lukas mentioned, this is way too verbose and hard to read.
This:

	# Create a file with 4 extents and 1 hole, all with a size of 8Kb each.
	$XFS_IO_PROG -fs \
		-c "pwrite -S 0x01 -b 8192 0 8192" \
		-c "pwrite -S 0x02 -b 8192 8192 8192" \
		-c "pwrite -S 0x04 -b 8192 24576 8192" \
		-c "pwrite -S 0x05 -b 8192 32768 8192" \
		$SCRATCH_MNT/foo | _filter_xfs_io

	# Clone destination file, 1 extent of 96kb.
	$XFS_IO_PROG -fs -c "pwrite -S 0xff -b 98304 0 98304" \
		$SCRATCH_MNT/bar | _filter_xfs_io

is much more compact and far easier to read. It's also the same
style as many of the other tests use for compound operations like
this.

Other than that the test look sgood.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2014-06-10  1:39 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-31  1:17 [PATCH] xfstests: add test for btrfs cloning with file holes Filipe David Borba Manana
2014-05-31 14:12 ` [PATCH v2] " Filipe David Borba Manana
2014-06-03 12:32   ` Lukáš Czerner
2014-05-31 16:21 ` [PATCH v3] " Filipe David Borba Manana
2014-06-01 13:06 ` [PATCH v4] " Filipe David Borba Manana
2014-06-03 12:46   ` Lukáš Czerner
2014-06-03 13:36     ` Filipe David Manana
2014-06-03 14:37 ` [PATCH v5] " Filipe David Borba Manana
2014-06-10  1:39   ` Dave Chinner [this message]
2014-06-10 10:12 ` [PATCH v6] " Filipe David Borba Manana

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140610013925.GJ4453@dastard \
    --to=david@fromorbit.com \
    --cc=fdmanana@gmail.com \
    --cc=fstests@vger.kernel.org \
    --cc=lczerner@redhat.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).