--- /dev/null
+#! /bin/sh
+# XFS QA Test No. 075
+#
+# fsx
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 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.
+#
+# Further, this software is distributed without any warranty that it is
+# free of the rightful claim of any third person regarding infringement
+# or the like. Any license provided herein, whether implied or
+# otherwise, applies only to this software file. Patent licenses, if
+# any, provided herein do not apply to combinations of this program with
+# other software, or any other product whatsoever.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston MA 02111-1307, USA.
+#
+# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+# Mountain View, CA 94043, or:
+#
+# http://www.sgi.com
+#
+# For further information regarding this notice, see:
+#
+# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+#-----------------------------------------------------------------------
+#
+# creator
+owner=nathans@sgi.com
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=0 # success is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ rm -rf $TEST_DIR/fsx.* $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+_do_test()
+{
+ _n="$1"
+ _param="$2"
+
+ out=$TEST_DIR/fsx
+ rm -rf $out
+ if ! mkdir $out
+ then
+ echo " failed to mkdir $out"
+ status=1
+ exit
+ fi
+
+ echo ""
+ echo "-----------------------------------------------"
+ echo "fsx.$_n : $_param"
+ echo "-----------------------------------------------"
+
+ # This cd and use of -P gets full debug on $here (not TEST_DEV)
+ cd $out
+ if ! $here/ltp/fsx $_param -P $here $seq.$_n >/dev/null
+ then
+ echo " fsx ($_param) returned $? - see $seq.$_n.full"
+ mv $seq.$_n.fsxlog $here/$seq.$_n.full
+ status=1
+ exit
+ fi
+
+ cd $here
+ _check_test_fs
+}
+
+
+# real QA test starts here
+
+rm -f $here/$seq.full
+echo "brevity is wit..."
+
+_check_test_fs
+
+# Options:
+# -d: debug output for all operations
+# -l flen: the upper bound on file size (default 262144)
+# -o oplen: the upper bound on operation size
+# -N numops: total # operations to do (default infinity)
+# -P: save .fsxlog and .fsxgood files in dirpath (default ./)
+# -S seed: for random # generator (default 1) 0 gets timestamp
+# -x: pre-allocate file space, exercising unwritten extents
+
+size10=`expr 10 \* 1024 \* 1024` # 10 megabytes
+
+_do_test 0 "-d -N 1000 -S 0"
+_do_test 1 "-d -N 1000 -S 0 -x"
+_do_test 3 "-d -N 25000 -l $size10 -S 0"
+_do_test 4 "-d -N 25000 -l $size10 -S 0 -x"
+
*
* Small changes to work under Linux -- davej.
*
+ * XFS space preallocation changes -- nathans.
*/
#include <sys/types.h>
#include <stdarg.h>
#include <errno.h>
+#include <xfs/libxfs.h>
+
#ifndef MAP_FILE
# define MAP_FILE 0
#endif
unsigned long progressinterval = 0; /* -p flag */
int readbdy = 1; /* -r flag */
int style = 0; /* -s flag */
+int prealloc = 0; /* -u flag */
int truncbdy = 1; /* -t flag */
int writebdy = 1; /* -w flag */
long monitorstart = -1; /* -m flag */
int mapped_reads = 1; /* -R flag disables it */
int fsxgoodfd = 0;
FILE * fsxlogf = NULL;
-int badoff = -1;
-int closeopen = 0;
+int badoff = -1;
+int closeopen = 0;
void
if (size_by_seek == (off_t)-1)
prterr("save_buffer: lseek eof");
else if (bufferlength > size_by_seek) {
- fprintf(stderr, "save_buffer: .fsxgood file too short... will save 0x%qx bytes instead of 0x%qx\n", (unsigned long long)size_by_seek,
+ fprintf(stderr, "save_buffer: .fsxgood file too short... will save 0x%qx bytes instead of 0x%qx\n", (unsigned long long)size_by_seek,
(unsigned long long)bufferlength);
bufferlength = size_by_seek;
}
if (byteswritten == -1)
prterr("save_buffer write");
else
- fprintf(stderr, "save_buffer: short write, 0x%x bytes instead of 0x%qx\n",
+ fprintf(stderr, "save_buffer: short write, 0x%x bytes instead of 0x%qx\n",
(unsigned)byteswritten,
(unsigned long long)bufferlength);
}
bzero(good_buf + file_size, offset - file_size);
file_size = offset + size;
if (lite) {
- fprintf(stderr, "Lite file size bug in fsx!");
+ fprintf(stderr, "Lite file size bug in fsx!\n");
report_failure(149);
}
}
bzero(good_buf + file_size, offset - file_size);
file_size = offset + size;
if (lite) {
- fprintf(stderr, "Lite file size bug in fsx!");
+ fprintf(stderr, "Lite file size bug in fsx!\n");
report_failure(200);
}
}
-s style: 1 gives smaller truncates (default 0)\n\
-t truncbdy: 4096 would make truncates page aligned (default 1)\n\
-w writebdy: 4096 would make writes page aligned (default 1)\n\
+ -x: preallocate file space before starting, XFS only (default 0)\n\
-D startingop: debug output starting at specified operation\n\
-L: fsxLite - no file creations & no file size changes\n\
-N numops: total # operations to do (default infinity)\n\
setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */
- while ((ch = getopt(argc, argv, "b:c:dl:m:no:p:qr:s:t:w:D:LN:OP:RS:W"))
+ while ((ch = getopt(argc, argv, "b:c:dl:m:no:p:qr:s:t:w:xD:LN:OP:RS:W"))
!= EOF)
switch (ch) {
case 'b':
if (writebdy <= 0)
usage();
break;
+ case 'x':
+ prealloc = 1;
+ break;
case 'D':
debugstart = getnum(optarg, &endp);
if (debugstart < 1)
prterr(fname);
exit(91);
}
+ if (prealloc) {
+ xfs_flock64_t resv = { 0 };
+
+ if (!platform_test_xfs_fd(fd)) {
+ prterr(fname);
+ fprintf(stderr, "main: cannot prealloc, non XFS\n");
+ exit(96);
+ }
+
+ resv.l_len = maxfilelen;
+ if ((xfsctl(fname, fd, XFS_IOC_RESVSP, &resv)) < 0) {
+ prterr(fname);
+ exit(97);
+ }
+ }
strncat(goodfile, fname, 256);
strcat (goodfile, ".fsxgood");
fsxgoodfd = open(goodfile, O_RDWR|O_CREAT|O_TRUNC, 0666);
file_size = maxfilelen = lseek(fd, (off_t)0, L_XTND);
if (file_size == (off_t)-1) {
prterr(fname);
- fprintf(stderr, "main: lseek eof");
+ fprintf(stderr, "main: lseek eof\n");
exit(94);
}
ret = lseek(fd, (off_t)0, SEEK_SET);
if (ret == (off_t)-1) {
prterr(fname);
- fprintf(stderr, "main: lseek 0");
+ fprintf(stderr, "main: lseek 0\n");
exit(95);
}
}
if (written != maxfilelen) {
if (written == -1) {
prterr(fname);
- fprintf(stderr, "main: error on write");
+ fprintf(stderr, "main: error on write\n");
} else
fprintf(stderr, "main: short write, 0x%x bytes instead of 0x%lx\n",
(unsigned)written, maxfilelen);