Merge branch 'adjusting-libpmem' of https://github.com/lukaszstolarczuk/fio into...
[fio.git] / init.c
diff --git a/init.c b/init.c
index 0431f700a50d5d68bd4c3242e740dae0bf4a4d65..491b46e6c70c3d0c319e4bf8d06fecf0233a8c55 100644 (file)
--- a/init.c
+++ b/init.c
@@ -564,13 +564,11 @@ static int setup_rate(struct thread_data *td)
 {
        int ret = 0;
 
-       if (td->o.rate[DDIR_READ] || td->o.rate_iops[DDIR_READ])
-               ret = __setup_rate(td, DDIR_READ);
-       if (td->o.rate[DDIR_WRITE] || td->o.rate_iops[DDIR_WRITE])
-               ret |= __setup_rate(td, DDIR_WRITE);
-       if (td->o.rate[DDIR_TRIM] || td->o.rate_iops[DDIR_TRIM])
-               ret |= __setup_rate(td, DDIR_TRIM);
-
+       for_each_rw_ddir(ddir) {
+               if (td->o.rate[ddir] || td->o.rate_iops[ddir]) {
+                       ret |= __setup_rate(td, ddir);
+               }
+       }
        return ret;
 }
 
@@ -662,31 +660,25 @@ static int fixup_options(struct thread_data *td)
        if (td_read(td))
                o->overwrite = 1;
 
-       if (!o->min_bs[DDIR_READ])
-               o->min_bs[DDIR_READ] = o->bs[DDIR_READ];
-       if (!o->max_bs[DDIR_READ])
-               o->max_bs[DDIR_READ] = o->bs[DDIR_READ];
-       if (!o->min_bs[DDIR_WRITE])
-               o->min_bs[DDIR_WRITE] = o->bs[DDIR_WRITE];
-       if (!o->max_bs[DDIR_WRITE])
-               o->max_bs[DDIR_WRITE] = o->bs[DDIR_WRITE];
-       if (!o->min_bs[DDIR_TRIM])
-               o->min_bs[DDIR_TRIM] = o->bs[DDIR_TRIM];
-       if (!o->max_bs[DDIR_TRIM])
-               o->max_bs[DDIR_TRIM] = o->bs[DDIR_TRIM];
-
-       o->rw_min_bs = min(o->min_bs[DDIR_READ], o->min_bs[DDIR_WRITE]);
-       o->rw_min_bs = min(o->min_bs[DDIR_TRIM], o->rw_min_bs);
+       for_each_rw_ddir(ddir) {
+               if (!o->min_bs[ddir])
+                       o->min_bs[ddir] = o->bs[ddir];
+               if (!o->max_bs[ddir])
+                       o->max_bs[ddir] = o->bs[ddir];
+       }
+
+       o->rw_min_bs = -1;
+       for_each_rw_ddir(ddir) {
+               o->rw_min_bs = min(o->rw_min_bs, o->min_bs[ddir]);
+       }
 
        /*
         * For random IO, allow blockalign offset other than min_bs.
         */
