Changeset View
Changeset View
Standalone View
Standalone View
head/tools/regression/fsx/fsx.c
Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | |||||
char state[256]; | char state[256]; | ||||
unsigned long testcalls = 0; /* calls to function "test" */ | unsigned long testcalls = 0; /* calls to function "test" */ | ||||
unsigned long simulatedopcount = 0; /* -b flag */ | unsigned long simulatedopcount = 0; /* -b flag */ | ||||
int closeprob = 0; /* -c flag */ | int closeprob = 0; /* -c flag */ | ||||
int invlprob = 0; /* -i flag */ | int invlprob = 0; /* -i flag */ | ||||
int debug = 0; /* -d flag */ | int debug = 0; /* -d flag */ | ||||
unsigned long debugstart = 0; /* -D flag */ | unsigned long debugstart = 0; /* -D flag */ | ||||
unsigned long maxfilelen = 256 * 1024; /* -l flag */ | off_t maxfilelen = 256 * 1024; /* -l flag */ | ||||
int sizechecks = 1; /* -n flag disables them */ | int sizechecks = 1; /* -n flag disables them */ | ||||
int maxoplen = 64 * 1024; /* -o flag */ | int maxoplen = 64 * 1024; /* -o flag */ | ||||
int quiet = 0; /* -q flag */ | 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 truncbdy = 1; /* -t flag */ | int truncbdy = 1; /* -t flag */ | ||||
int writebdy = 1; /* -w flag */ | int writebdy = 1; /* -w flag */ | ||||
Show All 9 Lines | |||||
int fsxgoodfd = 0; | int fsxgoodfd = 0; | ||||
FILE * fsxlogf = NULL; | FILE * fsxlogf = NULL; | ||||
int badoff = -1; | int badoff = -1; | ||||
int closeopen = 0; | int closeopen = 0; | ||||
int invl = 0; | int invl = 0; | ||||
void | void | ||||
vwarnc(code, fmt, ap) | prt(const char *fmt, ...) | ||||
int code; | |||||
const char *fmt; | |||||
va_list ap; | |||||
{ | { | ||||
fprintf(stderr, "fsx: "); | |||||
if (fmt != NULL) { | |||||
vfprintf(stderr, fmt, ap); | |||||
fprintf(stderr, ": "); | |||||
} | |||||
fprintf(stderr, "%s\n", strerror(code)); | |||||
} | |||||
void | |||||
warn(const char * fmt, ...) | |||||
{ | |||||
va_list ap; | |||||
va_start(ap, fmt); | |||||
vwarnc(errno, fmt, ap); | |||||
va_end(ap); | |||||
} | |||||
void | |||||
prt(char *fmt, ...) | |||||
{ | |||||
va_list args; | va_list args; | ||||
va_start(args, fmt); | va_start(args, fmt); | ||||
vfprintf(stdout, fmt, args); | vfprintf(stdout, fmt, args); | ||||
va_end(args); | va_end(args); | ||||
if (fsxlogf) { | if (fsxlogf) { | ||||
va_start(args, fmt); | va_start(args, fmt); | ||||
vfprintf(fsxlogf, fmt, args); | vfprintf(fsxlogf, fmt, args); | ||||
va_end(args); | va_end(args); | ||||
} | } | ||||
} | } | ||||
void | void | ||||
prterr(char *prefix) | prterr(const char *prefix) | ||||
{ | { | ||||
prt("%s%s%s\n", prefix, prefix ? ": " : "", strerror(errno)); | prt("%s%s%s\n", prefix, prefix ? ": " : "", strerror(errno)); | ||||
} | } | ||||
void | void | ||||
do_log4(int operation, int arg0, int arg1, int arg2) | do_log4(int operation, int arg0, int arg1, int arg2) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | for ( ; count > 0; count--) { | ||||
i++; | i++; | ||||
if (i == LOGSIZE) | if (i == LOGSIZE) | ||||
i = 0; | i = 0; | ||||
} | } | ||||
} | } | ||||
void | void | ||||
save_buffer(char *buffer, off_t bufferlength, int fd) | save_buffer(char *buffer, off_t bufferlength, int savefd) | ||||
{ | { | ||||
off_t ret; | off_t ret; | ||||
ssize_t byteswritten; | ssize_t byteswritten; | ||||
if (fd <= 0 || bufferlength == 0) | if (savefd <= 0 || bufferlength == 0) | ||||
return; | return; | ||||
if (bufferlength > SSIZE_MAX) { | if (bufferlength > SSIZE_MAX) { | ||||
prt("fsx flaw: overflow in save_buffer\n"); | prt("fsx flaw: overflow in save_buffer\n"); | ||||
exit(67); | exit(67); | ||||
} | } | ||||
if (lite) { | if (lite) { | ||||
off_t size_by_seek = lseek(fd, (off_t)0, SEEK_END); | off_t size_by_seek = lseek(savefd, (off_t)0, SEEK_END); | ||||
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) { | ||||
warn("save_buffer: .fsxgood file too short... will save 0x%llx bytes instead of 0x%llx\n", (unsigned long long)size_by_seek, | warn("save_buffer: .fsxgood file too short... will save 0x%llx bytes instead of 0x%llx\n", (unsigned long long)size_by_seek, | ||||
(unsigned long long)bufferlength); | (unsigned long long)bufferlength); | ||||
bufferlength = size_by_seek; | bufferlength = size_by_seek; | ||||
} | } | ||||
} | } | ||||
ret = lseek(fd, (off_t)0, SEEK_SET); | ret = lseek(savefd, (off_t)0, SEEK_SET); | ||||
if (ret == (off_t)-1) | if (ret == (off_t)-1) | ||||
prterr("save_buffer: lseek 0"); | prterr("save_buffer: lseek 0"); | ||||
byteswritten = write(fd, buffer, (size_t)bufferlength); | byteswritten = write(savefd, buffer, (size_t)bufferlength); | ||||
if (byteswritten != bufferlength) { | if (byteswritten != bufferlength) { | ||||
if (byteswritten == -1) | if (byteswritten == -1) | ||||
prterr("save_buffer write"); | prterr("save_buffer write"); | ||||
else | else | ||||
warn("save_buffer: short write, 0x%x bytes instead of 0x%llx\n", | warn("save_buffer: short write, 0x%x bytes instead of 0x%llx\n", | ||||
(unsigned)byteswritten, | (unsigned)byteswritten, | ||||
(unsigned long long)bufferlength); | (unsigned long long)bufferlength); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | if (statbuf.st_size != (off_t)100000) { | ||||
prt("no extend on truncate! not posix!\n"); | prt("no extend on truncate! not posix!\n"); | ||||
exit(130); | exit(130); | ||||
} | } | ||||
ftruncate(fd, (off_t)0); | ftruncate(fd, (off_t)0); | ||||
} | } | ||||
void | void | ||||
doread(unsigned offset, unsigned size) | doread(off_t offset, off_t size) | ||||
{ | { | ||||
off_t ret; | off_t ret; | ||||
unsigned iret; | ssize_t iret; | ||||
offset -= offset % readbdy; | offset -= offset % readbdy; | ||||
if (size == 0) { | if (size == 0) { | ||||
if (!quiet && testcalls > simulatedopcount) | if (!quiet && testcalls > simulatedopcount) | ||||
prt("skipping zero size read\n"); | prt("skipping zero size read\n"); | ||||
log4(OP_SKIPPED, OP_READ, offset, size); | log4(OP_SKIPPED, OP_READ, offset, size); | ||||
return; | return; | ||||
} | } | ||||
Show All 31 Lines | else | ||||
iret, size); | iret, size); | ||||
report_failure(141); | report_failure(141); | ||||
} | } | ||||
check_buffers(offset, size); | check_buffers(offset, size); | ||||
} | } | ||||
void | void | ||||
check_eofpage(char *s, unsigned offset, char *p, int size) | check_eofpage(const char *s, unsigned offset, char *p, int size) | ||||
{ | { | ||||
uintptr_t last_page, should_be_zero; | uintptr_t last_page, should_be_zero; | ||||
if (offset + size <= (file_size & ~page_mask)) | if (offset + size <= (file_size & ~page_mask)) | ||||
return; | return; | ||||
/* | /* | ||||
* we landed in the last page of the file | * we landed in the last page of the file | ||||
* test to make sure the VM system provided 0's | * test to make sure the VM system provided 0's | ||||
▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | if (munmap(p, map_size) != 0) { | ||||
report_failure(191); | report_failure(191); | ||||
} | } | ||||
check_buffers(offset, size); | check_buffers(offset, size); | ||||
} | } | ||||
void | void | ||||
gendata(char *original_buf, char *good_buf, unsigned offset, unsigned size) | gendata(unsigned offset, unsigned size) | ||||
{ | { | ||||
while (size--) { | while (size--) { | ||||
good_buf[offset] = testcalls % 256; | good_buf[offset] = testcalls % 256; | ||||
if (offset % 2) | if (offset % 2) | ||||
good_buf[offset] += original_buf[offset]; | good_buf[offset] += original_buf[offset]; | ||||
offset++; | offset++; | ||||
} | } | ||||
} | } | ||||
void | void | ||||
dowrite(unsigned offset, unsigned size) | dowrite(unsigned offset, unsigned size) | ||||
{ | { | ||||
off_t ret; | off_t ret; | ||||
unsigned iret; | ssize_t iret; | ||||
offset -= offset % writebdy; | offset -= offset % writebdy; | ||||
if (size == 0) { | if (size == 0) { | ||||
if (!quiet && testcalls > simulatedopcount) | if (!quiet && testcalls > simulatedopcount) | ||||
prt("skipping zero size write\n"); | prt("skipping zero size write\n"); | ||||
log4(OP_SKIPPED, OP_WRITE, offset, size); | log4(OP_SKIPPED, OP_WRITE, offset, size); | ||||
return; | return; | ||||
} | } | ||||
log4(OP_WRITE, offset, size, file_size); | log4(OP_WRITE, offset, size, file_size); | ||||
gendata(original_buf, good_buf, offset, size); | gendata(offset, size); | ||||
if (file_size < offset + size) { | if (file_size < offset + size) { | ||||
if (file_size < offset) | if (file_size < offset) | ||||
memset(good_buf + file_size, '\0', offset - file_size); | memset(good_buf + file_size, '\0', offset - file_size); | ||||
file_size = offset + size; | file_size = offset + size; | ||||
if (lite) { | if (lite) { | ||||
warn("Lite file size bug in fsx!"); | warn("Lite file size bug in fsx!"); | ||||
report_failure(149); | report_failure(149); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | if (!quiet && testcalls > simulatedopcount) | ||||
prt("skipping zero size write\n"); | prt("skipping zero size write\n"); | ||||
log4(OP_SKIPPED, OP_MAPWRITE, offset, size); | log4(OP_SKIPPED, OP_MAPWRITE, offset, size); | ||||
return; | return; | ||||
} | } | ||||
cur_filesize = file_size; | cur_filesize = file_size; | ||||
log4(OP_MAPWRITE, offset, size, 0); | log4(OP_MAPWRITE, offset, size, 0); | ||||
gendata(original_buf, good_buf, offset, size); | gendata(offset, size); | ||||
if (file_size < offset + size) { | if (file_size < offset + size) { | ||||
if (file_size < offset) | if (file_size < offset) | ||||
memset(good_buf + file_size, '\0', offset - file_size); | memset(good_buf + file_size, '\0', offset - file_size); | ||||
file_size = offset + size; | file_size = offset + size; | ||||
if (lite) { | if (lite) { | ||||
warn("Lite file size bug in fsx!"); | warn("Lite file size bug in fsx!"); | ||||
report_failure(200); | report_failure(200); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | if (munmap(p, file_size) != 0) { | ||||
report_failure(207); | report_failure(207); | ||||
} | } | ||||
} | } | ||||
void | void | ||||
test(void) | test(void) | ||||
{ | { | ||||
unsigned long offset; | off_t offset; | ||||
unsigned long size = maxoplen; | off_t size = maxoplen; | ||||
unsigned long rv = random(); | unsigned long rv = random(); | ||||
unsigned long op = rv % (3 + !lite + mapped_writes); | unsigned long op = rv % (3 + !lite + mapped_writes); | ||||
/* turn off the map read if necessary */ | /* turn off the map read if necessary */ | ||||
if (op == 2 && !mapped_reads) | if (op == 2 && !mapped_reads) | ||||
op = 0; | op = 0; | ||||
if (simulatedopcount > 0 && testcalls == simulatedopcount) | if (simulatedopcount > 0 && testcalls == simulatedopcount) | ||||
writefileimage(); | writefileimage(); | ||||
testcalls++; | testcalls++; | ||||
if (closeprob) | if (closeprob) | ||||
closeopen = (rv >> 3) < (1 << 28) / closeprob; | closeopen = (rv >> 3) < (1ul << 28) / closeprob; | ||||
if (invlprob) | if (invlprob) | ||||
invl = (rv >> 3) < (1 << 28) / invlprob; | invl = (rv >> 3) < (1ul << 28) / invlprob; | ||||
if (debugstart > 0 && testcalls >= debugstart) | if (debugstart > 0 && testcalls >= debugstart) | ||||
debug = 1; | debug = 1; | ||||
if (!quiet && testcalls < simulatedopcount && testcalls % 100000 == 0) | if (!quiet && testcalls < simulatedopcount && testcalls % 100000 == 0) | ||||
prt("%lu...\n", testcalls); | prt("%lu...\n", testcalls); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 368 Lines • Show Last 20 Lines |