On Thu, Sep 6, 2012 at 6:20 AM, Eric Sandeen <sandeen@xxxxxxxxxx> wrote: > extN can report f_blocks in statfs in 2 different ways, based > on whether or not metadata overhead is counted. This has broken > in the past, so here's a test for it. > > It looks at dumpe2fs output to get total blocks and free blocks > right after mkfs. The difference should be, by definition, the > exact amount of metadata overhead. > > It then compares this to what's reported via stat -f for f_blocks. > For "minix" df, it should be exactly equal to the total blocks, > and for "bsd" df, it should be total blocks less overhead. > > It tests that the latter is accurate to within a 1% tolerance. > > Today the journal doesn't count as overhead in the statfs call; > this should be fixed kernelside but for many filesystems it'll be > within the threshold anyway. > > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > > diff --git a/285 b/285 > new file mode 100755 > index 0000000..cda8531 > --- /dev/null > +++ b/285 > @@ -0,0 +1,97 @@ > +#! /bin/bash > +# FS QA Test No. 286 The Test No. should be 285 here? > +# > +# Test overhead & df output for extN filesystems > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2012 Red Hat, Inc. 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 > +#----------------------------------------------------------------------- > +# > +# creator > +owner=sandeen@xxxxxxxxxx > + > +seq=`basename $0` > +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 > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs ext2 ext3 ext4 > +_supported_os Linux > +_require_scratch > + > +rm -f $seq.full > + > +_scratch_mkfs >> $seq.full 2>&1 > + > +TOTAL_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ > + | awk '/Block count:/{print $3}'` > + > +FREE_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ > + | awk '/Free blocks:/{print $3}'` I guess TOTAL_BLOCKS and FREE_BLOCKS will be wrong when testing ext4 on RHEL5 which has a separate dumpe4fs for ext4. Thanks, Eryu Guan > + > +# nb: kernels today don't count journal blocks as overhead, but should. > +# For most fileystems this will still be within tolerance. > +OVERHEAD=$(($TOTAL_BLOCKS-$FREE_BLOCKS)) > + > +# bsddf|minixdf > +# Set the behaviour for the statfs system call. The minixdf > +# behaviour is to return in the f_blocks field the total number of > +# blocks of the filesystem, while the bsddf behaviour (which is > +# the default) is to subtract the overhead blocks used by the ext2 > +# filesystem and not available for file storage. > + > +# stat -f output looks like; we get f_blocks from that, which > +# varies depending on the df mount options used below: > + > +# Filesystem 4K-blocks Used Available Use% Mounted on > +# /dev/sda8 2405312 2208933 196379 92% / > + > +_scratch_mount "-o minixdf" > +MINIX_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` > +umount $SCRATCH_MNT > + > +_scratch_mount "-o bsddf" > +BSD_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` > +umount $SCRATCH_MNT > + > +echo "Overhead is $OVERHEAD out of $TOTAL_BLOCKS" >> $seq.full > +echo "BSD blocks $BSD_F_BLOCKS" >> $seq.full > +echo "MINIX blocks $MINIX_F_BLOCKS" >> $seq.full > + > +# minix should be exactly equal (hence 0) > +_within_tolerance "minix f_blocks" $MINIX_F_BLOCKS $TOTAL_BLOCKS 0 -v > +# bsd should be within ... we'll say 1% > +_within_tolerance "bsd f_blocks" $BSD_F_BLOCKS $(($TOTAL_BLOCKS-$OVERHEAD)) 1% -v > + > +# success, all done > +status=0 > +exit > diff --git a/285.out b/285.out > new file mode 100644 > index 0000000..2075e21 > --- /dev/null > +++ b/285.out > @@ -0,0 +1,3 @@ > +QA output created by 285 > +minix f_blocks is in range > +bsd f_blocks is in range > diff --git a/group b/group > index 104ed35..0b33178 100644 > --- a/group > +++ b/group > @@ -403,3 +403,4 @@ deprecated > 282 dump ioctl auto quick > 283 dump ioctl auto quick > 284 auto > +285 auto > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html