diff mbox

[3/4] reflink: test adjacency of reflinked blocks

Message ID 148798517790.25833.2585159479268361866.stgit@birch.djwong.org (mailing list archive)
State New, archived
Headers show

Commit Message

Darrick J. Wong Feb. 25, 2017, 1:12 a.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

If we reflink a file with N blocks to another file one block at a time,
does the destination file end up with the same number of extents as the
source file?  In other words, does the filesystem succeed at combining
adjacent mappings into a maximal extents?

Signed-off-by: Darrick J. Wong <djwong@djwong.org>
---
 tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generic/930.out |   11 +++++
 tests/generic/group   |    1 
 3 files changed, 118 insertions(+)
 create mode 100755 tests/generic/930
 create mode 100644 tests/generic/930.out



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

Comments

Eryu Guan Feb. 28, 2017, 8:15 a.m. UTC | #1
On Fri, Feb 24, 2017 at 05:12:57PM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> If we reflink a file with N blocks to another file one block at a time,
> does the destination file end up with the same number of extents as the
> source file?  In other words, does the filesystem succeed at combining
> adjacent mappings into a maximal extents?

I'm not sure if this is a standard behavior and applies to btrfs too?
But btrfs is failing this test now:

+f1 (1) != f2 (32)
+s1 (1) != s2 (32)

Fix test or btrfs? I'm taking it if btrfs is the one to be fixed :)

Thanks,
Eryu

> 
> Signed-off-by: Darrick J. Wong <djwong@djwong.org>
> ---
>  tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/930.out |   11 +++++
>  tests/generic/group   |    1 
>  3 files changed, 118 insertions(+)
>  create mode 100755 tests/generic/930
>  create mode 100644 tests/generic/930.out
> 
> 
> diff --git a/tests/generic/930 b/tests/generic/930
> new file mode 100755
> index 0000000..15d8cbf
> --- /dev/null
> +++ b/tests/generic/930
> @@ -0,0 +1,106 @@
> +#! /bin/bash
> +# FS QA Test No. 930
> +#
> +# Check that reflinking adjacent blocks in a file produces a single
> +# block mapping extent.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2017 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 7 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -rf $tmp.*
> +	wait
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/reflink
> +
> +# real QA test starts here
> +_supported_os Linux
> +_supported_fs generic
> +_require_scratch_reflink
> +_require_fiemap
> +
> +echo "Format and mount"
> +_scratch_mkfs > $seqres.full 2>&1
> +_scratch_mount >> $seqres.full 2>&1
> +
> +testdir=$SCRATCH_MNT/test-$seq
> +mkdir $testdir
> +
> +blocks=32
> +blksz=65536
> +sz=$((blocks * blksz))
> +
> +echo "Create the original files"
> +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
> +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
> +seq 0 $blksz $((sz - blksz)) | while read offset; do
> +	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
> +done
> +
> +echo "Compare files"
> +md5sum $testdir/file1 | _filter_scratch
> +md5sum $testdir/file2 | _filter_scratch
> +
> +echo "Check extent counts"
> +f1=$(_count_extents $testdir/file1)
> +f2=$(_count_extents $testdir/file2)
> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +
> +# Did the fs combine the extent mappings when we made f2?
> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> +
> +_scratch_cycle_mount
> +
> +echo "Compare files after remounting"
> +md5sum $testdir/file1 | _filter_scratch
> +md5sum $testdir/file2 | _filter_scratch
> +
> +echo "Check extent counts"
> +f1=$(_count_extents $testdir/file1)
> +f2=$(_count_extents $testdir/file2)
> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +
> +# Are the mappings still combined?
> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/930.out b/tests/generic/930.out
> new file mode 100644
> index 0000000..556108a
> --- /dev/null
> +++ b/tests/generic/930.out
> @@ -0,0 +1,11 @@
> +QA output created by 930
> +Format and mount
> +Create the original files
> +Compare files
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> +Check extent counts
> +Compare files after remounting
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> +Check extent counts
> diff --git a/tests/generic/group b/tests/generic/group
> index d0bc47d..4b4df66 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -411,3 +411,4 @@
>  406 auto quick dangerous
>  407 auto quick clone metadata
>  408 auto quick clone dedupe metadata
> +930 auto quick clone
> 
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick J. Wong Feb. 28, 2017, 4:31 p.m. UTC | #2
On Tue, Feb 28, 2017 at 04:15:02PM +0800, Eryu Guan wrote:
> On Fri, Feb 24, 2017 at 05:12:57PM -0800, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > If we reflink a file with N blocks to another file one block at a time,
> > does the destination file end up with the same number of extents as the
> > source file?  In other words, does the filesystem succeed at combining
> > adjacent mappings into a maximal extents?
> 
> I'm not sure if this is a standard behavior and applies to btrfs too?
> But btrfs is failing this test now:
> 
> +f1 (1) != f2 (32)
> +s1 (1) != s2 (32)
> 
> Fix test or btrfs? I'm taking it if btrfs is the one to be fixed :)

