From patchwork Thu Feb 11 23:41:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 8286451 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id A94B29F859 for ; Thu, 11 Feb 2016 23:54:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AB965202FE for ; Thu, 11 Feb 2016 23:54:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5007520268 for ; Thu, 11 Feb 2016 23:54:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751375AbcBKXmH (ORCPT ); Thu, 11 Feb 2016 18:42:07 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:19629 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751307AbcBKXl4 (ORCPT ); Thu, 11 Feb 2016 18:41:56 -0500 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u1BNfpa8024594 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 11 Feb 2016 23:41:51 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u1BNfplp015746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 11 Feb 2016 23:41:51 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u1BNfoDl006872; Thu, 11 Feb 2016 23:41:50 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 11 Feb 2016 15:41:49 -0800 Subject: [PATCH 22/32] reflink: test quota accounting From: "Darrick J. Wong" To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 11 Feb 2016 15:41:48 -0800 Message-ID: <20160211234148.2202.94396.stgit@birch.djwong.org> In-Reply-To: <20160211233916.2202.40961.stgit@birch.djwong.org> References: <20160211233916.2202.40961.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,LOTS_OF_MONEY, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Darrick J. Wong --- common/reflink | 2 - tests/generic/305 | 100 ++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/305.out | 22 ++++++++++ tests/generic/326 | 101 +++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/326.out | 22 ++++++++++ tests/generic/327 | 87 ++++++++++++++++++++++++++++++++++++++++ tests/generic/327.out | 12 ++++++ tests/generic/328 | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/328.out | 25 ++++++++++++ tests/generic/group | 4 ++ tests/xfs/213 | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/213.out | 22 ++++++++++ tests/xfs/214 | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/214.out | 22 ++++++++++ tests/xfs/group | 2 + 15 files changed, 736 insertions(+), 1 deletion(-) create mode 100755 tests/generic/305 create mode 100644 tests/generic/305.out create mode 100755 tests/generic/326 create mode 100644 tests/generic/326.out create mode 100755 tests/generic/327 create mode 100644 tests/generic/327.out create mode 100755 tests/generic/328 create mode 100644 tests/generic/328.out create mode 100755 tests/xfs/213 create mode 100644 tests/xfs/213.out create mode 100755 tests/xfs/214 create mode 100644 tests/xfs/214.out -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/common/reflink b/common/reflink index 5d92a88..4ec390d 100644 --- a/common/reflink +++ b/common/reflink @@ -153,7 +153,7 @@ _cp_reflink() { file1="$1" file2="$2" - cp --reflink=always "$file1" "$file2" + cp --reflink=always -p "$file1" "$file2" } # Reflink some file1 into file2 diff --git a/tests/generic/305 b/tests/generic/305 new file mode 100755 index 0000000..9356a86 --- /dev/null +++ b/tests/generic/305 @@ -0,0 +1,100 @@ +#! /bin/bash +# FS QA Test No. 305 +# +# Ensure that quota charges us for reflinking a file and that we're not +# charged for buffered copy on write. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file3 >> $seqres.full +touch $testdir/urk +chown nobody $testdir/urk +touch $testdir/erk +chown fsgqa $testdir/erk +_repquota +_scratch_remount + +echo "Change file ownership" +chown fsgqa $testdir/file1 +chown fsgqa $testdir/file2 +chown fsgqa $testdir/file3 +_repquota + +echo "CoW one of the files" +$XFS_IO_PROG -f -c "pwrite -S 0x63 -b $((sz/2)) 0 $((sz/2))" -c "fsync" $testdir/file2 >> $seqres.full +_repquota + +echo "Remount the FS to see if accounting changes" +_scratch_remount +_repquota + +echo "Chown one of the files" +chown nobody $testdir/file3 +_repquota + +# success, all done +status=0 +exit diff --git a/tests/generic/305.out b/tests/generic/305.out new file mode 100644 index 0000000..0bfd620 --- /dev/null +++ b/tests/generic/305.out @@ -0,0 +1,22 @@ +QA output created by 305 +Format and mount +Create the original files +root -- 3072 0 0 7 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 0 0 0 1 0 0 +Change file ownership +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +CoW one of the files +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Remount the FS to see if accounting changes +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Chown one of the files +root -- 0 0 0 4 0 0 +nobody -- 1024 0 0 2 0 0 +fsgqa -- 2048 0 0 3 0 0 diff --git a/tests/generic/326 b/tests/generic/326 new file mode 100755 index 0000000..b6c748c --- /dev/null +++ b/tests/generic/326 @@ -0,0 +1,101 @@ +#! /bin/bash +# FS QA Test No. 326 +# +# Ensure that quota charges us for reflinking a file and that we're not +# charged for directio copy on write. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody +_require_odirect + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file3 >> $seqres.full +touch $testdir/urk +chown nobody $testdir/urk +touch $testdir/erk +chown fsgqa $testdir/erk +_repquota +_scratch_remount + +echo "Change file ownership" +chown fsgqa $testdir/file1 +chown fsgqa $testdir/file2 +chown fsgqa $testdir/file3 +_repquota + +echo "CoW one of the files" +$XFS_IO_PROG -d -f -c "pwrite -S 0x63 -b $((sz/2)) 0 $((sz/2))" -c "fsync" $testdir/file2 >> $seqres.full +_repquota + +echo "Remount the FS to see if accounting changes" +_scratch_remount +_repquota + +echo "Chown one of the files" +chown nobody $testdir/file3 +_repquota + +# success, all done +status=0 +exit diff --git a/tests/generic/326.out b/tests/generic/326.out new file mode 100644 index 0000000..e771eb7 --- /dev/null +++ b/tests/generic/326.out @@ -0,0 +1,22 @@ +QA output created by 326 +Format and mount +Create the original files +root -- 3072 0 0 7 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 0 0 0 1 0 0 +Change file ownership +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +CoW one of the files +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Remount the FS to see if accounting changes +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Chown one of the files +root -- 0 0 0 4 0 0 +nobody -- 1024 0 0 2 0 0 +fsgqa -- 2048 0 0 3 0 0 diff --git a/tests/generic/327 b/tests/generic/327 new file mode 100755 index 0000000..90d2aca --- /dev/null +++ b/tests/generic/327 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. 327 +# +# Ensure that we can't go over the hard block limit when reflinking. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +chown fsgqa $testdir/file1 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_repquota +_scratch_remount + +echo "Set hard quota to prevent third reflink" +setquota -u fsgqa 0 1024 0 0 $SCRATCH_MNT +_repquota + +echo "Try to reflink again" +touch $testdir/file3 +chown fsgqa $testdir/file3 +_cp_reflink $testdir/file1 $testdir/file3 2>&1 | _filter_scratch +_repquota + +# success, all done +status=0 +exit diff --git a/tests/generic/327.out b/tests/generic/327.out new file mode 100644 index 0000000..7160ff2 --- /dev/null +++ b/tests/generic/327.out @@ -0,0 +1,12 @@ +QA output created by 327 +Format and mount +Create the original files +root -- 0 0 0 4 0 0 +fsgqa -- 2048 0 0 2 0 0 +Set hard quota to prevent third reflink +root -- 0 0 0 4 0 0 +fsgqa +- 2048 0 1024 2 0 0 +Try to reflink again +cp: failed to clone 'SCRATCH_MNT/test-327/file3' from 'SCRATCH_MNT/test-327/file1': Disk quota exceeded +root -- 0 0 0 4 0 0 +fsgqa +- 2048 0 1024 3 0 0 diff --git a/tests/generic/328 b/tests/generic/328 new file mode 100755 index 0000000..46cfa66 --- /dev/null +++ b/tests/generic/328 @@ -0,0 +1,105 @@ +#! /bin/bash +# FS QA Test No. 328 +# +# Ensure that we can't go over the hard block limit when CoWing a file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody +_require_odirect + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +chown fsgqa $testdir/file1 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file3 >> $seqres.full +_repquota +_scratch_remount + +echo "Set hard quota to prevent rewrite" +setquota -u fsgqa 0 1024 0 0 $SCRATCH_MNT +_repquota + +echo "Try to dio write the whole file" +_pwrite_byte 0x62 0 $sz $testdir/file1 -d >> $seqres.full +_repquota + +echo "Try to write the whole file" +_pwrite_byte 0x62 0 $sz $testdir/file1 >> $seqres.full +_repquota + +echo "Set hard quota to allow rewrite" +setquota -u fsgqa 0 8192 0 0 $SCRATCH_MNT +_repquota + +echo "Try to dio write the whole file" +_pwrite_byte 0x62 0 $sz $testdir/file1 -d >> $seqres.full +sync +_repquota + +echo "Try to write the whole file" +_pwrite_byte 0x62 0 $sz $testdir/file3 >> $seqres.full +sync +_repquota + +# success, all done +status=0 +exit diff --git a/tests/generic/328.out b/tests/generic/328.out new file mode 100644 index 0000000..5e99255 --- /dev/null +++ b/tests/generic/328.out @@ -0,0 +1,25 @@ +QA output created by 328 +Format and mount +Create the original files +root -- 0 0 0 4 0 0 +fsgqa -- 3072 0 0 3 0 0 +Set hard quota to prevent rewrite +root -- 0 0 0 4 0 0 +fsgqa +- 3072 0 1024 3 0 0 +Try to dio write the whole file +pwrite64: Disk quota exceeded +root -- 0 0 0 4 0 0 +fsgqa +- 3072 0 1024 3 0 0 +Try to write the whole file +pwrite64: Disk quota exceeded +root -- 0 0 0 4 0 0 +fsgqa +- 3072 0 1024 3 0 0 +Set hard quota to allow rewrite +root -- 0 0 0 4 0 0 +fsgqa -- 3072 0 8192 3 0 0 +Try to dio write the whole file +root -- 0 0 0 4 0 0 +fsgqa -- 3072 0 8192 3 0 0 +Try to write the whole file +root -- 0 0 0 4 0 0 +fsgqa -- 3072 0 8192 3 0 0 diff --git a/tests/generic/group b/tests/generic/group index 4a1cce4..8b9e0e5 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -307,6 +307,7 @@ 302 auto quick clone 303 auto quick clone 304 auto quick clone +305 auto quick clone 306 auto quick rw 307 auto quick 308 auto quick @@ -327,3 +328,6 @@ 323 auto aio stress 324 auto fsr quick 325 auto quick data log +326 auto quick clone +327 auto quick clone +328 auto quick clone diff --git a/tests/xfs/213 b/tests/xfs/213 new file mode 100755 index 0000000..2450097 --- /dev/null +++ b/tests/xfs/213 @@ -0,0 +1,105 @@ +#! /bin/bash +# FS QA Test No. 213 +# +# Ensure that quota charges us for reflnking a file and that we're not +# charged for buffered copy on write. Same test as g/305, but we get to +# play with cowextsz. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody +_require_xfs_io_command "cowextsize" + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +blksz=65536 +echo "Create the original files" +$XFS_IO_PROG -c "cowextsize $((sz/2))" $testdir >> $seqres.full +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file3 >> $seqres.full +touch $testdir/urk +chown nobody $testdir/urk +touch $testdir/erk +chown fsgqa $testdir/erk +_repquota +_scratch_remount + +echo "Change file ownership" +chown fsgqa $testdir/file1 +chown fsgqa $testdir/file2 +chown fsgqa $testdir/file3 +_repquota + +echo "CoW one of the files" +$XFS_IO_PROG -f -c "pwrite -S 0x63 -b $blksz $((sz - blksz)) $blksz" -c "fsync" $testdir/file2 >> $seqres.full +_repquota + +echo "Remount the FS to see if accounting changes" +_scratch_remount +_repquota + +echo "Chown one of the files" +chown nobody $testdir/file3 +_repquota + +# success, all done +status=0 +exit diff --git a/tests/xfs/213.out b/tests/xfs/213.out new file mode 100644 index 0000000..be8d56c --- /dev/null +++ b/tests/xfs/213.out @@ -0,0 +1,22 @@ +QA output created by 213 +Format and mount +Create the original files +root -- 3072 0 0 7 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 0 0 0 1 0 0 +Change file ownership +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +CoW one of the files +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3520 0 0 4 0 0 +Remount the FS to see if accounting changes +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Chown one of the files +root -- 0 0 0 4 0 0 +nobody -- 1024 0 0 2 0 0 +fsgqa -- 2048 0 0 3 0 0 diff --git a/tests/xfs/214 b/tests/xfs/214 new file mode 100755 index 0000000..847f489 --- /dev/null +++ b/tests/xfs/214 @@ -0,0 +1,106 @@ +#! /bin/bash +# FS QA Test No. 214 +# +# Ensure that quota charges us for reflnking a file and that we're not +# charged for directio copy on write. Same as g/326, but we get to play +# with cowextsz. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_quota +_require_nobody +_require_xfs_io_command "cowextsize" +_require_odirect + +_repquota() { + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> $seqres.full 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +sz=1048576 +blksz=65536 +echo "Create the original files" +$XFS_IO_PROG -c "cowextsize $((sz/2))" $testdir >> $seqres.full +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $sz 0 $sz" $testdir/file1 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_cp_reflink $testdir/file1 $testdir/file3 >> $seqres.full +touch $testdir/urk +chown nobody $testdir/urk +touch $testdir/erk +chown fsgqa $testdir/erk +_repquota +_scratch_remount + +echo "Change file ownership" +chown fsgqa $testdir/file1 +chown fsgqa $testdir/file2 +chown fsgqa $testdir/file3 +_repquota + +echo "CoW one of the files" +$XFS_IO_PROG -d -f -c "pwrite -S 0x63 -b $blksz $((sz - blksz)) $blksz" -c "fsync" $testdir/file2 >> $seqres.full +_repquota + +echo "Remount the FS to see if accounting changes" +_scratch_remount +_repquota + +echo "Chown one of the files" +chown nobody $testdir/file3 +_repquota + +# success, all done +status=0 +exit diff --git a/tests/xfs/214.out b/tests/xfs/214.out new file mode 100644 index 0000000..496a503 --- /dev/null +++ b/tests/xfs/214.out @@ -0,0 +1,22 @@ +QA output created by 214 +Format and mount +Create the original files +root -- 3072 0 0 7 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 0 0 0 1 0 0 +Change file ownership +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +CoW one of the files +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3520 0 0 4 0 0 +Remount the FS to see if accounting changes +root -- 0 0 0 4 0 0 +nobody -- 0 0 0 1 0 0 +fsgqa -- 3072 0 0 4 0 0 +Chown one of the files +root -- 0 0 0 4 0 0 +nobody -- 1024 0 0 2 0 0 +fsgqa -- 2048 0 0 3 0 0 diff --git a/tests/xfs/group b/tests/xfs/group index d4a0d59..afd960f 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -210,6 +210,8 @@ 210 auto quick clone 211 clone_stress 212 auto quick clone +213 auto quick clone +214 auto quick clone 216 log metadata auto quick 217 log metadata auto 220 auto quota quick