xfstests: test extent size hints

This is an adapted version of the reproduced in OSS BZ #874, which
shows file corruption when using the extent size hint.

Signed-off-by: Geoffrey Wehrman <gwehrman@sgi.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Christoph Hellwig
2010-05-10 19:39:04 +02:00
parent 6728bbddc8
commit f73e0fb3f2
5 changed files with 135 additions and 1 deletions
+88
View File
@@ -0,0 +1,88 @@
#! /bin/bash
# FS QA Test No. 221
#
# Check for file corruption when using the extent size hint on
# the normal data subvolume.
#
# http://oss.sgi.com/bugzilla/show_bug.cgi?id=874
#
# Based on a bug report and testcase from Geoffrey Wehrman <gwehrman@sgi.com>.
#
#-----------------------------------------------------------------------
# Copyright (c) 2010 Christoph Hellwig. All Rights Reserved.
# Copyright (c) 2010 Silicon Graphics, 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=hch@lst.de
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
_cleanup()
{
rm -rf ${TDIR}
}
trap "_cleanup ; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
# real QA test starts here
_supported_fs generic
_supported_os Linux
TDIR="${TEST_DIR}/t_holes"
NFILES="10"
EXTSIZE="256k"
# Create the test directory
mkdir ${TDIR}
# Set the test directory extsize
xfs_io -c "extsize ${EXTSIZE}" ${TDIR}
# Create a set of holey files
echo "generating ${NFILES} files"
for i in $(seq 0 ${NFILES}); do
$here/src/t_holes ${TDIR}/${i}
done
# Compare the files
echo "comparing files"
errcnt=0
j=0
for i in $(seq 0 ${NFILES}); do
let j=$i+1
while [ ${j} -lt ${NFILES} ] ; do
if ! cmp ${TDIR}/${i} ${TDIR}/${j} ; then
let errcnt=$errcnt+1
fi
let j=$j+1
done
done
echo "got ${errcnt} errors"
status=$errcnt
exit $status
+4
View File
@@ -0,0 +1,4 @@
QA output created by 229
generating 10 files
comparing files
got 0 errors
+1
View File
@@ -342,3 +342,4 @@ deprecated
226 auto enospc
227 auto fsr
228 rw auto prealloc quick
229 auto rw
+1 -1
View File
@@ -10,7 +10,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \
mmapcat append_reader append_writer dirperf metaperf \
devzero feature alloc fault fstest t_access_root \
godown resvtest writemod makeextents itrash rename \
multi_open_unlink dmiperf unwritten_sync genhashnames
multi_open_unlink dmiperf unwritten_sync genhashnames t_holes
LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \
preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \
+41
View File
@@ -0,0 +1,41 @@
/*
* Copyright (c) 2010 Silicon Graphics, 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
*/
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int buf[1024];
int fd, i, j;
fd = open(argv[1], O_RDWR|O_CREAT, 0666);
for (i = 1; i < 9100; i++) {
for (j = 0; j < 1024; j++)
buf[j] = i | i << 5;
if (write(fd,buf,253*4*sizeof(int))!= 253*4*sizeof(int))
printf("Write did not return correct amount\n");
if ((i % 9) == 0 && i < 9001)
lseek(fd, 4096 * 110,SEEK_CUR);
}
close(fd);
return 0;
}