btrfs has that weird behavior where it doesn't merge the adjacent
extents at all (at least not according to FIEMAP) until you remount the
filesystem.  After the remount it's fine, but... WTF? :)

So yes, the test is working as designed.  btrfs needs fixing, or I guess
worst case we can _notrun it on btrfs.

Snark aside, it was intended originally to make sure that XFS is
properly merging the extent records together; then it occurred to me to
rewrite it with fiemap and make it one of the generic reflink tests so
that ocfs2 can get tested too.

--D

> 
> Thanks,
> Eryu
> 
> > 
> > Signed-off-by: Darrick J. Wong <djwong@djwong.org>
> > ---
> >  tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/generic/930.out |   11 +++++
> >  tests/generic/group   |    1 
> >  3 files changed, 118 insertions(+)
> >  create mode 100755 tests/generic/930
> >  create mode 100644 tests/generic/930.out
> > 
> > 
> > diff --git a/tests/generic/930 b/tests/generic/930
> > new file mode 100755
> > index 0000000..15d8cbf
> > --- /dev/null
> > +++ b/tests/generic/930
> > @@ -0,0 +1,106 @@
> > +#! /bin/bash
> > +# FS QA Test No. 930
> > +#
> > +# Check that reflinking adjacent blocks in a file produces a single
> > +# block mapping extent.
> > +#
> > +#-----------------------------------------------------------------------
> > +# Copyright (c) 2017 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 7 15
> > +
> > +_cleanup()
> > +{
> > +	cd /
> > +	rm -rf $tmp.*
> > +	wait
> > +}
> > +
> > +# get standard environment, filters and checks
> > +. ./common/rc
> > +. ./common/filter
> > +. ./common/reflink
> > +
> > +# real QA test starts here
> > +_supported_os Linux
> > +_supported_fs generic
> > +_require_scratch_reflink
> > +_require_fiemap
> > +
> > +echo "Format and mount"
> > +_scratch_mkfs > $seqres.full 2>&1
> > +_scratch_mount >> $seqres.full 2>&1
> > +
> > +testdir=$SCRATCH_MNT/test-$seq
> > +mkdir $testdir
> > +
> > +blocks=32
> > +blksz=65536
> > +sz=$((blocks * blksz))
> > +
> > +echo "Create the original files"
> > +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
> > +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
> > +seq 0 $blksz $((sz - blksz)) | while read offset; do
> > +	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
> > +done
> > +
> > +echo "Compare files"
> > +md5sum $testdir/file1 | _filter_scratch
> > +md5sum $testdir/file2 | _filter_scratch
> > +
> > +echo "Check extent counts"
> > +f1=$(_count_extents $testdir/file1)
> > +f2=$(_count_extents $testdir/file2)
> > +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> > +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> > +
> > +# Did the fs combine the extent mappings when we made f2?
> > +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> > +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> > +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> > +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> > +
> > +_scratch_cycle_mount
> > +
> > +echo "Compare files after remounting"
> > +md5sum $testdir/file1 | _filter_scratch
> > +md5sum $testdir/file2 | _filter_scratch
> > +
> > +echo "Check extent counts"
> > +f1=$(_count_extents $testdir/file1)
> > +f2=$(_count_extents $testdir/file2)
> > +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> > +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> > +
> > +# Are the mappings still combined?
> > +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> > +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> > +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> > +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> > +
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/generic/930.out b/tests/generic/930.out
> > new file mode 100644
> > index 0000000..556108a
> > --- /dev/null
> > +++ b/tests/generic/930.out
> > @@ -0,0 +1,11 @@
> > +QA output created by 930
> > +Format and mount
> > +Create the original files
> > +Compare files
> > +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> > +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> > +Check extent counts
> > +Compare files after remounting
> > +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> > +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> > +Check extent counts
> > diff --git a/tests/generic/group b/tests/generic/group
> > index d0bc47d..4b4df66 100644
> > --- a/tests/generic/group
> > +++ b/tests/generic/group
> > @@ -411,3 +411,4 @@
> >  406 auto quick dangerous
> >  407 auto quick clone metadata
> >  408 auto quick clone dedupe metadata
> > +930 auto quick clone
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe fstests" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eryu Guan March 1, 2017, 3:20 a.m. UTC | #3
On Tue, Feb 28, 2017 at 08:31:50AM -0800, Darrick J. Wong wrote:
> On Tue, Feb 28, 2017 at 04:15:02PM +0800, Eryu Guan wrote:
> > On Fri, Feb 24, 2017 at 05:12:57PM -0800, Darrick J. Wong wrote:
> > > From: Darrick J. Wong <darrick.wong@oracle.com>
> > > 
> > > If we reflink a file with N blocks to another file one block at a time,
> > > does the destination file end up with the same number of extents as the
> > > source file?  In other words, does the filesystem succeed at combining
> > > adjacent mappings into a maximal extents?
> > 
> > I'm not sure if this is a standard behavior and applies to btrfs too?
> > But btrfs is failing this test now:
> > 
> > +f1 (1) != f2 (32)
> > +s1 (1) != s2 (32)
> > 
> > Fix test or btrfs? I'm taking it if btrfs is the one to be fixed :)
> 
> btrfs has that weird behavior where it doesn't merge the adjacent
> extents at all (at least not according to FIEMAP) until you remount the
> filesystem.  After the remount it's fine, but... WTF? :)
> 
> So yes, the test is working as designed.  btrfs needs fixing, or I guess
> worst case we can _notrun it on btrfs.

