On Fri, Sep 28, 2018 at 3:51 PM Anand Jain <anand.jain@xxxxxxxxxx> wrote: > > Try to punch hole with unaligned size and offset when the FS > returns ENOSPC The FS returns ENOSPC is confusing. It's more clear to say when the filesystem doesn't have more space available for data allocation. > > Signed-off-by: Anand Jain <anand.jain@xxxxxxxxxx> > --- > v2->v3: > add _require_xfs_io_command "fpunch" > add more logs to $seqfull.full > mount options and > group profile info > add sync after dd upto ENOSPC > drop fallocate -p and use xfs_io punch to create holes > v1->v2: Use at least 256MB to test. > This test case fails on btrfs as of now. > > tests/btrfs/172 | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/172.out | 2 ++ > tests/btrfs/group | 1 + > 3 files changed, 77 insertions(+) > create mode 100755 tests/btrfs/172 > create mode 100644 tests/btrfs/172.out > > diff --git a/tests/btrfs/172 b/tests/btrfs/172 > new file mode 100755 > index 000000000000..59413a5de12f > --- /dev/null > +++ b/tests/btrfs/172 > @@ -0,0 +1,74 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2018 Oracle. All Rights Reserved. > +# > +# FS QA Test 172 > +# > +# Test if the unaligned (by size and offset) punch hole is successful when FS > +# is at ENOSPC. > +# > +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 -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# remove previous $seqres.full before test > +rm -f $seqres.full > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs btrfs > +_supported_os Linux > +_require_scratch > +_require_xfs_io_command "fpunch" > + > +_scratch_mkfs_sized $((256 * 1024 *1024)) >> $seqres.full > + > +# max_inline helps to create regular extent max_inline ensures data is not inlined within metadata extents > +_scratch_mount "-o max_inline=0,nodatacow" > + > +cat /proc/self/mounts | grep $SCRATCH_DEV >> $seqres.full > +$BTRFS_UTIL_PROG filesystem df $SCRATCH_MNT >> $seqres.full > + > +extent_size=$(_scratch_btrfs_sectorsize) > +unalign_by=512 > +echo extent_size=$extent_size unalign_by=$unalign_by >> $seqres.full > + > +$XFS_IO_PROG -f -d -c "pwrite -S 0xab 0 $((extent_size * 10))" \ > + $SCRATCH_MNT/testfile >> $seqres.full > + > +echo "Fill fs upto ENOSPC" >> $seqres.full Fill all space available for data and all unallocated space. > +dd status=none if=/dev/zero of=$SCRATCH_MNT/filler bs=512 >> $seqres.full 2>&1 Why do you use dd here and not xfs_io? > +sync Why is the sync needed? > + > +hole_offset=0 > +hole_len=$unalign_by > +$XFS_IO_PROG -f -d -c "fpunch $hole_offset $hole_len" $SCRATCH_MNT/testfile No need to pass -f anymore. No need for -d either. > + > +hole_offset=$(($extent_size + $unalign_by)) > +hole_len=$(($extent_size - $unalign_by)) > +$XFS_IO_PROG -f -d -c "fpunch $hole_offset $hole_len" $SCRATCH_MNT/testfile No need to pass -f anymore. No need for -d either. > + > +hole_offset=$(($extent_size * 2 + $unalign_by)) > +hole_len=$(($extent_size * 5)) > +$XFS_IO_PROG -f -d -c "fpunch $hole_offset $hole_len" $SCRATCH_MNT/testfile No need to pass -f anymore. No need for -d either. > + > +# success, all done > +echo "Silence is golden" > +status=0 > +exit > diff --git a/tests/btrfs/172.out b/tests/btrfs/172.out > new file mode 100644 > index 000000000000..ce2de3f0d107 > --- /dev/null > +++ b/tests/btrfs/172.out > @@ -0,0 +1,2 @@ > +QA output created by 172 > +Silence is golden > diff --git a/tests/btrfs/group b/tests/btrfs/group > index feffc45b6564..7e1a638ab7e1 100644 > --- a/tests/btrfs/group > +++ b/tests/btrfs/group > @@ -174,3 +174,4 @@ > 169 auto quick send > 170 auto quick snapshot > 171 auto quick qgroup > +172 auto quick > -- > 1.8.3.1 > -- Filipe David Manana, “Whether you think you can, or you think you can't — you're right.”