Extend --readonly
[fio.git] / init.c
diff --git a/init.c b/init.c
index 355de88ffa4db9cdc65e6c3d53103fd4618064c4..89c66afa0e1b8b439ce5a534f76e5d83183431ce 100644 (file)
--- a/init.c
+++ b/init.c
@@ -17,7 +17,7 @@
 #include "fio.h"
 #include "parse.h"
 
-static char fio_version_string[] = "fio 1.16.1";
+static char fio_version_string[] = "fio 1.17.1";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -35,6 +35,7 @@ FILE *f_out = NULL;
 FILE *f_err = NULL;
 
 int write_bw_log = 0;
+int read_only = 0;
 
 static int def_timeout = 0;
 static int write_lat_log = 0;
@@ -89,7 +90,12 @@ static struct option long_options[FIO_NR_OPTIONS] = {
        {
                .name           = "showcmd",
                .has_arg        = no_argument,
-               .val            = 's'
+               .val            = 's',
+       },
+       {
+               .name           = "readonly",
+               .has_arg        = no_argument,
+               .val            = 'r',
        },
        {
                .name           = NULL,
@@ -180,6 +186,11 @@ static int fixup_options(struct thread_data *td)
 {
        struct thread_options *o = &td->o;
 
+       if (read_only && td_write(td)) {
+               log_err("fio: job <%s> has write bit set, but fio is in read-only mode\n", td->o.name);
+               return 1;
+       }
+       
        if (o->rwmix[DDIR_READ] + o->rwmix[DDIR_WRITE] > 100)
                o->rwmix[DDIR_WRITE] = 100 - o->rwmix[DDIR_READ];
 
@@ -222,9 +233,6 @@ static int fixup_options(struct thread_data *td)
        if (!o->file_size_high)
                o->file_size_high = o->file_size_low;
 
-       if (td_read(td) && !td_rw(td))
-               o->verify = 0;
-
        if (o->norandommap && o->verify != VERIFY_NONE) {
                log_err("fio: norandommap given, verify disabled\n");
                o->verify = VERIFY_NONE;
@@ -564,8 +572,12 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        }
 
        string = malloc(4096);
-       name = malloc(256);
-       memset(name, 0, 256);
+
+       /*
+        * it's really 256 + small bit, 280 should suffice
+        */
+       name = malloc(280);
+       memset(name, 0, 280);
 
        stonewall = stonewall_flag;
        do {
@@ -579,8 +591,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
                if (is_empty_or_comment(p))
                        continue;
                if (sscanf(p, "[%255s]", name) != 1) {
-                       log_err("fio: option <%s> outside of job section\n", p);
-                       continue;
+                       log_err("fio: option <%s> outside of [] job section\n", p);
+                       break;
                }
 
                global = !strncmp(name, "global", 6);
@@ -767,6 +779,9 @@ static int parse_cmd_line(int argc, char *argv[])
                case 's':
                        dump_cmdline = 1;
                        break;
+               case 'r':
+                       read_only = 1;
+                       break;
                case 'v':
                        printf("%s\n", fio_version_string);
                        exit(0);