Ensure that fio_get_kb_base() doesn't assume 'data' is thread_options
authorJens Axboe <axboe@fb.com>
Tue, 25 Feb 2014 19:35:27 +0000 (11:35 -0800)
committerJens Axboe <axboe@fb.com>
Tue, 25 Feb 2014 19:35:27 +0000 (11:35 -0800)
Nasty hack, but at least we don't corrupt option data.

Signed-off-by: Jens Axboe <axboe@fb.com>
options.c
thread_options.h

index 535598297de43c32c8c07231b3407c016d83a698..625d3a25d51fb237dd89aefc6e3a742f8da0dca1 100644 (file)
--- a/options.c
+++ b/options.c
@@ -3790,6 +3790,7 @@ int fio_cmd_ioengine_option_parse(struct thread_data *td, const char *opt,
 
 void fio_fill_default_options(struct thread_data *td)
 {
+       td->o.magic = OPT_MAGIC;
        fill_default_options(td, fio_options);
 }
 
@@ -3834,7 +3835,16 @@ unsigned int fio_get_kb_base(void *data)
        struct thread_options *o = data;
        unsigned int kb_base = 0;
 
-       if (o)
+       /*
+        * This is a hack... For private options, *data is not holding
+        * a pointer to the thread_options, but to private data. This means
+        * we can't safely dereference it, but magic is first so mem wise
+        * it is valid. But this also means that if the job first sets
+        * kb_base and expects that to be honored by private options,
+        * it will be disappointed. We will return the global default
+        * for this.
+        */
+       if (o && o->magic == OPT_MAGIC)
                kb_base = o->kb_base;
        if (!kb_base)
                kb_base = 1024;
index b7a88ed358f14f73e9933f859a5837c6362bdded..14a4e54abcc757a68abe701a60c99a03756459fd 100644 (file)
@@ -28,8 +28,10 @@ struct bssplit {
        uint32_t perc;
 };
 
+#define OPT_MAGIC      0x4f50544e
+
 struct thread_options {
-       int pad;
+       int magic;
        char *description;
        char *name;
        char *directory;