Thanks for the explanation! I'll take it as it is at this moment then.

> 
> Snark aside, it was intended originally to make sure that XFS is
> properly merging the extent records together; then it occurred to me to
> rewrite it with fiemap and make it one of the generic reflink tests so
> that ocfs2 can get tested too.

Ah, that reminds me that I need to do testing with ocfs2 too, and test
passed :)

Thanks,
Eryu
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Qu Wenruo March 21, 2017, 7:14 a.m. UTC | #4
Hi Darrick

At 02/25/2017 09:12 AM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> If we reflink a file with N blocks to another file one block at a time,
> does the destination file end up with the same number of extents as the
> source file?  In other words, does the filesystem succeed at combining
> adjacent mappings into a maximal extents?

Btrfs can't pass the test since it doesn't merge such mapping, not only 
the fiemap result, but also on-disk extents.

IIRC ocfs also merges it, so I wonder if this is a documented behavior 
to merge any extent maps that are adjacent.

Further more, if a fs has a limit on extent size on disk, e.g 128M.
But 2 file extents are also adjacent on disk, then should fiemap return 
a large 256M map or just 2 adjacent 128M maps?

Thanks,
Qu
>
> Signed-off-by: Darrick J. Wong <djwong@djwong.org>
> ---
>  tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/930.out |   11 +++++
>  tests/generic/group   |    1
>  3 files changed, 118 insertions(+)
>  create mode 100755 tests/generic/930
>  create mode 100644 tests/generic/930.out
>
>
> diff --git a/tests/generic/930 b/tests/generic/930
> new file mode 100755
> index 0000000..15d8cbf
> --- /dev/null
> +++ b/tests/generic/930
> @@ -0,0 +1,106 @@
> +#! /bin/bash
> +# FS QA Test No. 930
> +#
> +# Check that reflinking adjacent blocks in a file produces a single
> +# block mapping extent.
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2017 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 7 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -rf $tmp.*
> +	wait
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/reflink
> +
> +# real QA test starts here
> +_supported_os Linux
> +_supported_fs generic
> +_require_scratch_reflink
> +_require_fiemap
> +
> +echo "Format and mount"
> +_scratch_mkfs > $seqres.full 2>&1
> +_scratch_mount >> $seqres.full 2>&1
> +
> +testdir=$SCRATCH_MNT/test-$seq
> +mkdir $testdir
> +
> +blocks=32
> +blksz=65536
> +sz=$((blocks * blksz))
> +
> +echo "Create the original files"
> +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
> +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
> +seq 0 $blksz $((sz - blksz)) | while read offset; do
> +	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
> +done
> +
> +echo "Compare files"
> +md5sum $testdir/file1 | _filter_scratch
> +md5sum $testdir/file2 | _filter_scratch
> +
> +echo "Check extent counts"
> +f1=$(_count_extents $testdir/file1)
> +f2=$(_count_extents $testdir/file2)
> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +
> +# Did the fs combine the extent mappings when we made f2?
> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> +
> +_scratch_cycle_mount
> +
> +echo "Compare files after remounting"
> +md5sum $testdir/file1 | _filter_scratch
> +md5sum $testdir/file2 | _filter_scratch
> +
> +echo "Check extent counts"
> +f1=$(_count_extents $testdir/file1)
> +f2=$(_count_extents $testdir/file2)
> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> +
> +# Are the mappings still combined?
> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/930.out b/tests/generic/930.out
> new file mode 100644
> index 0000000..556108a
> --- /dev/null
> +++ b/tests/generic/930.out
> @@ -0,0 +1,11 @@
> +QA output created by 930
> +Format and mount
> +Create the original files
> +Compare files
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> +Check extent counts
> +Compare files after remounting
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> +Check extent counts
> diff --git a/tests/generic/group b/tests/generic/group
> index d0bc47d..4b4df66 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -411,3 +411,4 @@
>  406 auto quick dangerous
>  407 auto quick clone metadata
>  408 auto quick clone dedupe metadata
> +930 auto quick clone
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>


