Add support for O_ATOMIC
[fio.git] / init.c
diff --git a/init.c b/init.c
index 0cc6a520b15269c177ff1fa7ab01a4fddc2ac038..1841ffc0fd152a81f72989a669aae08fe7dcc26e 100644 (file)
--- a/init.c
+++ b/init.c
@@ -629,6 +629,12 @@ static int fixup_options(struct thread_data *td)
                ret = 1;
        }
 
+       /*
+        * O_ATOMIC implies O_DIRECT
+        */
+       if (td->o.oatomic)
+               td->o.odirect = 1;
+
        return ret;
 }
 
@@ -701,7 +707,10 @@ static void td_fill_rand_seeds_os(struct thread_data *td)
                td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
 
        os_random_seed(td->rand_seeds[FIO_RAND_BLOCK_OFF], &td->random_state);
-       os_random_seed(td->rand_seeds[FIO_RAND_SEQ_RAND_OFF], &td->seq_rand_state);
+
+       os_random_seed(td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF], &td->seq_rand_state[DDIR_READ]);
+       os_random_seed(td->rand_seeds[FIO_RAND_SEQ_RAND_WRITE_OFF], &td->seq_rand_state[DDIR_WRITE]);
+       os_random_seed(td->rand_seeds[FIO_RAND_SEQ_RAND_TRIM_OFF], &td->seq_rand_state[DDIR_TRIM]);
 }
 
 static void td_fill_rand_seeds_internal(struct thread_data *td)
@@ -723,7 +732,9 @@ static void td_fill_rand_seeds_internal(struct thread_data *td)
                td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
 
        init_rand_seed(&td->__random_state, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
-       init_rand_seed(&td->__seq_rand_state, td->rand_seeds[FIO_RAND_SEQ_RAND_OFF]);
+       init_rand_seed(&td->__seq_rand_state[DDIR_READ], td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF]);
+       init_rand_seed(&td->__seq_rand_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_SEQ_RAND_WRITE_OFF]);
+       init_rand_seed(&td->__seq_rand_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_SEQ_RAND_TRIM_OFF]);
 }
 
 void td_fill_rand_seeds(struct thread_data *td)
@@ -749,6 +760,10 @@ int ioengine_load(struct thread_data *td)
         */
        if (td->io_ops)
                return 0;
+       if (!td->o.ioengine) {
+               log_err("fio: internal fault, no IO engine specified\n");
+               return 1;
+       }
 
        engine = get_engine_name(td->o.ioengine);
        td->io_ops = load_ioengine(td, engine);
@@ -906,6 +921,12 @@ static char *make_filename(char *buf, struct thread_options *o,
 
        return buf;
 }
+
+int parse_dryrun(void)
+{
+       return dump_cmdline || parse_only;
+}
+
 /*
  * Adds a job to the list of things todo. Sanitizes the various options
  * to make sure we don't have conflicts, and initializes various
@@ -930,7 +951,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
        /*
         * if we are just dumping the output command line, don't add the job
         */
-       if (dump_cmdline || parse_only) {
+       if (parse_dryrun()) {
                put_job(td);
                return 0;
        }
@@ -1026,20 +1047,31 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                                fio_server_send_add_job(td);
 
                        if (!(td->io_ops->flags & FIO_NOIO)) {
-                               char *c1, *c2, *c3, *c4, *c5, *c6;
+                               char *c1, *c2, *c3, *c4;
+                               char *c5 = NULL, *c6 = NULL;
 
                                c1 = fio_uint_to_kmg(o->min_bs[DDIR_READ]);
                                c2 = fio_uint_to_kmg(o->max_bs[DDIR_READ]);
                                c3 = fio_uint_to_kmg(o->min_bs[DDIR_WRITE]);
                                c4 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]);
-                               c5 = fio_uint_to_kmg(o->min_bs[DDIR_TRIM]);
-                               c6 = fio_uint_to_kmg(o->max_bs[DDIR_TRIM]);
-
-                               log_info("%s: (g=%d): rw=%s, bs=%s-%s/%s-%s/%s-%s,"
-                                        " ioengine=%s, iodepth=%u\n",
-                                               td->o.name, td->groupid,
-                                               ddir_str(o->td_ddir),
-                                               c1, c2, c3, c4, c5, c6,
+
+                               if (!o->bs_is_seq_rand) {
+                                       c5 = fio_uint_to_kmg(o->min_bs[DDIR_TRIM]);
+                                       c6 = fio_uint_to_kmg(o->max_bs[DDIR_TRIM]);
+                               }
+
+                               log_info("%s: (g=%d): rw=%s, ", td->o.name,
+                                                       td->groupid,
+                                                       ddir_str(o->td_ddir));
+
+                               if (o->bs_is_seq_rand)
+                                       log_info("bs(seq/rand)=%s-%s/%s-%s, ",
+                                                       c1, c2, c3, c4);
+                               else
+                                       log_info("bs=%s-%s/%s-%s/%s-%s, ",
+                                                       c1, c2, c3, c4, c5, c6);
+
+                               log_info("ioengine=%s, iodepth=%u\n",
                                                td->io_ops->name, o->iodepth);
 
                                free(c1);
@@ -1253,7 +1285,7 @@ int parse_jobs_ini(char *file, int is_buf, int stonewall_flag, int type)
                }
 
                /*
-                * Seperate multiple job files by a stonewall
+                * Separate multiple job files by a stonewall
                 */
                if (!global && stonewall) {
                        td->o.stonewall = stonewall;
@@ -1725,7 +1757,13 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                fio_options_set_ioengine_opts(l_opts, td);
                        }
 
-                       ret = fio_cmd_option_parse(td, opt, val);
+                       if ((!val || !strlen(val)) &&
+                           l_opts[lidx].has_arg == required_argument) {
+                               log_err("fio: option %s requires an argument\n", opt);
+                               ret = 1;
+                       } else
+                               ret = fio_cmd_option_parse(td, opt, val);
+
                        if (ret) {
                                if (td) {
                                        put_job(td);
@@ -1745,8 +1783,6 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                case FIO_GETOPT_IOENGINE: {
                        const char *opt = l_opts[lidx].name;
                        char *val = optarg;
-                       opt = l_opts[lidx].name;
-                       val = optarg;
                        ret = fio_cmd_ioengine_option_parse(td, opt, val);
                        break;
                }
@@ -1838,10 +1874,8 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        break;
        }
 
-       if (do_exit) {
-               if (exit_val && !(is_backend || nr_clients))
-                       exit(exit_val);
-       }
+       if (do_exit && !(is_backend || nr_clients))
+               exit(exit_val);
 
        if (nr_clients && fio_clients_connect()) {
                do_exit++;
@@ -1922,7 +1956,7 @@ int parse_options(int argc, char *argv[])
        fio_options_free(&def_thread);
 
        if (!thread_number) {
-               if (dump_cmdline || parse_only)
+               if (parse_dryrun())
                        return 0;
                if (exec_profile)
                        return 0;