reflink: test accuracy of free block counts

Check that the free block counts seem to be handled correctly in
the reflink operation and subsequent attempts to rewrite reflinked
copies.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Darrick J. Wong
2015-11-17 08:39:43 +11:00
committed by Dave Chinner
parent c84e01bac3
commit bed1fedae6
15 changed files with 798 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
#! /bin/bash
# FS QA Test No. 150
#
# Ensure that reflinking a file N times doesn't eat a lot of blocks
# - Create a file and record fs block usage
# - Create some reflink copies
# - Compare fs block usage to before
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f $TESTDIR -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
NR=7
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
sync
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file.$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
_within_tolerance "free blocks after reflink" $FREE_BLOCKS1 $FREE_BLOCKS0 $MARGIN -v
# success, all done
status=0
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 150
Create the original file blocks
Create the reflink copies
free blocks after reflink is in range
+98
View File
@@ -0,0 +1,98 @@
#! /bin/bash
# FS QA Test No. 151
#
# Ensure that deleting all copies of a file reflinked N times releases the blocks
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - Delete some copies of the file
# - Record fs block usage (2)
# - Delete all copies of the file
# - Compare fs block usage to (2), (1), and (0)
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=7
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
sync
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file.$i"
done
_cp_reflink "$TESTDIR/file1" "$TESTDIR/survivor"
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "Delete most of the files"
rm -rf "$TESTDIR"/file*
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "Delete all the files"
rm -rf "$TESTDIR"/*
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3
_within_tolerance "free blocks after reflink" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after deleting some reflink copies" $FREE_BLOCKS2 $FREE_BLOCKS1 $MARGIN -v
_within_tolerance "free blocks after deleting all copies" $FREE_BLOCKS3 $FREE_BLOCKS0 $MARGIN -v
# success, all done
status=0
exit
+8
View File
@@ -0,0 +1,8 @@
QA output created by 151
Create the original file blocks
Create the reflink copies
Delete most of the files
Delete all the files
free blocks after reflink is in range
free blocks after deleting some reflink copies is in range
free blocks after deleting all copies is in range
+103
View File
@@ -0,0 +1,103 @@
#! /bin/bash
# FS QA Test No. 152
#
# Ensure that punching all copies of a file reflinked N times releases the blocks
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - Punch some blocks of the copies
# - Record fs block usage (2)
# - Punch all blocks of the copies
# - Compare fs block usage to (2), (1), and (0)
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
_require_xfs_io_command "fpunch"
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=4
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
sync
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "Punch most of the blocks"
"$XFS_IO_PROG" -f -c "fpunch 0 $SZ" "$TESTDIR/file2"
"$XFS_IO_PROG" -f -c "fpunch 0 $((SZ / 2))" "$TESTDIR/file3"
"$XFS_IO_PROG" -f -c "fpunch $((SZ / 2)) $((SZ / 2))" "$TESTDIR/file4"
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "Punch all the files"
for i in `seq 2 $NR`; do
"$XFS_IO_PROG" -f -c "fpunch 0 $SZ" "$TESTDIR/file$i"
done
"$XFS_IO_PROG" -f -c "fpunch 0 $SZ" "$TESTDIR/file1"
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3
_within_tolerance "free blocks after reflink" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after punching some reflink copies" $FREE_BLOCKS2 $FREE_BLOCKS1 $MARGIN -v
_within_tolerance "free blocks after punching all copies" $FREE_BLOCKS3 $FREE_BLOCKS0 $MARGIN -v
# success, all done
status=0
exit
+8
View File
@@ -0,0 +1,8 @@
QA output created by 152
Create the original file blocks
Create the reflink copies
Punch most of the blocks
Punch all the files
free blocks after reflink is in range
free blocks after punching some reflink copies is in range
free blocks after punching all copies is in range
+102
View File
@@ -0,0 +1,102 @@
#! /bin/bash
# FS QA Test No. 153
#
# Ensure that collapse-range on all copies of a file reflinked N times releases the blocks
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - Collapse-range some blocks of the copies
# - Record fs block usage (2)
# - Truncate all blocks of the copies
# - Compare fs block usage to (2), (1), and (0)
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
_require_xfs_io_command "fcollapse"
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=4
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "Collapse most of the blocks"
"$XFS_IO_PROG" -f -c "fcollapse 0 $(((BLKS - 1) * BLKSZ))" $TESTDIR/file2
"$XFS_IO_PROG" -f -c "fcollapse 0 $((SZ / 2))" $TESTDIR/file3
"$XFS_IO_PROG" -f -c "fcollapse $((SZ / 2)) $(( ((BLKS / 2) - 1) * BLKSZ))" $TESTDIR/file4
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "Collpase nearly all the files"
"$XFS_IO_PROG" -f -c "fcollapse 0 $(( ((BLKS / 2) - 1) * BLKSZ))" $TESTDIR/file3
"$XFS_IO_PROG" -f -c "fcollapse 0 $((SZ / 2))" $TESTDIR/file4
"$XFS_IO_PROG" -f -c "fcollapse 0 $(( (BLKS - 1) * BLKSZ))" $TESTDIR/file1
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3
_within_tolerance "free blocks after reflink" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after fcollapsing some reflink copies" $FREE_BLOCKS2 $FREE_BLOCKS1 $MARGIN -v
_within_tolerance "free blocks after fcollapsing all copies" $FREE_BLOCKS3 $FREE_BLOCKS0 $MARGIN -v
# success, all done
status=0
exit
+8
View File
@@ -0,0 +1,8 @@
QA output created by 153
Create the original file blocks
Create the reflink copies
Collapse most of the blocks
Collpase nearly all the files
free blocks after reflink is in range
free blocks after fcollapsing some reflink copies is in range
free blocks after fcollapsing all copies is in range
+110
View File
@@ -0,0 +1,110 @@
#! /bin/bash
# FS QA Test No. 154
#
# Ensure that CoW on all copies of a file reflinked N times increases block count
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - CoW some blocks of the copies
# - Record fs block usage (2)
# - CoW all the rest of the blocks of the copies
# - Compare fs block usage to (2), (1), and (0)
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=4
SZ=$((BLKS * BLKSZ))
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite some of the blocks"
_pwrite_byte 0x62 0 $SZ "$TESTDIR/file2" >> "$seqres.full"
_pwrite_byte 0x63 0 $((SZ / 2)) "$TESTDIR/file3" >> "$seqres.full"
_pwrite_byte 0x64 $((SZ / 2)) $((SZ / 2)) "$TESTDIR/file4" >> "$seqres.full"
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite all the files"
_pwrite_byte 0x62 0 $SZ "$TESTDIR/file2" >> "$seqres.full"
_pwrite_byte 0x63 0 $SZ "$TESTDIR/file3" >> "$seqres.full"
_pwrite_byte 0x64 0 $SZ "$TESTDIR/file4" >> "$seqres.full"
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite the original file"
_pwrite_byte 0x65 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
FREE_BLOCKS4=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3 $FREE_BLOCKS4
_within_tolerance "free blocks after reflinking" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after partially CoWing some copies" $FREE_BLOCKS2 $((FREE_BLOCKS1 - (2 * BLKS))) $MARGIN -v
_within_tolerance "free blocks after CoWing all copies" $FREE_BLOCKS3 $((FREE_BLOCKS2 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after overwriting original" $FREE_BLOCKS4 $FREE_BLOCKS3 $MARGIN -v
_within_tolerance "free blocks after all tests" $FREE_BLOCKS4 $((FREE_BLOCKS0 - (4 * BLKS))) $MARGIN -v
# success, all done
status=0
exit
+11
View File
@@ -0,0 +1,11 @@
QA output created by 154
Create the original file blocks
Create the reflink copies
Rewrite some of the blocks
Rewrite all the files
Rewrite the original file
free blocks after reflinking is in range
free blocks after partially CoWing some copies is in range
free blocks after CoWing all copies is in range
free blocks after overwriting original is in range
free blocks after all tests is in range
+114
View File
@@ -0,0 +1,114 @@
#! /bin/bash
# FS QA Test No. 155
#
# Ensure that CoW on all copies of a file reflinked N times increases block count
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - CoW some blocks of the copies
# - Record fs block usage (2)
# - CoW all the rest of the blocks of the copies
# - Compare fs block usage to (2), (1), and (0)
#
# The main difference from 834 is that we use zero range, directio, and
# mmap to mix things up a bit.
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
_require_xfs_io_command "fzero"
rm -f "$seqres.full"
TESTDIR=$TEST_DIR/test-$seq
rm -rf $TESTDIR
mkdir $TESTDIR
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=4
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite some of the blocks"
"$XFS_IO_PROG" -f -c "fzero 0 $SZ" "$TESTDIR/file2" >> "$seqres.full"
_pwrite_byte 0x63 0 $((SZ / 2)) "$TESTDIR/file3" -d >> "$seqres.full"
_mwrite_byte 0x64 $((SZ / 2)) $((SZ / 2)) $SZ "$TESTDIR/file4" >> "$seqres.full"
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite all the files"
_pwrite_byte 0x62 0 $SZ "$TESTDIR/file2" -d >> "$seqres.full"
_mwrite_byte 0x63 0 $SZ $SZ "$TESTDIR/file3" >> "$seqres.full"
"$XFS_IO_PROG" -f -c "fzero 0 $SZ" $TESTDIR/file4 >> "$seqres.full"
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite the original file"
_pwrite_byte 0x65 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
FREE_BLOCKS4=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3 $FREE_BLOCKS4
_within_tolerance "free blocks after reflinking" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after partially CoWing some copies" $FREE_BLOCKS2 $((FREE_BLOCKS1 - (2 * BLKS))) $MARGIN -v
_within_tolerance "free blocks after CoWing all copies" $FREE_BLOCKS3 $((FREE_BLOCKS2 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after overwriting original" $FREE_BLOCKS4 $FREE_BLOCKS3 $MARGIN -v
_within_tolerance "free blocks after all tests" $FREE_BLOCKS4 $((FREE_BLOCKS0 - (4 * BLKS))) $MARGIN -v
# success, all done
status=0
exit
+11
View File
@@ -0,0 +1,11 @@
QA output created by 155
Create the original file blocks
Create the reflink copies
Rewrite some of the blocks
Rewrite all the files
Rewrite the original file
free blocks after reflinking is in range
free blocks after partially CoWing some copies is in range
free blocks after CoWing all copies is in range
free blocks after overwriting original is in range
free blocks after all tests is in range
+124
View File
@@ -0,0 +1,124 @@
#! /bin/bash
# FS QA Test No. 156
#
# Ensure that fallocate on reflinked files actually CoWs the shared blocks.
# - Record fs block usage (0)
# - Create a file and some reflink copies
# - Record fs block usage (1)
# - funshare half of one of the copies
# - Record fs block usage (2)
# - funshare all of the copies
# - Record fs block usage (3)
# - rewrite the original file
# - Record fs block usage (4)
# - Compare fs block usage of 0-4 to ensure that block usage behaves as
# we expect.
#
# "funshare" refers to fallocate copy-on-writing the shared blocks
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, 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/attr
. ./common/reflink
if [ $FSTYP = "btrfs" ]; then
_notrun "btrfs doesn't handle unshare on fallocate"
fi
# real QA test starts here
_supported_os Linux
_require_test_reflink
_require_cp_reflink
_require_xfs_io_command "falloc"
rm -f "$seqres.full"
TESTDIR="$TEST_DIR/test-$seq"
rm -rf "$TESTDIR"
mkdir "$TESTDIR"
echo "Create the original file blocks"
BLKSZ="$(stat -f "$TESTDIR" -c '%S')"
BLKS=2000
MARGIN=100
SZ=$((BLKSZ * BLKS))
FREE_BLOCKS0=$(stat -f "$TESTDIR" -c '%f')
NR=4
_pwrite_byte 0x61 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
echo "Create the reflink copies"
for i in `seq 2 $NR`; do
_cp_reflink "$TESTDIR/file1" "$TESTDIR/file$i"
done
_test_remount
FREE_BLOCKS1=$(stat -f "$TESTDIR" -c '%f')
echo "funshare part of a file"
"$XFS_IO_PROG" -f -c "falloc 0 $((SZ / 2))" "$TESTDIR/file2"
_test_remount
echo "funshare some of the copies"
"$XFS_IO_PROG" -f -c "falloc 0 $SZ" "$TESTDIR/file2"
"$XFS_IO_PROG" -f -c "falloc 0 $SZ" "$TESTDIR/file3"
_test_remount
FREE_BLOCKS2=$(stat -f "$TESTDIR" -c '%f')
echo "funshare the rest of the files"
"$XFS_IO_PROG" -f -c "falloc 0 $SZ" "$TESTDIR/file4"
"$XFS_IO_PROG" -f -c "falloc 0 $SZ" "$TESTDIR/file1"
_test_remount
FREE_BLOCKS3=$(stat -f "$TESTDIR" -c '%f')
echo "Rewrite the original file"
_pwrite_byte 0x65 0 $SZ "$TESTDIR/file1" >> "$seqres.full"
_test_remount
FREE_BLOCKS4=$(stat -f "$TESTDIR" -c '%f')
#echo $FREE_BLOCKS0 $FREE_BLOCKS1 $FREE_BLOCKS2 $FREE_BLOCKS3 $FREE_BLOCKS4
_within_tolerance "free blocks after reflinking" $FREE_BLOCKS1 $((FREE_BLOCKS0 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after nocow'ing some copies" $FREE_BLOCKS2 $((FREE_BLOCKS1 - (2 * BLKS))) $MARGIN -v
_within_tolerance "free blocks after nocow'ing all copies" $FREE_BLOCKS3 $((FREE_BLOCKS2 - BLKS)) $MARGIN -v
_within_tolerance "free blocks after overwriting original" $FREE_BLOCKS4 $FREE_BLOCKS3 $MARGIN -v
_within_tolerance "free blocks after all tests" $FREE_BLOCKS4 $((FREE_BLOCKS0 - (4 * BLKS))) $MARGIN -v
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 156
Create the original file blocks
Create the reflink copies
funshare part of a file
funshare some of the copies
funshare the rest of the files
Rewrite the original file
free blocks after reflinking is in range
free blocks after nocow'ing some copies is in range
free blocks after nocow'ing all copies is in range
free blocks after overwriting original is in range
free blocks after all tests is in range
+7
View File
@@ -152,6 +152,13 @@
147 auto quick clone
148 auto quick clone
149 auto quick clone
150 auto quick clone
151 auto quick clone
152 auto quick clone
153 auto quick clone
154 auto quick clone
155 auto quick clone
156 auto quick clone
169 rw metadata auto quick
184 metadata auto quick
192 atime auto