--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick J. Wong March 21, 2017, 2:23 p.m. UTC | #5
On Tue, Mar 21, 2017 at 03:14:36PM +0800, Qu Wenruo wrote:
> Hi Darrick
> 
> At 02/25/2017 09:12 AM, Darrick J. Wong wrote:
> >From: Darrick J. Wong <darrick.wong@oracle.com>
> >
> >If we reflink a file with N blocks to another file one block at a time,
> >does the destination file end up with the same number of extents as the
> >source file?  In other words, does the filesystem succeed at combining
> >adjacent mappings into a maximal extents?
> 
> Btrfs can't pass the test since it doesn't merge such mapping, not only the
> fiemap result, but also on-disk extents.

Weirdly, I observed that if you unmount and remount the btrfs it
actually /will/ merge the extents.

> IIRC ocfs also merges it, so I wonder if this is a documented behavior to
> merge any extent maps that are adjacent.

Generally, yes you'd expect that two logically and physically contiguous
extents to be merged together.  That might change a bit for compressed
or encrypted extents.

> Further more, if a fs has a limit on extent size on disk, e.g 128M.
> But 2 file extents are also adjacent on disk, then should fiemap return a
> large 256M map or just 2 adjacent 128M maps?

It's up to the fs, really... XFS will merge the extent records (up to
maximum extent size) and then unmerge the shared/not-shared FIEMAP
records for accurate shared extent reporting.

--D

