#include "smalloc.h"
#include "filehash.h"
-static char fio_version_string[] = "fio 1.20-rc4";
+static char fio_version_string[] = "fio 1.21-rc8";
#define FIO_RANDSEED (0xb1899bedUL)
static int prev_group_jobs;
unsigned long fio_debug = 0;
+unsigned int fio_debug_jobno = -1;
+unsigned int *fio_debug_jobp = NULL;
/*
* Command line options. These will contain the above, plus a few
return 1;
}
- if (o->rwmix[DDIR_READ] + o->rwmix[DDIR_WRITE] > 100)
- o->rwmix[DDIR_WRITE] = 100 - o->rwmix[DDIR_READ];
-
if (o->write_iolog_file && o->read_iolog_file) {
log_err("fio: read iolog overrides write_iolog\n");
free(o->write_iolog_file);
}
if (o->fill_device && !o->size)
- o->size = ULONG_LONG_MAX;
+ o->size = -1ULL;
if (td_rw(td) && td->o.verify != VERIFY_NONE)
log_info("fio: mixed read/write workload with verify. May not "
"work as expected, unless you pre-populated the file\n");
+ if (td->o.verify != VERIFY_NONE)
+ td->o.refill_buffers = 1;
+
return 0;
}
struct shmid_ds sbuf;
if (threads) {
- shmdt((void *) threads);
+ void *tp = threads;
+
threads = NULL;
+ file_hash_exit();
+ fio_debug_jobp = NULL;
+ shmdt(tp);
shmctl(shm_id, IPC_RMID, &sbuf);
}
size_t size = max_jobs * sizeof(struct thread_data);
size += file_hash_size;
+ size += sizeof(unsigned int);
shm_id = shmget(0, size, IPC_CREAT | 0600);
if (shm_id != -1)
memset(threads, 0, max_jobs * sizeof(struct thread_data));
hash = (void *) threads + max_jobs * sizeof(struct thread_data);
+ fio_debug_jobp = (void *) hash + file_hash_size;
+ *fio_debug_jobp = -1;
file_hash_init(hash);
atexit(free_shm);
return 0;
{ .name = "random", .shift = FD_RANDOM },
{ .name = "parse", .shift = FD_PARSE },
{ .name = "diskutil", .shift = FD_DISKUTIL },
+ { .name = "job", .shift = FD_JOB },
{ },
};
}
log_info("all\n");
return 1;
- } else if (!strcmp(string, "all")) {
- fio_debug = ~0UL;
- return 0;
}
while ((opt = strsep(&p, ",")) != NULL) {
int found = 0;
+ if (!strncmp(opt, "all", 3)) {
+ log_info("fio: set all debug options\n");
+ fio_debug = ~0UL;
+ continue;
+ }
+
for (i = 0; debug_levels[i].name; i++) {
dl = &debug_levels[i];
- if (!strncmp(opt, dl->name, strlen(opt))) {
+ found = !strncmp(opt, dl->name, strlen(dl->name));
+ if (!found)
+ continue;
+
+ if (dl->shift == FD_JOB) {
+ opt = strchr(opt, ':');
+ if (!opt) {
+ log_err("fio: missing job number\n");
+ break;
+ }
+ opt++;
+ fio_debug_jobno = atoi(opt);
+ log_info("fio: set debug jobno %d\n",
+ fio_debug_jobno);
+ } else {
log_info("fio: set debug option %s\n", opt);
- found = 1;
fio_debug |= (1UL << dl->shift);
- break;
}
+ break;
}
if (!found)
return 0;
}
#else
-static void set_debug(const char *string)
+static int set_debug(const char *string)
{
log_err("fio: debug tracing not included in build\n");
return 1;