Fix refill buffers overwriting verify data
[fio.git] / init.c
diff --git a/init.c b/init.c
index 1dfaa1f06d95cc248d09ea4b4e98ac08a0d07c8e..12913615d21874619129514e59b138e60518e555 100644 (file)
--- a/init.c
+++ b/init.c
@@ -19,7 +19,7 @@
 #include "smalloc.h"
 #include "filehash.h"
 
-static char fio_version_string[] = "fio 1.20-rc3";
+static char fio_version_string[] = "fio 1.21-rc2";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -47,6 +47,8 @@ static int write_lat_log;
 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
@@ -218,9 +220,6 @@ static int fixup_options(struct thread_data *td)
                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);
@@ -314,6 +313,9 @@ static int fixup_options(struct thread_data *td)
                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;
 }
 
@@ -757,8 +759,12 @@ static void free_shm(void)
        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);
        }
 
@@ -783,6 +789,7 @@ static int setup_thread_area(void)
                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)
@@ -806,6 +813,8 @@ static int setup_thread_area(void)
 
        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;
@@ -846,6 +855,7 @@ struct debug_level debug_levels[] = {
        { .name = "random",     .shift = FD_RANDOM },
        { .name = "parse",      .shift = FD_PARSE },
        { .name = "diskutil",   .shift = FD_DISKUTIL },
+       { .name = "job",        .shift = FD_JOB },
        { },
 };
 
@@ -866,22 +876,38 @@ static int set_debug(const char *string)
                }
                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)