> 
> Thanks,
> Qu
> >
> >Signed-off-by: Darrick J. Wong <djwong@djwong.org>
> >---
> > tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
> > tests/generic/930.out |   11 +++++
> > tests/generic/group   |    1
> > 3 files changed, 118 insertions(+)
> > create mode 100755 tests/generic/930
> > create mode 100644 tests/generic/930.out
> >
> >
> >diff --git a/tests/generic/930 b/tests/generic/930
> >new file mode 100755
> >index 0000000..15d8cbf
> >--- /dev/null
> >+++ b/tests/generic/930
> >@@ -0,0 +1,106 @@
> >+#! /bin/bash
> >+# FS QA Test No. 930
> >+#
> >+# Check that reflinking adjacent blocks in a file produces a single
> >+# block mapping extent.
> >+#
> >+#-----------------------------------------------------------------------
> >+# Copyright (c) 2017 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 7 15
> >+
> >+_cleanup()
> >+{
> >+	cd /
> >+	rm -rf $tmp.*
> >+	wait
> >+}
> >+
> >+# get standard environment, filters and checks
> >+. ./common/rc
> >+. ./common/filter
> >+. ./common/reflink
> >+
> >+# real QA test starts here
> >+_supported_os Linux
> >+_supported_fs generic
> >+_require_scratch_reflink
> >+_require_fiemap
> >+
> >+echo "Format and mount"
> >+_scratch_mkfs > $seqres.full 2>&1
> >+_scratch_mount >> $seqres.full 2>&1
> >+
> >+testdir=$SCRATCH_MNT/test-$seq
> >+mkdir $testdir
> >+
> >+blocks=32
> >+blksz=65536
> >+sz=$((blocks * blksz))
> >+
> >+echo "Create the original files"
> >+$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
> >+_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
> >+seq 0 $blksz $((sz - blksz)) | while read offset; do
> >+	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
> >+done
> >+
> >+echo "Compare files"
> >+md5sum $testdir/file1 | _filter_scratch
> >+md5sum $testdir/file2 | _filter_scratch
> >+
> >+echo "Check extent counts"
> >+f1=$(_count_extents $testdir/file1)
> >+f2=$(_count_extents $testdir/file2)
> >+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >+
> >+# Did the fs combine the extent mappings when we made f2?
> >+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> >+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> >+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> >+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> >+
> >+_scratch_cycle_mount
> >+
> >+echo "Compare files after remounting"
> >+md5sum $testdir/file1 | _filter_scratch
> >+md5sum $testdir/file2 | _filter_scratch
> >+
> >+echo "Check extent counts"
> >+f1=$(_count_extents $testdir/file1)
> >+f2=$(_count_extents $testdir/file2)
> >+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >+
> >+# Are the mappings still combined?
> >+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> >+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> >+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> >+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> >+
> >+# success, all done
> >+status=0
> >+exit
> >diff --git a/tests/generic/930.out b/tests/generic/930.out
> >new file mode 100644
> >index 0000000..556108a
> >--- /dev/null
> >+++ b/tests/generic/930.out
> >@@ -0,0 +1,11 @@
> >+QA output created by 930
> >+Format and mount
> >+Create the original files
> >+Compare files
> >+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> >+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> >+Check extent counts
> >+Compare files after remounting
> >+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> >+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> >+Check extent counts
> >diff --git a/tests/generic/group b/tests/generic/group
> >index d0bc47d..4b4df66 100644
> >--- a/tests/generic/group
> >+++ b/tests/generic/group
> >@@ -411,3 +411,4 @@
> > 406 auto quick dangerous
> > 407 auto quick clone metadata
> > 408 auto quick clone dedupe metadata
> >+930 auto quick clone
> >
> >--
> >To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> >the body of a message to majordomo@vger.kernel.org
> >More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >
> >
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Qu Wenruo March 22, 2017, 8:13 a.m. UTC | #6
At 03/21/2017 10:23 PM, Darrick J. Wong wrote:
> On Tue, Mar 21, 2017 at 03:14:36PM +0800, Qu Wenruo wrote:
>> Hi Darrick
>>
>> At 02/25/2017 09:12 AM, Darrick J. Wong wrote:
>>> From: Darrick J. Wong <darrick.wong@oracle.com>
>>>
>>> If we reflink a file with N blocks to another file one block at a time,
>>> does the destination file end up with the same number of extents as the
>>> source file?  In other words, does the filesystem succeed at combining
>>> adjacent mappings into a maximal extents?
>>
>> Btrfs can't pass the test since it doesn't merge such mapping, not only the
>> fiemap result, but also on-disk extents.
>
> Weirdly, I observed that if you unmount and remount the btrfs it
> actually /will/ merge the extents.

I tried that, but it's even more weird, after remount, fiemap still 
return split ones.
But if call fiemap again after about 1 second, it reports one single 
large extent.
(if calling 2nd fiemap just after 1st one, 2nd one will still return 
split extent map)

While on disk, the extents are split indeed.

So it's a btrfs bug then.

>
>> IIRC ocfs also merges it, so I wonder if this is a documented behavior to
>> merge any extent maps that are adjacent.
>
> Generally, yes you'd expect that two logically and physically contiguous
> extents to be merged together.  That might change a bit for compressed
> or encrypted extents.
>
>> Further more, if a fs has a limit on extent size on disk, e.g 128M.
>> But 2 file extents are also adjacent on disk, then should fiemap return a
>> large 256M map or just 2 adjacent 128M maps?
>
> It's up to the fs, really... XFS will merge the extent records (up to
> maximum extent size) and then unmerge the shared/not-shared FIEMAP
> records for accurate shared extent reporting.

BTW, are XFS extents on disk are merged when doing reflink, or just 
merge the extent record at fiemap time?

Further more, is there any tool like btrfs-debug-tree to show *every* 
btree block and its content data?
I am very interested in XFS on-disk and runtime implementation.

