options: clean number of zones if we fail parsing
[fio.git] / init.c
diff --git a/init.c b/init.c
index 5ee408239eee29cf0942773a2bcd760bde2a2a80..149029a52574a02c91e09d4887abbf685505345c 100644 (file)
--- a/init.c
+++ b/init.c
@@ -968,6 +968,7 @@ void td_fill_rand_seeds(struct thread_data *td)
        frand_copy(&td->buf_state_prev, &td->buf_state);
 
        init_rand_seed(&td->dedupe_state, td->rand_seeds[FIO_DEDUPE_OFF], use64);
+       init_rand_seed(&td->zone_state, td->rand_seeds[FIO_RAND_ZONE_OFF], use64);
 }
 
 /*
@@ -1773,15 +1774,48 @@ int __parse_jobs_ini(struct thread_data *td,
                        strip_blank_end(p);
 
                        if (!strncmp(p, "include", strlen("include"))) {
-                               char *filename = p + strlen("include") + 1;
+                               char *filename = p + strlen("include") + 1,
+                                       *ts, *full_fn = NULL;
 
-                               if ((ret = __parse_jobs_ini(td, filename,
-                                               is_buf, stonewall_flag, type, 1,
-                                               name, &opts, &alloc_opts, &num_opts))) {
-                                       log_err("Error %d while parsing include file %s\n",
+                               /*
+                                * Allow for the include filename
+                                * specification to be relative.
+                                */
+                               if (access(filename, F_OK) &&
+                                   (ts = strrchr(file, '/'))) {
+                                       int len = ts - file +
+                                               strlen(filename) + 2;
+
+                                       if (!(full_fn = calloc(1, len))) {
+                                               ret = ENOMEM;
+                                               break;
+                                       }
+
+                                       strncpy(full_fn,
+                                               file, (ts - file) + 1);
+                                       strncpy(full_fn + (ts - file) + 1,
+                                               filename, strlen(filename));
+                                       full_fn[len - 1] = 0;
+                                       filename = full_fn;
+                               }
+
+                               ret = __parse_jobs_ini(td, filename, is_buf,
+                                                      stonewall_flag, type, 1,
+                                                      name, &opts,
+                                                      &alloc_opts, &num_opts);
+
+                               if (ret) {
+                                       log_err("Error %d while parsing "
+                                               "include file %s\n",
                                                ret, filename);
-                                       break;
                                }
+
+                               if (full_fn)
+                                       free(full_fn);
+
+                               if (ret)
+                                       break;
+
                                continue;
                        }