Merge branch 'atomic-writes'
[fio.git] / init.c
diff --git a/init.c b/init.c
index 10e63cca6cf7fd738a20b9c329357e5eb158fab5..96a03d984b08b602ec42e1ac987d90bde322b221 100644 (file)
--- a/init.c
+++ b/init.c
@@ -618,6 +618,19 @@ static int fixup_options(struct thread_data *td)
                ret |= 1;
        }
 
                ret |= 1;
        }
 
+       if (td_trimwrite(td) && o->num_range > 1) {
+               log_err("fio: trimwrite cannot be used with multiple"
+                       " ranges.\n");
+               ret |= 1;
+       }
+
+       if (td_trim(td) && o->num_range > 1 &&
+           !td_ioengine_flagged(td, FIO_MULTI_RANGE_TRIM)) {
+               log_err("fio: can't use multiple ranges with IO engine %s\n",
+                       td->io_ops->name);
+               ret |= 1;
+       }
+
 #ifndef CONFIG_PSHARED
        if (!o->use_thread) {
                log_info("fio: this platform does not support process shared"
 #ifndef CONFIG_PSHARED
        if (!o->use_thread) {
                log_info("fio: this platform does not support process shared"
@@ -840,6 +853,20 @@ static int fixup_options(struct thread_data *td)
                    (o->max_bs[DDIR_WRITE] % o->verify_interval))
                        o->verify_interval = gcd(o->min_bs[DDIR_WRITE],
                                                        o->max_bs[DDIR_WRITE]);
                    (o->max_bs[DDIR_WRITE] % o->verify_interval))
                        o->verify_interval = gcd(o->min_bs[DDIR_WRITE],
                                                        o->max_bs[DDIR_WRITE]);
+
+               if (td->o.verify_only)
+                       o->verify_write_sequence = 0;
+       }
+
+       if (td->o.oatomic) {
+               if (!td_ioengine_flagged(td, FIO_ATOMICWRITES)) {
+                       log_err("fio: engine does not support atomic writes\n");
+                       td->o.oatomic = 0;
+                       ret |= 1;
+               }
+
+               if (!td_write(td))
+                       td->o.oatomic = 0;
        }
 
        if (o->pre_read) {
        }
 
        if (o->pre_read) {
@@ -1002,7 +1029,15 @@ static int fixup_options(struct thread_data *td)
                ret |= 1;
        }
 
                ret |= 1;
        }
 
-
+       if (td->o.fdp) {
+               if (fio_option_is_set(&td->o, dp_type) &&
+                       (td->o.dp_type == FIO_DP_STREAMS || td->o.dp_type == FIO_DP_NONE)) {
+                       log_err("fio: fdp=1 is not compatible with dataplacement={streams, none}\n");
+                       ret |= 1;
+               } else {
+                       td->o.dp_type = FIO_DP_FDP;
+               }
+       }
        return ret;
 }
 
        return ret;
 }
 
@@ -1082,6 +1117,8 @@ void td_fill_rand_seeds(struct thread_data *td)
 
        init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64);
        frand_copy(&td->buf_state_prev, &td->buf_state);
 
        init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64);
        frand_copy(&td->buf_state_prev, &td->buf_state);
+
+       init_rand_seed(&td->fdp_state, td->rand_seeds[FIO_RAND_FDP_OFF], use64);
 }
 
 static int setup_random_seeds(struct thread_data *td)
 }
 
 static int setup_random_seeds(struct thread_data *td)
@@ -1598,12 +1635,18 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        .log_type = IO_LOG_TYPE_LAT,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
                        .log_type = IO_LOG_TYPE_LAT,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
+                       .log_issue_time = o->log_issue_time,
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
                const char *pre = make_log_name(o->lat_log_file, o->name);
                const char *suf;
 
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
                const char *pre = make_log_name(o->lat_log_file, o->name);
                const char *suf;
 
+               if (o->log_issue_time && !o->log_offset) {
+                       log_err("fio: log_issue_time option requires write_lat_log and log_offset options\n");
+                       goto err;
+               }
+
                if (p.log_gz_store)
                        suf = "log.fz";
                else
                if (p.log_gz_store)
                        suf = "log.fz";
                else
@@ -1627,6 +1670,9 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        setup_log(&td->clat_log, &p, logname);
                }
 
                        setup_log(&td->clat_log, &p, logname);
                }
 
+       } else if (o->log_issue_time) {
+               log_err("fio: log_issue_time option requires write_lat_log and log_offset options\n");
+               goto err;
        }
 
        if (o->write_hist_log) {
        }
 
        if (o->write_hist_log) {
@@ -1638,6 +1684,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        .log_type = IO_LOG_TYPE_HIST,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
                        .log_type = IO_LOG_TYPE_HIST,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
+                       .log_issue_time = o->log_issue_time,
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
@@ -1670,6 +1717,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        .log_type = IO_LOG_TYPE_BW,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
                        .log_type = IO_LOG_TYPE_BW,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
+                       .log_issue_time = o->log_issue_time,
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
@@ -1702,6 +1750,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        .log_type = IO_LOG_TYPE_IOPS,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
                        .log_type = IO_LOG_TYPE_IOPS,
                        .log_offset = o->log_offset,
                        .log_prio = o->log_prio,
+                       .log_issue_time = o->log_issue_time,
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };
                        .log_gz = o->log_gz,
                        .log_gz_store = o->log_gz_store,
                };