mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
Add an fsx test, allow fsx to preallocate file space on -x
This commit is contained in:
@@ -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"
|
||||||
|
|
||||||
@@ -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
|
||||||
|
-----------------------------------------------
|
||||||
@@ -132,3 +132,4 @@ ioctl nathans@sgi.com
|
|||||||
072 rw auto
|
072 rw auto
|
||||||
073 copy auto
|
073 copy auto
|
||||||
074 rw auto
|
074 rw auto
|
||||||
|
075 rw auto
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
*
|
*
|
||||||
* Small changes to work under Linux -- davej.
|
* Small changes to work under Linux -- davej.
|
||||||
*
|
*
|
||||||
|
* XFS space preallocation changes -- nathans.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -49,6 +50,8 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <xfs/libxfs.h>
|
||||||
|
|
||||||
#ifndef MAP_FILE
|
#ifndef MAP_FILE
|
||||||
# define MAP_FILE 0
|
# define MAP_FILE 0
|
||||||
#endif
|
#endif
|
||||||
@@ -109,6 +112,7 @@ int quiet = 0; /* -q flag */
|
|||||||
unsigned long progressinterval = 0; /* -p flag */
|
unsigned long progressinterval = 0; /* -p flag */
|
||||||
int readbdy = 1; /* -r flag */
|
int readbdy = 1; /* -r flag */
|
||||||
int style = 0; /* -s flag */
|
int style = 0; /* -s flag */
|
||||||
|
int prealloc = 0; /* -u flag */
|
||||||
int truncbdy = 1; /* -t flag */
|
int truncbdy = 1; /* -t flag */
|
||||||
int writebdy = 1; /* -w flag */
|
int writebdy = 1; /* -w flag */
|
||||||
long monitorstart = -1; /* -m 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 mapped_reads = 1; /* -R flag disables it */
|
||||||
int fsxgoodfd = 0;
|
int fsxgoodfd = 0;
|
||||||
FILE * fsxlogf = NULL;
|
FILE * fsxlogf = NULL;
|
||||||
int badoff = -1;
|
int badoff = -1;
|
||||||
int closeopen = 0;
|
int closeopen = 0;
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -266,7 +270,7 @@ save_buffer(char *buffer, off_t bufferlength, int fd)
|
|||||||
if (size_by_seek == (off_t)-1)
|
if (size_by_seek == (off_t)-1)
|
||||||
prterr("save_buffer: lseek eof");
|
prterr("save_buffer: lseek eof");
|
||||||
else if (bufferlength > size_by_seek) {
|
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);
|
(unsigned long long)bufferlength);
|
||||||
bufferlength = size_by_seek;
|
bufferlength = size_by_seek;
|
||||||
}
|
}
|
||||||
@@ -281,7 +285,7 @@ save_buffer(char *buffer, off_t bufferlength, int fd)
|
|||||||
if (byteswritten == -1)
|
if (byteswritten == -1)
|
||||||
prterr("save_buffer write");
|
prterr("save_buffer write");
|
||||||
else
|
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)byteswritten,
|
||||||
(unsigned long long)bufferlength);
|
(unsigned long long)bufferlength);
|
||||||
}
|
}
|
||||||
@@ -525,7 +529,7 @@ dowrite(unsigned offset, unsigned size)
|
|||||||
bzero(good_buf + file_size, offset - file_size);
|
bzero(good_buf + file_size, offset - file_size);
|
||||||
file_size = offset + size;
|
file_size = offset + size;
|
||||||
if (lite) {
|
if (lite) {
|
||||||
fprintf(stderr, "Lite file size bug in fsx!");
|
fprintf(stderr, "Lite file size bug in fsx!\n");
|
||||||
report_failure(149);
|
report_failure(149);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -581,7 +585,7 @@ domapwrite(unsigned offset, unsigned size)
|
|||||||
bzero(good_buf + file_size, offset - file_size);
|
bzero(good_buf + file_size, offset - file_size);
|
||||||
file_size = offset + size;
|
file_size = offset + size;
|
||||||
if (lite) {
|
if (lite) {
|
||||||
fprintf(stderr, "Lite file size bug in fsx!");
|
fprintf(stderr, "Lite file size bug in fsx!\n");
|
||||||
report_failure(200);
|
report_failure(200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -804,6 +808,7 @@ usage(void)
|
|||||||
-s style: 1 gives smaller truncates (default 0)\n\
|
-s style: 1 gives smaller truncates (default 0)\n\
|
||||||
-t truncbdy: 4096 would make truncates page aligned (default 1)\n\
|
-t truncbdy: 4096 would make truncates page aligned (default 1)\n\
|
||||||
-w writebdy: 4096 would make writes 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\
|
-D startingop: debug output starting at specified operation\n\
|
||||||
-L: fsxLite - no file creations & no file size changes\n\
|
-L: fsxLite - no file creations & no file size changes\n\
|
||||||
-N numops: total # operations to do (default infinity)\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 */
|
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)
|
!= EOF)
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'b':
|
case 'b':
|
||||||
@@ -941,6 +946,9 @@ main(int argc, char **argv)
|
|||||||
if (writebdy <= 0)
|
if (writebdy <= 0)
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
prealloc = 1;
|
||||||
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
debugstart = getnum(optarg, &endp);
|
debugstart = getnum(optarg, &endp);
|
||||||
if (debugstart < 1)
|
if (debugstart < 1)
|
||||||
@@ -1010,6 +1018,21 @@ main(int argc, char **argv)
|
|||||||
prterr(fname);
|
prterr(fname);
|
||||||
exit(91);
|
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);
|
strncat(goodfile, fname, 256);
|
||||||
strcat (goodfile, ".fsxgood");
|
strcat (goodfile, ".fsxgood");
|
||||||
fsxgoodfd = open(goodfile, O_RDWR|O_CREAT|O_TRUNC, 0666);
|
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);
|
file_size = maxfilelen = lseek(fd, (off_t)0, L_XTND);
|
||||||
if (file_size == (off_t)-1) {
|
if (file_size == (off_t)-1) {
|
||||||
prterr(fname);
|
prterr(fname);
|
||||||
fprintf(stderr, "main: lseek eof");
|
fprintf(stderr, "main: lseek eof\n");
|
||||||
exit(94);
|
exit(94);
|
||||||
}
|
}
|
||||||
ret = lseek(fd, (off_t)0, SEEK_SET);
|
ret = lseek(fd, (off_t)0, SEEK_SET);
|
||||||
if (ret == (off_t)-1) {
|
if (ret == (off_t)-1) {
|
||||||
prterr(fname);
|
prterr(fname);
|
||||||
fprintf(stderr, "main: lseek 0");
|
fprintf(stderr, "main: lseek 0\n");
|
||||||
exit(95);
|
exit(95);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1053,7 +1076,7 @@ main(int argc, char **argv)
|
|||||||
if (written != maxfilelen) {
|
if (written != maxfilelen) {
|
||||||
if (written == -1) {
|
if (written == -1) {
|
||||||
prterr(fname);
|
prterr(fname);
|
||||||
fprintf(stderr, "main: error on write");
|
fprintf(stderr, "main: error on write\n");
|
||||||
} else
|
} else
|
||||||
fprintf(stderr, "main: short write, 0x%x bytes instead of 0x%lx\n",
|
fprintf(stderr, "main: short write, 0x%x bytes instead of 0x%lx\n",
|
||||||
(unsigned)written, maxfilelen);
|
(unsigned)written, maxfilelen);
|
||||||
|
|||||||
Reference in New Issue
Block a user