Ensure that fio_get_kb_base() doesn't assume 'data' is thread_options
[fio.git] / options.c
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;