From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5D4B5C43381 for ; Mon, 25 Mar 2019 23:49:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 03CAD206DF for ; Mon, 25 Mar 2019 23:49:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="gy3OOdHc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727584AbfCYXtz (ORCPT ); Mon, 25 Mar 2019 19:49:55 -0400 Received: from aserp2130.oracle.com ([141.146.126.79]:58018 "EHLO aserp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726350AbfCYXtz (ORCPT ); Mon, 25 Mar 2019 19:49:55 -0400 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x2PNnWt4160590; Mon, 25 Mar 2019 23:49:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : in-reply-to; s=corp-2018-07-02; bh=qS67Klt8p3LoGfk7wdhRLZx7MzkiRxcCFPJHqglt0is=; b=gy3OOdHcyYnkD0M3aJAsZYLIfDqWdkYOrHSmvH7HUrTfhtluvPssWi5NPFXsQZ0d0EnS bmOv2E8zUfWvrOb11kQomFqKpQOAWR/rZ5nVHOg1Tuh+D73hjUlhyfIsOAsulvN5umAj ExoQTO/H+wM1c0rLcz6HvXRpHYVBbmlXR8EZRk0+GT9Cnr6nWJTGhVaqqOv0H74FDbYx kT7c6eQG218iUU8740Y/hIQupyODc5JIKFUqSxESoD+9+fsf9Qinap36hAtVksYGNfNA fCVCboJpc085+XVhWj3wAr7I0aRYynwhL5aQzHpVE/DDZhF4YkJIaHfrmgnO5lKiR9Uh nA== Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp2130.oracle.com with ESMTP id 2re6g0q7w0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Mar 2019 23:49:32 +0000 Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.14.4/8.14.4) with ESMTP id x2PNnVQG013133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Mar 2019 23:49:31 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x2PNnToD004607; Mon, 25 Mar 2019 23:49:29 GMT Received: from localhost (/10.145.178.102) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 25 Mar 2019 16:49:29 -0700 Date: Mon, 25 Mar 2019 16:49:26 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: akpm@linux-foundation.org, ocfs2-devel@oss.oracle.com, mark@fasheh.com, jlbec@evilplan.org, linux-fsdevel@vger.kernel.org, mfasheh@versity.com, fstests Subject: Re: [RFC PATCH] clonerange: test remapping the rainbow Message-ID: <20190325234926.GB15524@magnolia> References: <20190312214910.GK20533@magnolia> <20190313164600.GA4657@magnolia> <20190323071438.GQ2824@desktop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190323071438.GQ2824@desktop> User-Agent: Mutt/1.9.4 (2018-02-28) X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9206 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1903250167 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org On Sat, Mar 23, 2019 at 03:14:38PM +0800, Eryu Guan wrote: > On Wed, Mar 13, 2019 at 09:46:00AM -0700, Darrick J. Wong wrote: > > From: Darrick J. Wong > > > > Add some more clone range tests that missed various "wacky" combinations > > of file state. Specifically, we test reflinking into and out of rainbow > > ranges (a mix of real, unwritten, hole, delalloc, and shared extents), > > and also we test that we can correctly handle double-inode locking no > > matter what order of inodes or the filesystem's locking rules. > > > > Signed-off-by: Darrick J. Wong > > Sorry for the late review.. The tests look good to me overall, only some > really minor comments inline. Thanks for reviewing! > > --- > > common/reflink | 7 ++ > > tests/generic/940 | 94 ++++++++++++++++++++++++ > > tests/generic/940.out | 14 ++++ > > tests/generic/941 | 99 +++++++++++++++++++++++++ > > tests/generic/941.out | 16 ++++ > > tests/generic/942 | 95 ++++++++++++++++++++++++ > > tests/generic/942.out | 14 ++++ > > tests/generic/943 | 99 +++++++++++++++++++++++++ > > tests/generic/943.out | 16 ++++ > > tests/generic/944 | 196 +++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/generic/944.out | 62 ++++++++++++++++ > > tests/generic/group | 5 + > > 12 files changed, 716 insertions(+), 1 deletion(-) > > create mode 100755 tests/generic/940 > > create mode 100644 tests/generic/940.out > > create mode 100755 tests/generic/941 > > create mode 100644 tests/generic/941.out > > create mode 100755 tests/generic/942 > > create mode 100644 tests/generic/942.out > > create mode 100755 tests/generic/943 > > create mode 100644 tests/generic/943.out > > create mode 100755 tests/generic/944 > > create mode 100644 tests/generic/944.out > > > > diff --git a/common/reflink b/common/reflink > > index 11561a76..598f0877 100644 > > --- a/common/reflink > > +++ b/common/reflink > > @@ -14,9 +14,14 @@ _require_cp_reflink() > > # Can we reflink between arbitrary file sets? > > # i.e. if we reflink a->b and c->d, can we later share > > # blocks between b & c? > > +_supports_arbitrary_fileset_reflink() > > +{ > > + test "$FSTYP" != "ocfs2" > > +} > > + > > _require_arbitrary_fileset_reflink() > > { > > - test "$FSTYP" = "ocfs2" && \ > > + _supports_arbitrary_fileset_reflink || > > _notrun "reflink between arbitrary file groups not supported in $FSTYP" > > } > > > > diff --git a/tests/generic/940 b/tests/generic/940 > > new file mode 100755 > > index 00000000..4573cbae > > --- /dev/null > > +++ b/tests/generic/940 > > @@ -0,0 +1,94 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# FS QA Test No. 940 > > +# > > +# Ensuring that reflinking works when the destination range covers multiple > > +# extents, some unwritten, some not: > > +# > > +# - Create a file with the following repeating sequence of blocks: > > +# 1. reflinked > > +# 2. unwritten > > +# 3. hole > > +# 4. regular block > > +# 5. delalloc > > +# - reflink across the halfway mark, starting with the unwritten extent. > > +# - Check that the files are now different where we say they're different. > > +# > > +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 -rf $tmp.* $testdir > > Seems there's no need to remove $testdir, as it's created in > $SCRATCH_MNT. And use tab for indention here :) Will fix. > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > _supported_fs generic Fixed. > > +_require_scratch_reflink > > +_require_xfs_io_command "falloc" > > +_require_xfs_io_command "fpunch" > > +_require_cp_reflink > > +_require_odirect > > Are above three requires really needed? I don't see the use of 'fpunch' > 'cp --reflink' and direct I/O in the test. > > Above comments apply to generic/94[123] as well. Fixed. > > + > > +rm -f $seqres.full > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +testdir=$SCRATCH_MNT/test-$seq > > +mkdir $testdir > > + > > +echo "Create the original files" > > +blksz=65536 > > +nr=64 > > +filesize=$((blksz * nr)) > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2 >> $seqres.full > > +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +echo "reflink across the transition" > > +roff=$((filesize / 4)) > > +rsz=$((filesize / 2)) > > +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full > > + > > +# now reflink into the rainbow > > +echo "before reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +$XFS_IO_PROG -f -c "reflink $testdir/file2 $roff $roff $rsz" $testdir/file3 >> $seqres.full > > +_pwrite_byte 0x64 $roff $rsz $testdir/file3.chk >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +echo "after reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/940.out b/tests/generic/940.out > > new file mode 100644 > > index 00000000..d34c7b50 > > --- /dev/null > > +++ b/tests/generic/940.out > > @@ -0,0 +1,14 @@ > > +QA output created by 940 > > +Format and mount > > +Create the original files > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-940/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-940/file2 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-940/file3 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-940/file3.chk > > +reflink across the transition > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-940/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-940/file2 > > +5d47954e2336b2547afde6e44d2f13cc SCRATCH_MNT/test-940/file3 > > +5d47954e2336b2547afde6e44d2f13cc SCRATCH_MNT/test-940/file3.chk > > diff --git a/tests/generic/941 b/tests/generic/941 > > new file mode 100755 > > index 00000000..145b8585 > > --- /dev/null > > +++ b/tests/generic/941 > > @@ -0,0 +1,99 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# FS QA Test No. 941 > > +# > > +# Ensuring that reflinking works when the source range covers multiple > > +# extents, some unwritten, some not: > > +# > > +# - Create a file with the following repeating sequence of blocks: > > +# 1. reflinked > > +# 2. unwritten > > +# 3. hole > > +# 4. regular block > > +# 5. delalloc > > +# - reflink across the halfway mark, starting with the unwritten extent. > > +# - Check that the files are now different where we say they're different. > > +# > > +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 -rf $tmp.* $testdir > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_xfs_io_command "falloc" > > +_require_xfs_io_command "fpunch" > > +_require_cp_reflink > > +_require_odirect > > + > > +rm -f $seqres.full > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +testdir=$SCRATCH_MNT/test-$seq > > +mkdir $testdir > > + > > +echo "Create the original files" > > +blksz=65536 > > +nr=64 > > +filesize=$((blksz * nr)) > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2 >> $seqres.full > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2.chk >> $seqres.full > > +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file2.chk | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +echo "reflink across the transition" > > +roff=$((filesize / 4)) > > +rsz=$((filesize / 2)) > > +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full > > + > > +# now reflink the rainbow > > +echo "before reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +$XFS_IO_PROG -f -c "reflink $testdir/file3 $roff $roff $rsz" $testdir/file2 >> $seqres.full > > +cp $testdir/file3.chk $testdir/file2.chk > > +_pwrite_byte 0x64 0 $roff $testdir/file2.chk >> $seqres.full > > +_pwrite_byte 0x64 $((roff + rsz)) $((filesize - (roff + rsz) )) $testdir/file2.chk >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +echo "after reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file2.chk | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/941.out b/tests/generic/941.out > > new file mode 100644 > > index 00000000..a76e6c62 > > --- /dev/null > > +++ b/tests/generic/941.out > > @@ -0,0 +1,16 @@ > > +QA output created by 941 > > +Format and mount > > +Create the original files > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-941/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-941/file2 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-941/file2.chk > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-941/file3 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-941/file3.chk > > +reflink across the transition > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-941/file1 > > +51a300aae3a4b4eaa023876a397e01ef SCRATCH_MNT/test-941/file2 > > +51a300aae3a4b4eaa023876a397e01ef SCRATCH_MNT/test-941/file2.chk > > +7bf7a779a0a54647b41753206c5218b1 SCRATCH_MNT/test-941/file3 > > +7bf7a779a0a54647b41753206c5218b1 SCRATCH_MNT/test-941/file3.chk > > diff --git a/tests/generic/942 b/tests/generic/942 > > new file mode 100755 > > index 00000000..92b0f298 > > --- /dev/null > > +++ b/tests/generic/942 > > @@ -0,0 +1,95 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# FS QA Test No. 942 > > +# > > +# Ensuring that reflinking works when the destination range covers multiple > > +# extents, some unwritten, some not: > > +# > > +# - Create a file with the following repeating sequence of blocks: > > +# 1. reflinked > > +# 2. unwritten > > +# 3. hole > > +# 4. regular block > > +# 5. delalloc > > +# - reflink across the halfway mark, starting with the unwritten extent. > > +# - Check that the files are now different where we say they're different. > > +# > > +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 -rf $tmp.* $testdir > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_xfs_io_command "falloc" > > +_require_xfs_io_command "fpunch" > > +_require_cp_reflink > > +_require_odirect > > + > > +rm -f $seqres.full > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +testdir=$SCRATCH_MNT/test-$seq > > +mkdir $testdir > > + > > +echo "Create the original files" > > +blksz=65536 > > +nr=64 > > +filesize=$((blksz * nr)) > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2 >> $seqres.full > > +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +echo "reflink across the transition" > > +soff=$((filesize / 4)) > > +doff=$((filesize / 2)) > > +rsz=$((filesize / 2)) > > +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full > > + > > +# now reflink into the rainbow > > +echo "before reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +$XFS_IO_PROG -f -c "reflink $testdir/file2 $soff $doff $rsz" $testdir/file3 >> $seqres.full > > +_pwrite_byte 0x64 $doff $rsz $testdir/file3.chk >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +echo "after reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/942.out b/tests/generic/942.out > > new file mode 100644 > > index 00000000..529ecff2 > > --- /dev/null > > +++ b/tests/generic/942.out > > @@ -0,0 +1,14 @@ > > +QA output created by 942 > > +Format and mount > > +Create the original files > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-942/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-942/file2 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-942/file3 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-942/file3.chk > > +reflink across the transition > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-942/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-942/file2 > > +52bb341f992de6ef4bf5e5d61177eddc SCRATCH_MNT/test-942/file3 > > +52bb341f992de6ef4bf5e5d61177eddc SCRATCH_MNT/test-942/file3.chk > > diff --git a/tests/generic/943 b/tests/generic/943 > > new file mode 100755 > > index 00000000..91dfa75b > > --- /dev/null > > +++ b/tests/generic/943 > > @@ -0,0 +1,99 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# FS QA Test No. 943 > > +# > > +# Ensuring that reflinking works when the source range covers multiple > > +# extents, some unwritten, some not: > > +# > > +# - Create a file with the following repeating sequence of blocks: > > +# 1. reflinked > > +# 2. unwritten > > +# 3. hole > > +# 4. regular block > > +# 5. delalloc > > +# - reflink across the halfway mark, starting with the unwritten extent. > > +# - Check that the files are now different where we say they're different. > > +# > > +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 -rf $tmp.* $testdir > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_xfs_io_command "falloc" > > +_require_xfs_io_command "fpunch" > > +_require_cp_reflink > > +_require_odirect > > + > > +rm -f $seqres.full > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +testdir=$SCRATCH_MNT/test-$seq > > +mkdir $testdir > > + > > +echo "Create the original files" > > +blksz=65536 > > +nr=64 > > +filesize=$((blksz * nr)) > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2 >> $seqres.full > > +_pwrite_byte 0x64 0 $((blksz * nr)) $testdir/file2.chk >> $seqres.full > > +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file2.chk | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +echo "reflink across the transition" > > +soff=$((filesize / 4)) > > +doff=$((filesize / 2)) > > +rsz=$((filesize / 2)) > > +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full > > + > > +# now reflink the rainbow > > +echo "before reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +$XFS_IO_PROG -f -c "reflink $testdir/file3 $soff $doff $rsz" $testdir/file2 >> $seqres.full > > +truncate -s $doff $testdir/file2.chk > > $XFS_IO_PROG -c "truncate $doff" $testdir/file2.chk Fixed. > > +dd if=$testdir/file3.chk skip=$((soff / blksz)) count=$((rsz / blksz)) bs=$blksz >> $testdir/file2.chk 2> /dev/null > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +echo "after reflink" >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file2 >> $seqres.full > > +$FILEFRAG_PROG -v $testdir/file3 >> $seqres.full > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > +md5sum $testdir/file2.chk | _filter_scratch > > +md5sum $testdir/file3 | _filter_scratch > > +md5sum $testdir/file3.chk | _filter_scratch > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/943.out b/tests/generic/943.out > > new file mode 100644 > > index 00000000..471c3f34 > > --- /dev/null > > +++ b/tests/generic/943.out > > @@ -0,0 +1,16 @@ > > +QA output created by 943 > > +Format and mount > > +Create the original files > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-943/file1 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-943/file2 > > +5a5221017d3ab8fd7583312a14d2ba80 SCRATCH_MNT/test-943/file2.chk > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-943/file3 > > +6366fd359371414186688a0ef6988893 SCRATCH_MNT/test-943/file3.chk > > +reflink across the transition > > +Compare files > > +bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-943/file1 > > +d93123af536c8c012f866ea383a905ce SCRATCH_MNT/test-943/file2 > > +d93123af536c8c012f866ea383a905ce SCRATCH_MNT/test-943/file2.chk > > +7bf7a779a0a54647b41753206c5218b1 SCRATCH_MNT/test-943/file3 > > +7bf7a779a0a54647b41753206c5218b1 SCRATCH_MNT/test-943/file3.chk > > diff --git a/tests/generic/944 b/tests/generic/944 > > new file mode 100755 > > index 00000000..237cd2da > > --- /dev/null > > +++ b/tests/generic/944 > > @@ -0,0 +1,196 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright (c) 2019, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# FS QA Test No. 944 > > +# > > +# Ensure that we can reflink from a file with a higher inode number to a lower > > +# inode number and vice versa. Mix it up by doing this test with inodes that > > +# already share blocks and inodes that don't share blocks. This tests both > > +# double-inode locking order correctness as well as stressing things like ocfs2 > > +# which have per-inode sharing groups and therefore have to check that we don't > > +# try to link data between disjoint sharing groups. > > +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 -rf $tmp.* $testdir > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_cp_reflink > > + > > +rm -f $seqres.full > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +blksz=65536 > > +nr=2 > > +filesize=$((blksz * nr)) > > +testdir=$SCRATCH_MNT/test-$seq > > +dummy_file=$testdir/dummy > > +low_file=$testdir/low > > +high_file=$testdir/high > > +scenario=1 > > +mkdir $testdir > > + > > +# Return inode number > > +inum() { > > + stat -c '%i' $1 > > +} > > + > > +# Create two test files, make $low_file the file with the lower inode > > +# number, and make $high_file the file with the higher inode number. > > +create_files() { > > + _pwrite_byte 0x60 0 $filesize $testdir/file1 >> $seqres.full > > + _pwrite_byte 0x61 0 $filesize $testdir/file2 >> $seqres.full > > + if [ "$(inum $testdir/file1)" -lt "$(inum $testdir/file2)" ]; then > > + mv $testdir/file1 $low_file > > + mv $testdir/file2 $high_file > > + else > > + mv $testdir/file2 $low_file > > + mv $testdir/file1 $high_file > > + fi > > +} > > + > > +# Check md5sum of both files, but keep results sorted by inode order > > +check_files() { > > + md5sum $low_file | _filter_scratch > > + md5sum $high_file | _filter_scratch > > +} > > + > > +# Test reflinking data from the first file to the second file > > +test_files() { > > + local src="$1" > > + local dest="$2" > > + local off=$((filesize / 2)) > > + local sz=$((filesize / 2)) > > + > > + check_files > > + _reflink_range $src $off $dest $off $sz >> $seqres.full > > + _scratch_cycle_mount > > + check_files > > +} > > + > > +# Make a file shared with a dummy file > > +dummy_share() { > > + local which="$2" > > + test -z "$which" && which=1 > > + local dummy=$dummy_file.$which > > + > > + rm -f $dummy > > + _cp_reflink $1 $dummy > > +} > > + > > +# Make two files share (different ranges) with a dummy file > > +mutual_dummy_share() { > > + rm -f $dummy_file > > + _cp_reflink $1 $dummy_file > > + _reflink_range $2 0 $dummy_file $blksz $blksz >> $seqres.full > > +} > > + > > +# Announce ourselves, remembering which scenario we've tried > > +ann() { > > + echo "$scenario: $@" | tee -a $seqres.full > > + scenario=$((scenario + 1)) > > +} > > + > > +# Scenario 1: low to high, neither file shares > > +ann "low to high, neither share" > > +create_files > > +test_files $low_file $high_file > > + > > +# Scenario 2: high to low, neither file shares > > +ann "high to low, neither share" > > +create_files > > +test_files $high_file $low_file > > + > > +# Scenario 3: low to high, only source file shares > > +ann "low to high, only source shares" > > +create_files > > +dummy_share $low_file > > +test_files $low_file $high_file > > + > > +# Scenario 4: high to low, only source file shares > > +ann "high to low, only source shares" > > +create_files > > +dummy_share $high_file > > +test_files $high_file $low_file > > + > > +# Scenario 5: low to high, only dest file shares > > +ann "low to high, only dest shares" > > +create_files > > +dummy_share $high_file > > +test_files $low_file $high_file > > + > > +# Scenario 6: high to low, only dest file shares > > +ann "high to low, only dest shares" > > +create_files > > +dummy_share $low_file > > +test_files $high_file $low_file > > + > > +# Scenario 7: low to high, both files share with each other > > +ann "low to high, both files share with each other" > > +create_files > > +_reflink_range $low_file 0 $high_file 0 $blksz >> $seqres.full > > +test_files $low_file $high_file > > + > > +# Scenario 8: high to low, both files share with each other > > +ann "high to low, both files share with each other" > > +create_files > > +_reflink_range $low_file 0 $high_file 0 $blksz >> $seqres.full > > +test_files $high_file $low_file > > + > > +# Scenario 9: low to high, both files share but not with each other > > +ann "low to high, both files share but not with each other" > > +create_files > > +# ocfs2 can only reflink between files sharing a refcount tree, so for > > +# this test (and #10) we skip the dummy file because we'd rather not split > > +# the test code just to mask off the /one/ weird fs like this... > > +if _supports_arbitrary_fileset_reflink; then > > + dummy_share $low_file 1 > > + dummy_share $high_file 2 > > +fi > > +test_files $low_file $high_file > > + > > +# Scenario 10: high to low, both files share but not with each other > > +ann "high to low, both files share but not with each other" > > +create_files > > +if _supports_arbitrary_fileset_reflink; then > > + dummy_share $low_file 1 > > + dummy_share $high_file 2 > > +fi > > +test_files $high_file $low_file > > + > > +# Scenario 11: low to high, both files share mutually > > +ann "low to high, both files share mutually" > > +create_files > > +mutual_dummy_share $low_file $high_file > > +test_files $low_file $high_file > > + > > +# Scenario 12: high to low, both files share mutually > > +ann "high to low, both files share mutually" > > +create_files > > +mutual_dummy_share $low_file $high_file > > +test_files $high_file $low_file > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/944.out b/tests/generic/944.out > > new file mode 100644 > > index 00000000..aa53fdce > > --- /dev/null > > +++ b/tests/generic/944.out > > @@ -0,0 +1,62 @@ > > +QA output created by 944 > > +Format and mount > > +1: low to high, neither share > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +de1d43fbed633326daed6f71912e09e1 SCRATCH_MNT/test-944/high > > +2: high to low, neither share > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +3: low to high, only source shares > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +de1d43fbed633326daed6f71912e09e1 SCRATCH_MNT/test-944/high > > +4: high to low, only source shares > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +5: low to high, only dest shares > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +de1d43fbed633326daed6f71912e09e1 SCRATCH_MNT/test-944/high > > +6: high to low, only dest shares > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +7: low to high, both files share with each other > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/high > > +8: high to low, both files share with each other > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/high > > +9: low to high, both files share but not with each other > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +de1d43fbed633326daed6f71912e09e1 SCRATCH_MNT/test-944/high > > +10: high to low, both files share but not with each other > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +11: low to high, both files share mutually > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +de1d43fbed633326daed6f71912e09e1 SCRATCH_MNT/test-944/high > > +12: high to low, both files share mutually > > +07d9f5b0e07f22bff26e39f929cfc460 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > +0d2ce48b6a4527783bd30ce21f09fec0 SCRATCH_MNT/test-944/low > > +81615449a98aaaad8dc179b3bec87f38 SCRATCH_MNT/test-944/high > > diff --git a/tests/generic/group b/tests/generic/group > > index 78b9b45d..2e4341fb 100644 > > --- a/tests/generic/group > > +++ b/tests/generic/group > > @@ -538,3 +538,8 @@ > > 533 auto quick attr > > 534 auto quick log > > 535 auto quick log > > +940 auto quick clone punch > > +941 auto quick clone punch > > +942 auto quick clone punch > > +943 auto quick clone punch > > +944 auto quick clone punch > > And they don't belong to 'punch' group. Ok, will fix all these for the next submission. > Thanks, > Eryu