Add an fsx test, allow fsx to preallocate file space on -x
authorfsgqa <fsgqa>
Fri, 1 Aug 2003 05:48:02 +0000 (05:48 +0000)
committerfsgqa <fsgqa>
Fri, 1 Aug 2003 05:48:02 +0000 (05:48 +0000)
075 [new file with mode: 0755]
075.out [new file with mode: 0644]
group
ltp/fsx.c

diff --git a/075 b/075
new file mode 100755 (executable)
index 0000000..67924a4
--- /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 (file)
index 0000000..dea8cbb
--- /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 a4e6655946fbc4a49015d8cc190b98bf5b3de6d4..881856cad93c59a08a14e647986ac414520424b3 100644 (file)
--- a/group
+++ b/group
@@ -132,3 +132,4 @@ ioctl               nathans@sgi.com
 072 rw auto
 073 copy auto
 074 rw auto
+075 rw auto
index 25a0e96ab61903bd625d54e7ae6d041a544b240c..db5fcffbc2bd8431261e5ad43f15a9fd49c3aa00 100644 (file)
--- 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 <sys/types.h>
@@ -49,6 +50,8 @@
 #include <stdarg.h>
 #include <errno.h>
 
+#include <xfs/libxfs.h>
+
 #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);