-       if (!o->ba[DDIR_READ] || !td_random(td))
-               o->ba[DDIR_READ] = o->min_bs[DDIR_READ];
-       if (!o->ba[DDIR_WRITE] || !td_random(td))
-               o->ba[DDIR_WRITE] = o->min_bs[DDIR_WRITE];
-       if (!o->ba[DDIR_TRIM] || !td_random(td))
-               o->ba[DDIR_TRIM] = o->min_bs[DDIR_TRIM];
+       for_each_rw_ddir(ddir) {
+               if (!o->ba[ddir] || !td_random(td))
+                       o->ba[ddir] = o->min_bs[ddir];
+       }
 
        if ((o->ba[DDIR_READ] != o->min_bs[DDIR_READ] ||
            o->ba[DDIR_WRITE] != o->min_bs[DDIR_WRITE] ||
@@ -765,14 +757,12 @@ static int fixup_options(struct thread_data *td)
                log_err("fio: rate and rate_iops are mutually exclusive\n");
                ret |= 1;
        }
-       if ((o->rate[DDIR_READ] && (o->rate[DDIR_READ] < o->ratemin[DDIR_READ])) ||
-           (o->rate[DDIR_WRITE] && (o->rate[DDIR_WRITE] < o->ratemin[DDIR_WRITE])) ||
-           (o->rate[DDIR_TRIM] && (o->rate[DDIR_TRIM] < o->ratemin[DDIR_TRIM])) ||
-           (o->rate_iops[DDIR_READ] && (o->rate_iops[DDIR_READ] < o->rate_iops_min[DDIR_READ])) ||
-           (o->rate_iops[DDIR_WRITE] && (o->rate_iops[DDIR_WRITE] < o->rate_iops_min[DDIR_WRITE])) ||
-           (o->rate_iops[DDIR_TRIM] && (o->rate_iops[DDIR_TRIM] < o->rate_iops_min[DDIR_TRIM]))) {
-               log_err("fio: minimum rate exceeds rate\n");
-               ret |= 1;
+       for_each_rw_ddir(ddir) {
+               if ((o->rate[ddir] && (o->rate[ddir] < o->ratemin[ddir])) ||
+                   (o->rate_iops[ddir] && (o->rate_iops[ddir] < o->rate_iops_min[ddir]))) {
+                       log_err("fio: minimum rate exceeds rate, ddir %d\n", +ddir);
+                       ret |= 1;
+               }
        }
 
        if (!o->timeout && o->time_based) {
@@ -992,9 +982,9 @@ void td_fill_verify_state_seed(struct thread_data *td)
 
 static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64)
 {
-       unsigned int read_seed = td->rand_seeds[FIO_RAND_BS_OFF];
-       unsigned int write_seed = td->rand_seeds[FIO_RAND_BS1_OFF];
-       unsigned int trim_seed = td->rand_seeds[FIO_RAND_BS2_OFF];
+       uint64_t read_seed = td->rand_seeds[FIO_RAND_BS_OFF];
+       uint64_t write_seed = td->rand_seeds[FIO_RAND_BS1_OFF];
+       uint64_t trim_seed = td->rand_seeds[FIO_RAND_BS2_OFF];
        int i;
 
        /*
@@ -1099,6 +1089,9 @@ int ioengine_load(struct thread_data *td)
                 */
                dlhandle = td->io_ops_dlhandle;
                ops = load_ioengine(td);
+               if (!ops)
+                       goto fail;
+
                if (ops == td->io_ops && dlhandle == td->io_ops_dlhandle) {
                        if (dlhandle)
                                dlclose(dlhandle);
@@ -1113,10 +1106,8 @@ int ioengine_load(struct thread_data *td)
        }
 
        td->io_ops = load_ioengine(td);
-       if (!td->io_ops) {
-               log_err("fio: failed to load engine\n");
-               return 1;
-       }
+       if (!td->io_ops)
+               goto fail;
 
        if (td->io_ops->option_struct_size && td->io_ops->options) {
                /*
@@ -1155,6 +1146,11 @@ int ioengine_load(struct thread_data *td)
 
        td_set_ioengine_flags(td);
        return 0;
+
+fail:
+       log_err("fio: failed to load engine\n");
+       return 1;
+
 }
 
 static void init_flags(struct thread_data *td)
@@ -1739,11 +1735,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                if (file_alloced) {
                        if (td_new->files) {
                                struct fio_file *f;
-                               for_each_file(td_new, f, i) {
-                                       if (f->file_name)
-                                               sfree(f->file_name);
-                                       sfree(f);
-                               }
+                               for_each_file(td_new, f, i)
+                                       fio_file_free(f);
                                free(td_new->files);
                                td_new->files = NULL;
                        }
@@ -2062,6 +2055,18 @@ static int __parse_jobs_ini(struct thread_data *td,
                }
 
                ret = fio_options_parse(td, opts, num_opts);
+
+               if (!ret) {
+                       if (!strcmp(file, "-") && td->o.read_iolog_file != NULL) {
+                               char *fname = get_name_by_idx(td->o.read_iolog_file,
+                                                             td->subjob_number);
+                               if (!strcmp(fname, "-")) {
+                                       log_err("fio: we can't read both iolog "
+                                               "and job file from stdin.\n");
+                                       ret = 1;
+                               }
+                       }
+               }
                if (!ret) {
                        if (dump_cmdline)
                                dump_opt_list(td);