From: Jens Axboe Date: Thu, 4 Mar 2010 12:49:11 +0000 (+0100) Subject: Add parser support for out-of-td option storage X-Git-Tag: fio-1.38~39 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=02c6aad501477833c7e017eec0bb14f8e6957b68 Add parser support for out-of-td option storage Currently the parser assumes the storage is inside a thread_data structure. Signed-off-by: Jens Axboe --- diff --git a/parse.c b/parse.c index 13a27cc8..2cdac540 100644 --- a/parse.c +++ b/parse.c @@ -327,9 +327,13 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, ret = 1; if (!strncmp(vp->ival, ptr, strlen(vp->ival))) { ret = 0; - if (!o->off1) - break; - val_store(ilp, vp->oval, o->off1, data); + if (o->roff1) + *(unsigned int *) o->roff1 = vp->oval; + else { + if (!o->off1) + break; + val_store(ilp, vp->oval, o->off1, data); + } break; } } @@ -369,15 +373,31 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, ret = fn(data, &ull); else { if (o->type == FIO_OPT_INT) { - if (first) - val_store(ilp, ull, o->off1, data); - if (!more && o->off2) - val_store(ilp, ull, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned long long *) o->roff1 = ull; + else + val_store(ilp, ull, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned long long *) o->roff2 = ull; + else if (o->off2) + val_store(ilp, ull, o->off2, data); + } } else { - if (first) - val_store(ullp, ull, o->off1, data); - if (!more && o->off2) - val_store(ullp, ull, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned long long *) o->roff1 = ull; + else + val_store(ullp, ull, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned long long *) o->roff2 = ull; + else if (o->off2) + val_store(ullp, ull, o->off2, data); + } } } break; @@ -385,7 +405,11 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, case FIO_OPT_STR_STORE: { fio_opt_str_fn *fn = o->cb; - cp = td_var(data, o->off1); + if (o->roff1) + cp = (char **) o->roff1; + else + cp = td_var(data, o->off1); + *cp = strdup(ptr); if (fn) { ret = fn(data, ptr); @@ -427,10 +451,19 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, } if (first) { - val_store(ilp, ul1, o->off1, data); - val_store(ilp, ul2, o->off2, data); + if (o->roff1) + *(unsigned long *) o->roff1 = ul1; + else + val_store(ilp, ul1, o->off1, data); + if (o->roff2) + *(unsigned long *) o->roff2 = ul2; + else + val_store(ilp, ul2, o->off2, data); } - if (o->off3 && o->off4) { + if (o->roff3 && o->roff4) { + *(unsigned long *) o->roff3 = ul1; + *(unsigned long *) o->roff4 = ul2; + } else if (o->off3 && o->off4) { val_store(ilp, ul1, o->off3, data); val_store(ilp, ul2, o->off4, data); } @@ -462,10 +495,18 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (fn) ret = fn(data, &il); else { - if (first) - val_store(ilp, il, o->off1, data); - if (!more && o->off2) - val_store(ilp, il, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned int *)o->roff1 = il; + else + val_store(ilp, il, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned int *) o->roff2 = il; + else if (o->off2) + val_store(ilp, il, o->off2, data); + } } break; } @@ -475,10 +516,18 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (fn) ret = fn(data); else { - if (first) - val_store(ilp, 1, o->off1, data); - if (!more && o->off2) - val_store(ilp, 1, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned int *) o->roff1 = 1; + else + val_store(ilp, 1, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned int *) o->roff2 = 1; + else if (o->off2) + val_store(ilp, 1, o->off2, data); + } } break; } diff --git a/parse.h b/parse.h index 085de1a5..95d99f56 100644 --- a/parse.h +++ b/parse.h @@ -41,6 +41,7 @@ struct fio_option { unsigned int off2; unsigned int off3; unsigned int off4; + void *roff1, *roff2, *roff3, *roff4; unsigned int maxval; /* max and min value */ int minval; int neg; /* negate value stored */