glusterfs: update for new API
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index 194ad594779a59a6de8104939fd5b7ef5dc1f69a..a7d4516e47028b9373c7012bd8b56877c8f493cf 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -120,19 +120,22 @@ static void show_option_values(const struct fio_option *o)
 static void show_option_help(const struct fio_option *o, int is_err)
 {
        const char *typehelp[] = {
-               "invalid",
-               "string (opt=bla)",
-               "string (opt=bla)",
-               "string with possible k/m/g postfix (opt=4k)",
-               "string with time postfix (opt=10s)",
-               "string (opt=bla)",
-               "string with dual range (opt=1k-4k,4k-8k)",
-               "integer value (opt=100)",
-               "boolean value (opt=1)",
-               "list of floating point values separated by ':' (opt=5.9:7.8)",
-               "no argument (opt)",
-               "deprecated",
-               "unsupported",
+               [FIO_OPT_INVALID]         = "invalid",
+               [FIO_OPT_STR]             = "string (opt=bla)",
+               [FIO_OPT_STR_ULL]         = "string (opt=bla)",
+               [FIO_OPT_STR_MULTI]       = "string with possible k/m/g postfix (opt=4k)",
+               [FIO_OPT_STR_VAL]         = "string (opt=bla)",
+               [FIO_OPT_STR_VAL_TIME]    = "string with time postfix (opt=10s)",
+               [FIO_OPT_STR_STORE]       = "string (opt=bla)",
+               [FIO_OPT_RANGE]           = "one to three ranges (opt=1k-4k[,4k-8k[,1k-8k]])",
+               [FIO_OPT_INT]             = "integer value (opt=100)",
+               [FIO_OPT_ULL]             = "integer value (opt=100)",
+               [FIO_OPT_BOOL]            = "boolean value (opt=1)",
+               [FIO_OPT_FLOAT_LIST]      = "list of floating point values separated by ':' (opt=5.9:7.8)",
+               [FIO_OPT_STR_SET]         = "empty or boolean value ([0|1])",
+               [FIO_OPT_DEPRECATED]      = "deprecated",
+               [FIO_OPT_SOFT_DEPRECATED] = "deprecated",
+               [FIO_OPT_UNSUPPORTED]     = "unsupported",
        };
        ssize_t (*logger)(const char *format, ...);
 
@@ -503,6 +506,33 @@ static const char *opt_type_name(const struct fio_option *o)
        return "OPT_UNKNOWN?";
 }
 
+static bool val_too_large(const struct fio_option *o, unsigned long long val,
+                         bool is_uint)
+{
+       if (!o->maxval)
+               return false;
+
+       if (is_uint) {
+               if ((int) val < 0)
+                       return (int) val > (int) o->maxval;
+               return (unsigned int) val > o->maxval;
+       }
+
+       return val > o->maxval;
+}
+
+static bool val_too_small(const struct fio_option *o, unsigned long long val,
+                         bool is_uint)
+{
+       if (!o->minval)
+               return false;
+
+       if (is_uint)
+               return (int) val < o->minval;
+
+       return val < o->minval;
+}
+
 static int __handle_option(const struct fio_option *o, const char *ptr,
                           void *data, int first, int more, int curr)
 {
@@ -592,14 +622,14 @@ static int __handle_option(const struct fio_option *o, const char *ptr,
                        return 1;
                }
 
-               if (o->maxval && ull > o->maxval) {
-                       log_err("max value out of range: %llu"
-                                       " (%llu max)\n", ull, o->maxval);
+               if (val_too_large(o, ull, o->type == FIO_OPT_INT)) {
+                       log_err("%s: max value out of range: %llu"
+                               " (%llu max)\n", o->name, ull, o->maxval);
                        return 1;
                }
-               if (o->minval && ull < o->minval) {
-                       log_err("min value out of range: %lld"
-                                       " (%d min)\n", ull, o->minval);
+               if (val_too_small(o, ull, o->type == FIO_OPT_INT)) {
+                       log_err("%s: min value out of range: %lld"
+                               " (%d min)\n", o->name, ull, o->minval);
                        return 1;
                }
                if (o->posval[0].ival) {
@@ -959,6 +989,7 @@ static int handle_option(const struct fio_option *o, const char *__ptr,
                if (ptr &&
                    (o->type != FIO_OPT_STR_STORE) &&
                    (o->type != FIO_OPT_STR) &&
+                   (o->type != FIO_OPT_STR_ULL) &&
                    (o->type != FIO_OPT_FLOAT_LIST)) {
                        ptr2 = strchr(ptr, ',');
                        if (ptr2 && *(ptr2 + 1) == '\0')
@@ -1372,9 +1403,6 @@ static void option_init(struct fio_option *o)
                o->category = FIO_OPT_C_GENERAL;
                o->group = FIO_OPT_G_INVALID;
        }
-       if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE ||
-           o->type == FIO_OPT_STR_MULTI)
-               return;
 }
 
 /*