Add support for options being a power-of-2
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index ae87b1ed9fb017834520034d72d128f6a46a4a25..745056bdc8186e54743d2fb688df926084c91853 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -17,6 +17,7 @@
 #include "options.h"
 #include "minmax.h"
 #include "lib/ieee754.h"
+#include "lib/pow2.h"
 
 #ifdef CONFIG_ARITHMETIC
 #include "y.tab.h"
@@ -272,53 +273,6 @@ extern int evaluate_arithmetic_expression(const char *buffer, long long *ival,
                                          double *dval, double implied_units,
                                          int is_time);
 
-#ifdef CONFIG_ARITHMETIC
-/*
- * These two verification functions are just to gain confidence that
- * the arithmetic processing code is always getting the same answer as the
- * original number parsing code.  Once sufficiently sure that the arithmetic
- * code is always getting the right answers, these can be removed.
- */
-static void verify_exp_parser_float(const char *str, double implied_units, int is_time)
-{
-       long long ival;
-       double dval, tmpval;
-
-       if (sscanf(str, "%lf", &tmpval) != 1)
-               return;
-
-       if (evaluate_arithmetic_expression(str, &ival, &dval, implied_units, is_time) != 0) {
-               log_info("Arithmetic failed on '%s'\n", str);
-               return;
-       }
-       if (dval != tmpval) {
-               log_info("Arithmetic failed on: '%s' got %lf, expected %lf\n",
-                               str, dval, tmpval);
-       }
-}
-
-static void verify_exp_parser_decimal(const char *str, long long val, int kilo, int is_seconds,
-                                     int is_time)
-{
-       int rc;
-       long long ival;
-       double dval;
-       double implied_units = 1.0;
-
-       if (is_seconds)
-               implied_units = 1000000.0;
-
-       rc = evaluate_arithmetic_expression(str, &ival, &dval, implied_units, is_time);
-       if (!rc) {
-               if (ival != val)
-                       log_info("Arithmetic failed on '%s', expected %lld, got %lld\n",
-                               str, val, ival);
-       } else {
-               log_info("Arithmetic failed on '%s'\n", str);
-       }
-}
-#endif
-
 /*
  * Convert string into a floating number. Return 1 for success and 0 otherwise.
  */
@@ -335,8 +289,6 @@ int str_to_float(const char *str, double *val, int is_time)
                        *val = dval;
                        return 1;
                }
-       } else {
-               verify_exp_parser_float(str, 1.0, is_time);
        }
 #endif
        return 1 == sscanf(str, "%lf", val);
@@ -395,9 +347,7 @@ int str_to_decimal(const char *str, long long *val, int kilo, void *data,
                        *val *= mult;
        } else
                *val *= get_mult_time(str, len, is_seconds);
-#ifdef CONFIG_ARITHMETIC
-       verify_exp_parser_decimal(str, *val, kilo, is_seconds, is_time);
-#endif
+
        return 0;
 }
 
@@ -557,6 +507,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                if (!is_time && o->is_time)
                        is_time = o->is_time;
 
+               tmp[sizeof(tmp) - 1] = '\0';
                strncpy(tmp, ptr, sizeof(tmp) - 1);
                p = strchr(tmp, ',');
                if (p)
@@ -571,6 +522,10 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
 
                if (ret)
                        break;
+               if (o->pow2 && !is_power_of_2(ull)) {
+                       log_err("%s: must be a power-of-2\n", o->name);
+                       return 1;
+               }
 
                if (o->maxval && ull > o->maxval) {
                        log_err("max value out of range: %llu"
@@ -756,6 +711,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                char tmp[128];
                char *p1, *p2;
 
+               tmp[sizeof(tmp) - 1] = '\0';
                strncpy(tmp, ptr, sizeof(tmp) - 1);
 
                /* Handle bsrange with separate read,write values: */