Merge branch 'master' of ssh://git.kernel.dk/data/git/fio
[fio.git] / init.c
diff --git a/init.c b/init.c
index 95e26b8f4624fee73bf59863a52b4a7fac58d460..ba5bf2fbf4bb9b55bc61267e7ff0e3e8889bbd04 100644 (file)
--- a/init.c
+++ b/init.c
@@ -749,7 +749,7 @@ static int fixup_options(struct thread_data *td)
        /*
         * If randseed is set, that overrides randrepeat
         */
-       if (td->o.rand_seed)
+       if (fio_option_is_set(&td->o, rand_seed))
                td->o.rand_repeatable = 0;
 
        if ((td->io_ops->flags & FIO_NOEXTEND) && td->o.file_append) {
@@ -767,6 +767,13 @@ static int fixup_options(struct thread_data *td)
        if (!td->loops)
                td->loops = 1;
 
+       if (td->o.block_error_hist && td->o.nr_files != 1) {
+               log_err("fio: block error histogram only available with "
+                       "with a single file per job, but %d files "
+                       "provided\n", td->o.nr_files);
+               ret = 1;
+       }
+
        return ret;
 }
 
@@ -949,6 +956,9 @@ static void init_flags(struct thread_data *td)
                td->flags |= TD_F_SCRAMBLE_BUFFERS;
        if (o->verify != VERIFY_NONE)
                td->flags |= TD_F_VER_NONE;
+
+       if (o->verify_async || o->io_submit_mode == IO_MODE_OFFLOAD)
+               td->flags |= TD_F_NEED_LOCK;
 }
 
 static int setup_random_seeds(struct thread_data *td)
@@ -956,14 +966,10 @@ static int setup_random_seeds(struct thread_data *td)
        unsigned long seed;
        unsigned int i;
 
-       if (!td->o.rand_repeatable && !td->o.rand_seed)
+       if (!td->o.rand_repeatable && !fio_option_is_set(&td->o, rand_seed))
                return init_random_state(td, td->rand_seeds, sizeof(td->rand_seeds));
 
-       if (!td->o.rand_seed)
-               seed = 0x89;
-       else
-               seed = td->o.rand_seed;
-
+       seed = td->o.rand_seed;
        for (i = 0; i < 4; i++)
                seed *= 0x9e370001UL;
 
@@ -2232,6 +2238,35 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                exit_val = 1;
                                break;
                        }
+                       /* if --client parameter contains a pathname */
+                       if (0 == access(optarg, R_OK)) {
+                               /* file contains a list of host addrs or names */
+                               char hostaddr[PATH_MAX] = {0};
+                               char formatstr[8];
+                               FILE * hostf = fopen(optarg, "r");
+                               if (!hostf) {
+                                       log_err("fio: could not open client list file %s for read\n", optarg);
+                                       do_exit++;
+                                       exit_val = 1;
+                                       break;
+                               }
+                               sprintf(formatstr, "%%%ds", PATH_MAX - 1);
+                               /*
+                                * read at most PATH_MAX-1 chars from each
+                                * record in this file
+                                */
+                               while (fscanf(hostf, formatstr, hostaddr) == 1) {
+                                       /* expect EVERY host in file to be valid */
+                                       if (fio_client_add(&fio_client_ops, hostaddr, &cur_client)) {
+                                               log_err("fio: failed adding client %s from file %s\n", hostaddr, optarg);
+                                               do_exit++;
+                                               exit_val = 1;
+                                               break;
+                                       }
+                               }
+                               fclose(hostf);
+                               break; /* no possibility of job file for "this client only" */
+                       }
                        if (fio_client_add(&fio_client_ops, optarg, &cur_client)) {
                                log_err("fio: failed adding client %s\n", optarg);
                                do_exit++;