Thanks,
Qu
>
> --D
>
>>
>> Thanks,
>> Qu
>>>
>>> Signed-off-by: Darrick J. Wong <djwong@djwong.org>
>>> ---
>>> tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
>>> tests/generic/930.out |   11 +++++
>>> tests/generic/group   |    1
>>> 3 files changed, 118 insertions(+)
>>> create mode 100755 tests/generic/930
>>> create mode 100644 tests/generic/930.out
>>>
>>>
>>> diff --git a/tests/generic/930 b/tests/generic/930
>>> new file mode 100755
>>> index 0000000..15d8cbf
>>> --- /dev/null
>>> +++ b/tests/generic/930
>>> @@ -0,0 +1,106 @@
>>> +#! /bin/bash
>>> +# FS QA Test No. 930
>>> +#
>>> +# Check that reflinking adjacent blocks in a file produces a single
>>> +# block mapping extent.
>>> +#
>>> +#-----------------------------------------------------------------------
>>> +# Copyright (c) 2017 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 7 15
>>> +
>>> +_cleanup()
>>> +{
>>> +	cd /
>>> +	rm -rf $tmp.*
>>> +	wait
>>> +}
>>> +
>>> +# get standard environment, filters and checks
>>> +. ./common/rc
>>> +. ./common/filter
>>> +. ./common/reflink
>>> +
>>> +# real QA test starts here
>>> +_supported_os Linux
>>> +_supported_fs generic
>>> +_require_scratch_reflink
>>> +_require_fiemap
>>> +
>>> +echo "Format and mount"
>>> +_scratch_mkfs > $seqres.full 2>&1
>>> +_scratch_mount >> $seqres.full 2>&1
>>> +
>>> +testdir=$SCRATCH_MNT/test-$seq
>>> +mkdir $testdir
>>> +
>>> +blocks=32
>>> +blksz=65536
>>> +sz=$((blocks * blksz))
>>> +
>>> +echo "Create the original files"
>>> +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
>>> +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
>>> +seq 0 $blksz $((sz - blksz)) | while read offset; do
>>> +	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
>>> +done
>>> +
>>> +echo "Compare files"
>>> +md5sum $testdir/file1 | _filter_scratch
>>> +md5sum $testdir/file2 | _filter_scratch
>>> +
>>> +echo "Check extent counts"
>>> +f1=$(_count_extents $testdir/file1)
>>> +f2=$(_count_extents $testdir/file2)
>>> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
>>> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
>>> +
>>> +# Did the fs combine the extent mappings when we made f2?
>>> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
>>> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
>>> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
>>> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
>>> +
>>> +_scratch_cycle_mount
>>> +
>>> +echo "Compare files after remounting"
>>> +md5sum $testdir/file1 | _filter_scratch
>>> +md5sum $testdir/file2 | _filter_scratch
>>> +
>>> +echo "Check extent counts"
>>> +f1=$(_count_extents $testdir/file1)
>>> +f2=$(_count_extents $testdir/file2)
>>> +s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
>>> +s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
>>> +
>>> +# Are the mappings still combined?
>>> +test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
>>> +test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
>>> +test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
>>> +test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
>>> +
>>> +# success, all done
>>> +status=0
>>> +exit
>>> diff --git a/tests/generic/930.out b/tests/generic/930.out
>>> new file mode 100644
>>> index 0000000..556108a
>>> --- /dev/null
>>> +++ b/tests/generic/930.out
>>> @@ -0,0 +1,11 @@
>>> +QA output created by 930
>>> +Format and mount
>>> +Create the original files
>>> +Compare files
>>> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
>>> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
>>> +Check extent counts
>>> +Compare files after remounting
>>> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
>>> +de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
>>> +Check extent counts
>>> diff --git a/tests/generic/group b/tests/generic/group
>>> index d0bc47d..4b4df66 100644
>>> --- a/tests/generic/group
>>> +++ b/tests/generic/group
>>> @@ -411,3 +411,4 @@
>>> 406 auto quick dangerous
>>> 407 auto quick clone metadata
>>> 408 auto quick clone dedupe metadata
>>> +930 auto quick clone
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>
>>>
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>


--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick J. Wong March 22, 2017, 1:06 p.m. UTC | #7
On Wed, Mar 22, 2017 at 04:13:16PM +0800, Qu Wenruo wrote:
> 
> 
> At 03/21/2017 10:23 PM, Darrick J. Wong wrote:
> >On Tue, Mar 21, 2017 at 03:14:36PM +0800, Qu Wenruo wrote:
> >>Hi Darrick
> >>
> >>At 02/25/2017 09:12 AM, Darrick J. Wong wrote:
> >>>From: Darrick J. Wong <darrick.wong@oracle.com>
> >>>
> >>>If we reflink a file with N blocks to another file one block at a time,
> >>>does the destination file end up with the same number of extents as the
> >>>source file?  In other words, does the filesystem succeed at combining
> >>>adjacent mappings into a maximal extents?
> >>
> >>Btrfs can't pass the test since it doesn't merge such mapping, not only the
> >>fiemap result, but also on-disk extents.
> >
> >Weirdly, I observed that if you unmount and remount the btrfs it
> >actually /will/ merge the extents.
> 
> I tried that, but it's even more weird, after remount, fiemap still return
> split ones.
> But if call fiemap again after about 1 second, it reports one single large
> extent.
> (if calling 2nd fiemap just after 1st one, 2nd one will still return split
> extent map)
> 
> While on disk, the extents are split indeed.

