Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- 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 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 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs