From: fsgqa Date: Fri, 1 Aug 2003 05:48:02 +0000 (+0000) Subject: Add an fsx test, allow fsx to preallocate file space on -x X-Git-Tag: v1.1.0~952 X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=commitdiff_plain;h=347f4721b7b7033bda4a9654790bd0527f558d8c Add an fsx test, allow fsx to preallocate file space on -x --- diff --git a/075 b/075 new file mode 100755 index 00000000..67924a44 --- /dev/null +++ b/075 @@ -0,0 +1,114 @@ +#! /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" + diff --git a/075.out b/075.out new file mode 100644 index 00000000..dea8cbb6 --- /dev/null +++ b/075.out @@ -0,0 +1,18 @@ +QA output created by 075 +brevity is wit... + +----------------------------------------------- +fsx.0 : -d -N 1000 -S 0 +----------------------------------------------- + +----------------------------------------------- +fsx.1 : -d -N 1000 -S 0 -x +----------------------------------------------- + +----------------------------------------------- +fsx.2 : -d -N 25000 -l 10485760 -S 0 +----------------------------------------------- + +----------------------------------------------- +fsx.3 : -d -N 25000 -l 10485760 -S 0 -x +----------------------------------------------- diff --git a/group b/group index a4e66559..881856ca 100644 --- a/group +++ b/group @@ -132,3 +132,4 @@ ioctl nathans@sgi.com 072 rw auto 073 copy auto 074 rw auto +075 rw auto diff --git a/ltp/fsx.c b/ltp/fsx.c index 25a0e96a..db5fcffb 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -29,6 +29,7 @@ * * Small changes to work under Linux -- davej. * + * XFS space preallocation changes -- nathans. */ #include @@ -49,6 +50,8 @@ #include #include +#include + #ifndef MAP_FILE # define MAP_FILE 0 #endif @@ -109,6 +112,7 @@ int quiet = 0; /* -q flag */ 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 */ @@ -121,8 +125,8 @@ int mapped_writes = 1; /* -W flag disables */ 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 @@ -266,7 +270,7 @@ save_buffer(char *buffer, off_t bufferlength, int fd) 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; } @@ -281,7 +285,7 @@ save_buffer(char *buffer, off_t bufferlength, int fd) 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); } @@ -525,7 +529,7 @@ dowrite(unsigned offset, unsigned size) 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); } } @@ -581,7 +585,7 @@ domapwrite(unsigned offset, unsigned size) 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); } } @@ -804,6 +808,7 @@ usage(void) -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\ @@ -864,7 +869,7 @@ main(int argc, char **argv) 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': @@ -941,6 +946,9 @@ main(int argc, char **argv) if (writebdy <= 0) usage(); break; + case 'x': + prealloc = 1; + break; case 'D': debugstart = getnum(optarg, &endp); if (debugstart < 1) @@ -1010,6 +1018,21 @@ main(int argc, char **argv) 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); @@ -1029,13 +1052,13 @@ main(int argc, char **argv) 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); } } @@ -1053,7 +1076,7 @@ main(int argc, char **argv) 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);