From: Jens Axboe Date: Fri, 3 Nov 2006 07:17:09 +0000 (+0100) Subject: [PATCH] Fix int vs long problems in parsing some options X-Git-Tag: fio-1.8~9 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=75e6f36fae06978f29296fce76a7f00ca0df7b56 [PATCH] Fix int vs long problems in parsing some options The type needs to match strictly, or we get into problems on big endian architectures. Signed-off-by: Jens Axboe --- diff --git a/init.c b/init.c index 616c51f2..689c495b 100644 --- a/init.c +++ b/init.c @@ -138,17 +138,17 @@ static struct fio_option options[] = { }, { .name = "bs", - .type = FIO_OPT_STR_VAL, + .type = FIO_OPT_STR_VAL_INT, .off1 = td_var_offset(bs[DDIR_READ]), }, { .name = "read_bs", - .type = FIO_OPT_STR_VAL, + .type = FIO_OPT_STR_VAL_INT, .off1 = td_var_offset(bs[DDIR_READ]), }, { .name = "write_bs", - .type = FIO_OPT_STR_VAL, + .type = FIO_OPT_STR_VAL_INT, .off1 = td_var_offset(bs[DDIR_WRITE]), }, { @@ -513,9 +513,9 @@ static void fixup_options(struct thread_data *td) if (!td->max_bs[DDIR_READ]) td->max_bs[DDIR_READ] = td->bs[DDIR_READ]; if (!td->min_bs[DDIR_WRITE]) - td->min_bs[DDIR_WRITE]= td->bs[DDIR_READ]; + td->min_bs[DDIR_WRITE]= td->bs[DDIR_WRITE]; if (!td->max_bs[DDIR_WRITE]) - td->max_bs[DDIR_WRITE] = td->bs[DDIR_READ]; + td->max_bs[DDIR_WRITE] = td->bs[DDIR_WRITE]; td->rw_min_bs = min(td->min_bs[DDIR_READ], td->min_bs[DDIR_WRITE]); diff --git a/parse.c b/parse.c index 9f2ee0d6..f37878f1 100644 --- a/parse.c +++ b/parse.c @@ -133,9 +133,9 @@ static struct fio_option *find_option(struct fio_option *options, static int handle_option(struct fio_option *o, const char *ptr, void *data) { - unsigned int il, *ilp; + unsigned int il, *ilp1, *ilp2; unsigned long long ull, *ullp; - unsigned long ul1, ul2, *ulp1, *ulp2; + unsigned long ul1, ul2; char **cp; int ret = 0, is_time = 0; @@ -148,7 +148,8 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data) } case FIO_OPT_STR_VAL_TIME: is_time = 1; - case FIO_OPT_STR_VAL: { + case FIO_OPT_STR_VAL: + case FIO_OPT_STR_VAL_INT: { fio_opt_str_val_fn *fn = o->cb; if (is_time) @@ -165,8 +166,13 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data) if (fn) ret = fn(data, &ull); else { - ullp = td_var(data, o->off1); - *ullp = ull; + if (o->type == FIO_OPT_STR_VAL_INT) { + ilp1 = td_var(data, o->off1); + *ilp1 = ull; + } else { + ullp = td_var(data, o->off1); + *ullp = ull; + } } break; } @@ -193,14 +199,14 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data) ret = 1; if (!check_range_bytes(p1, &ul1) && !check_range_bytes(p2, &ul2)) { ret = 0; - ulp1 = td_var(data, o->off1); - ulp2 = td_var(data, o->off2); + ilp1 = td_var(data, o->off1); + ilp2 = td_var(data, o->off2); if (ul1 > ul2) { - *ulp1 = ul2; - *ulp2 = ul1; + *ilp1 = ul2; + *ilp2 = ul1; } else { - *ulp2 = ul2; - *ulp1 = ul1; + *ilp2 = ul2; + *ilp1 = ul1; } } @@ -219,8 +225,8 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data) if (fn) ret = fn(data, &il); else { - ilp = td_var(data, o->off1); - *ilp = il; + ilp1 = td_var(data, o->off1); + *ilp1 = il; } break; } @@ -230,8 +236,8 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data) if (fn) ret = fn(data); else { - ilp = td_var(data, o->off1); - *ilp = 1; + ilp1 = td_var(data, o->off1); + *ilp1 = 1; } break; } diff --git a/parse.h b/parse.h index be3d24ac..563712ee 100644 --- a/parse.h +++ b/parse.h @@ -7,6 +7,7 @@ enum fio_opt_type { FIO_OPT_STR = 0, FIO_OPT_STR_VAL, + FIO_OPT_STR_VAL_INT, FIO_OPT_STR_VAL_TIME, FIO_OPT_STR_STORE, FIO_OPT_RANGE,