From patchwork Tue Feb 9 01:13:29 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: 8257021 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 64C2C9F6DA for ; Tue, 9 Feb 2016 01:13:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5719320272 for ; Tue, 9 Feb 2016 01:13:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 16E50202D1 for ; Tue, 9 Feb 2016 01:13:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933110AbcBIBNi (ORCPT ); Mon, 8 Feb 2016 20:13:38 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:23572 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933033AbcBIBNh (ORCPT ); Mon, 8 Feb 2016 20:13:37 -0500 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u191DVIF015527 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Feb 2016 01:13:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u191DVQg004333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 9 Feb 2016 01:13:31 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u191DVrp027881; Tue, 9 Feb 2016 01:13:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Feb 2016 17:13:30 -0800 Subject: [PATCH 16/23] 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: Mon, 08 Feb 2016 17:13:29 -0800 Message-ID: <20160209011329.23099.8307.stgit@birch.djwong.org> In-Reply-To: <20160209011145.23099.95354.stgit@birch.djwong.org> References: <20160209011145.23099.95354.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: aserv0021.oracle.com [141.146.126.233] 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.2 required=5.0 tests=BAYES_00, 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 | 105 +++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/305.out | 23 ++++++++++ tests/generic/326 | 105 +++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/326.out | 23 ++++++++++ tests/generic/327 | 92 +++++++++++++++++++++++++++++++++++++++++ tests/generic/327.out | 13 ++++++ tests/generic/328 | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/328.out | 26 ++++++++++++ tests/generic/group | 4 ++ tests/xfs/213 | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/213.out | 23 ++++++++++ tests/xfs/214 | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/214.out | 23 ++++++++++ tests/xfs/group | 2 + 15 files changed, 768 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 3d6a8c1..139e00e 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..5721dd0 --- /dev/null +++ b/tests/generic/305 @@ -0,0 +1,105 @@ +#! /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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/generic/305.out b/tests/generic/305.out new file mode 100644 index 0000000..2acfe04 --- /dev/null +++ b/tests/generic/305.out @@ -0,0 +1,23 @@ +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 +Check for damage diff --git a/tests/generic/326 b/tests/generic/326 new file mode 100755 index 0000000..b71d4bb --- /dev/null +++ b/tests/generic/326 @@ -0,0 +1,105 @@ +#! /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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/generic/326.out b/tests/generic/326.out new file mode 100644 index 0000000..950d8f8 --- /dev/null +++ b/tests/generic/326.out @@ -0,0 +1,23 @@ +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 +Check for damage diff --git a/tests/generic/327 b/tests/generic/327 new file mode 100755 index 0000000..95fa223 --- /dev/null +++ b/tests/generic/327 @@ -0,0 +1,92 @@ +#! /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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/generic/327.out b/tests/generic/327.out new file mode 100644 index 0000000..32e5eab --- /dev/null +++ b/tests/generic/327.out @@ -0,0 +1,13 @@ +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 +Check for damage diff --git a/tests/generic/328 b/tests/generic/328 new file mode 100755 index 0000000..506ca7f --- /dev/null +++ b/tests/generic/328 @@ -0,0 +1,109 @@ +#! /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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/generic/328.out b/tests/generic/328.out new file mode 100644 index 0000000..e5dcb67 --- /dev/null +++ b/tests/generic/328.out @@ -0,0 +1,26 @@ +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 +Check for damage diff --git a/tests/generic/group b/tests/generic/group index 3229dad..d4531f8 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..7441e78 --- /dev/null +++ b/tests/xfs/213 @@ -0,0 +1,110 @@ +#! /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 822, 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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/xfs/213.out b/tests/xfs/213.out new file mode 100644 index 0000000..0028bd1 --- /dev/null +++ b/tests/xfs/213.out @@ -0,0 +1,23 @@ +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 +Check for damage diff --git a/tests/xfs/214 b/tests/xfs/214 new file mode 100755 index 0000000..0cfd69b --- /dev/null +++ b/tests/xfs/214 @@ -0,0 +1,109 @@ +#! /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. +# +#----------------------------------------------------------------------- +# 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".* "$testdir" +} + +# 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 +_need_to_be_root +_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" +rm -rf $testdir +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 + +echo "Check for damage" +umount "$SCRATCH_MNT" + +# success, all done +status=0 +exit diff --git a/tests/xfs/214.out b/tests/xfs/214.out new file mode 100644 index 0000000..8f6bb0f --- /dev/null +++ b/tests/xfs/214.out @@ -0,0 +1,23 @@ +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 +Check for damage 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