That's .... weirder than I was expecting.

> So it's a btrfs bug then.
> 
> >
> >>IIRC ocfs also merges it, so I wonder if this is a documented behavior to
> >>merge any extent maps that are adjacent.
> >
> >Generally, yes you'd expect that two logically and physically contiguous
> >extents to be merged together.  That might change a bit for compressed
> >or encrypted extents.
> >
> >>Further more, if a fs has a limit on extent size on disk, e.g 128M.
> >>But 2 file extents are also adjacent on disk, then should fiemap return a
> >>large 256M map or just 2 adjacent 128M maps?
> >
> >It's up to the fs, really... XFS will merge the extent records (up to
> >maximum extent size) and then unmerge the shared/not-shared FIEMAP
> >records for accurate shared extent reporting.
> 
> BTW, are XFS extents on disk are merged when doing reflink, or just merge
> the extent record at fiemap time?

Extents are always merged at the earliest possible time.

> Further more, is there any tool like btrfs-debug-tree to show *every* btree
> block and its content data?
> I am very interested in XFS on-disk and runtime implementation.

You can step through them manually with xfs_db, but there's no way to
dump a btree.  Hmm, that would be useful, I'll suggest implementing that.

--D

> Thanks,
> Qu
> >
> >--D
> >
> >>
> >>Thanks,
> >>Qu
> >>>
> >>>Signed-off-by: Darrick J. Wong <djwong@djwong.org>
> >>>---
> >>>tests/generic/930     |  106 +++++++++++++++++++++++++++++++++++++++++++++++++
> >>>tests/generic/930.out |   11 +++++
> >>>tests/generic/group   |    1
> >>>3 files changed, 118 insertions(+)
> >>>create mode 100755 tests/generic/930
> >>>create mode 100644 tests/generic/930.out
> >>>
> >>>
> >>>diff --git a/tests/generic/930 b/tests/generic/930
> >>>new file mode 100755
> >>>index 0000000..15d8cbf
> >>>--- /dev/null
> >>>+++ b/tests/generic/930
> >>>@@ -0,0 +1,106 @@
> >>>+#! /bin/bash
> >>>+# FS QA Test No. 930
> >>>+#
> >>>+# Check that reflinking adjacent blocks in a file produces a single
> >>>+# block mapping extent.
> >>>+#
> >>>+#-----------------------------------------------------------------------
> >>>+# Copyright (c) 2017 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 7 15
> >>>+
> >>>+_cleanup()
> >>>+{
> >>>+	cd /
> >>>+	rm -rf $tmp.*
> >>>+	wait
> >>>+}
> >>>+
> >>>+# get standard environment, filters and checks
> >>>+. ./common/rc
> >>>+. ./common/filter
> >>>+. ./common/reflink
> >>>+
> >>>+# real QA test starts here
> >>>+_supported_os Linux
> >>>+_supported_fs generic
> >>>+_require_scratch_reflink
> >>>+_require_fiemap
> >>>+
> >>>+echo "Format and mount"
> >>>+_scratch_mkfs > $seqres.full 2>&1
> >>>+_scratch_mount >> $seqres.full 2>&1
> >>>+
> >>>+testdir=$SCRATCH_MNT/test-$seq
> >>>+mkdir $testdir
> >>>+
> >>>+blocks=32
> >>>+blksz=65536
> >>>+sz=$((blocks * blksz))
> >>>+
> >>>+echo "Create the original files"
> >>>+$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
> >>>+_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
> >>>+seq 0 $blksz $((sz - blksz)) | while read offset; do
> >>>+	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
> >>>+done
> >>>+
> >>>+echo "Compare files"
> >>>+md5sum $testdir/file1 | _filter_scratch
> >>>+md5sum $testdir/file2 | _filter_scratch
> >>>+
> >>>+echo "Check extent counts"
> >>>+f1=$(_count_extents $testdir/file1)
> >>>+f2=$(_count_extents $testdir/file2)
> >>>+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >>>+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >>>+
> >>>+# Did the fs combine the extent mappings when we made f2?
> >>>+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> >>>+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> >>>+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> >>>+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> >>>+
> >>>+_scratch_cycle_mount
> >>>+
> >>>+echo "Compare files after remounting"
> >>>+md5sum $testdir/file1 | _filter_scratch
> >>>+md5sum $testdir/file2 | _filter_scratch
> >>>+
> >>>+echo "Check extent counts"
> >>>+f1=$(_count_extents $testdir/file1)
> >>>+f2=$(_count_extents $testdir/file2)
> >>>+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >>>+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
> >>>+
> >>>+# Are the mappings still combined?
> >>>+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
> >>>+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
> >>>+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
> >>>+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
> >>>+
> >>>+# success, all done
> >>>+status=0
> >>>+exit
> >>>diff --git a/tests/generic/930.out b/tests/generic/930.out
> >>>new file mode 100644
> >>>index 0000000..556108a
> >>>--- /dev/null
> >>>+++ b/tests/generic/930.out
> >>>@@ -0,0 +1,11 @@
> >>>+QA output created by 930
> >>>+Format and mount
> >>>+Create the original files
> >>>+Compare files
> >>>+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> >>>+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> >>>+Check extent counts
> >>>+Compare files after remounting
> >>>+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
> >>>+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
> >>>+Check extent counts
> >>>diff --git a/tests/generic/group b/tests/generic/group
> >>>index d0bc47d..4b4df66 100644
> >>>--- a/tests/generic/group
> >>>+++ b/tests/generic/group
> >>>@@ -411,3 +411,4 @@
> >>>406 auto quick dangerous
> >>>407 auto quick clone metadata
> >>>408 auto quick clone dedupe metadata
> >>>+930 auto quick clone
> >>>
> >>>--
> >>>To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> >>>the body of a message to majordomo@vger.kernel.org
> >>>More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >>>
> >>>
> >>
> >>
> >>--
> >>To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> >>the body of a message to majordomo@vger.kernel.org
> >>More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >
> >
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/tests/generic/930 b/tests/generic/930
new file mode 100755
index 0000000..15d8cbf
--- /dev/null
+++ b/tests/generic/930
@@ -0,0 +1,106 @@ 
+#! /bin/bash
+# FS QA Test No. 930
+#
+# Check that reflinking adjacent blocks in a file produces a single
+# block mapping extent.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2017 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 7 15
+
+_cleanup()
+{
+	cd /
+	rm -rf $tmp.*
+	wait
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs generic
+_require_scratch_reflink
+_require_fiemap
+
+echo "Format and mount"
+_scratch_mkfs > $seqres.full 2>&1
+_scratch_mount >> $seqres.full 2>&1
+
+testdir=$SCRATCH_MNT/test-$seq
+mkdir $testdir
+
+blocks=32
+blksz=65536
+sz=$((blocks * blksz))
+
+echo "Create the original files"
+$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full
+_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
+seq 0 $blksz $((sz - blksz)) | while read offset; do
+	_reflink_range $testdir/file1 $offset $testdir/file2 $offset $blksz >> $seqres.full
+done
+
+echo "Compare files"
+md5sum $testdir/file1 | _filter_scratch
+md5sum $testdir/file2 | _filter_scratch
+
+echo "Check extent counts"
+f1=$(_count_extents $testdir/file1)
+f2=$(_count_extents $testdir/file2)
+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
+
+# Did the fs combine the extent mappings when we made f2?
+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
+
+_scratch_cycle_mount
+
+echo "Compare files after remounting"
+md5sum $testdir/file1 | _filter_scratch
+md5sum $testdir/file2 | _filter_scratch
+
+echo "Check extent counts"
+f1=$(_count_extents $testdir/file1)
+f2=$(_count_extents $testdir/file2)
+s1=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
+s2=$($XFS_IO_PROG -c 'fiemap -v' $testdir/file2 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$')
+
+# Are the mappings still combined?
+test $f1 -eq $f2 || echo "f1 ($f1) != f2 ($f2)"
+test $s1 -eq $s2 || echo "s1 ($s1) != s2 ($s2)"
+test $f1 -eq $s1 || echo "f1 ($f1) != s1 ($f1)"
+test $f2 -eq $s2 || echo "f2 ($f2) != s2 ($f2)"
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/930.out b/tests/generic/930.out
new file mode 100644
index 0000000..556108a
--- /dev/null
+++ b/tests/generic/930.out
@@ -0,0 +1,11 @@ 
+QA output created by 930
+Format and mount
+Create the original files
+Compare files
+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
+Check extent counts
+Compare files after remounting
+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file1
+de89461b64701958984c95d1bfb0065a  SCRATCH_MNT/test-930/file2
+Check extent counts
diff --git a/tests/generic/group b/tests/generic/group
index d0bc47d..4b4df66 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -411,3 +411,4 @@ 
 406 auto quick dangerous
 407 auto quick clone metadata
 408 auto quick clone dedupe metadata
+930 auto quick clone