fio: fix dlopen refcounting of dynamic engines
[fio.git] / init.c
diff --git a/init.c b/init.c
index c3442849c0900a89ee1e26260682bb5642384989..d6dbaf7cb437d894ab990fa4531bd44ef05872c7 100644 (file)
--- a/init.c
+++ b/init.c
@@ -45,7 +45,6 @@ const char fio_version_string[] = FIO_VERSION;
 #define FIO_RANDSEED           (0xb1899bedUL)
 
 static char **ini_file;
-static int max_jobs = FIO_MAX_JOBS;
 static bool dump_cmdline;
 static bool parse_only;
 static bool merge_blktrace_only;
@@ -328,6 +327,7 @@ void free_threads_shm(void)
 
 static void free_shm(void)
 {
+#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
        if (nr_segments) {
                flow_exit();
                fio_debug_jobp = NULL;
@@ -344,6 +344,7 @@ static void free_shm(void)
        fio_filelock_exit();
        file_hash_exit();
        scleanup();
+#endif
 }
 
 static int add_thread_segment(void)
@@ -352,8 +353,10 @@ static int add_thread_segment(void)
        size_t size = JOBS_PER_SEG * sizeof(struct thread_data);
        int i;
 
-       if (nr_segments + 1 >= REAL_MAX_SEG)
+       if (nr_segments + 1 >= REAL_MAX_SEG) {
+               log_err("error: maximum number of jobs reached.\n");
                return -1;
+       }
 
        size += 2 * sizeof(unsigned int);
 
@@ -494,11 +497,6 @@ static struct thread_data *get_new_job(bool global, struct thread_data *parent,
                log_err("error: failed to setup shm segment\n");
                return NULL;
        }
-       if (thread_number >= max_jobs) {
-               log_err("error: maximum number of jobs (%d) reached.\n",
-                               max_jobs);
-               return NULL;
-       }
 
        seg = &segments[cur_segment];
        td = &seg->threads[seg->nr_threads++];
@@ -975,13 +973,13 @@ static void init_rand_file_service(struct thread_data *td)
        const unsigned int seed = td->rand_seeds[FIO_RAND_FILE_OFF];
 
        if (td->o.file_service_type == FIO_FSERVICE_ZIPF) {
-               zipf_init(&td->next_file_zipf, nranges, td->zipf_theta, seed);
+               zipf_init(&td->next_file_zipf, nranges, td->zipf_theta, td->random_center, seed);
                zipf_disable_hash(&td->next_file_zipf);
        } else if (td->o.file_service_type == FIO_FSERVICE_PARETO) {
-               pareto_init(&td->next_file_zipf, nranges, td->pareto_h, seed);
+               pareto_init(&td->next_file_zipf, nranges, td->pareto_h, td->random_center, seed);
                zipf_disable_hash(&td->next_file_zipf);
        } else if (td->o.file_service_type == FIO_FSERVICE_GAUSS) {
-               gauss_init(&td->next_file_gauss, nranges, td->gauss_dev, seed);
+               gauss_init(&td->next_file_gauss, nranges, td->gauss_dev, td->random_center, seed);
                gauss_disable_hash(&td->next_file_gauss);
        }
 }
@@ -1106,18 +1104,15 @@ int ioengine_load(struct thread_data *td)
                 * for this name and see if they match. If they do, then
                 * the engine is unchanged.
                 */
-               dlhandle = td->io_ops_dlhandle;
+               dlhandle = td->io_ops->dlhandle;
                ops = load_ioengine(td);
                if (!ops)
                        goto fail;
 
-               if (ops == td->io_ops && dlhandle == td->io_ops_dlhandle) {
-                       if (dlhandle)
-                               dlclose(dlhandle);
+               if (ops == td->io_ops && dlhandle == td->io_ops->dlhandle)
                        return 0;
-               }
 
-               if (dlhandle && dlhandle != td->io_ops_dlhandle)
+               if (dlhandle && dlhandle != td->io_ops->dlhandle)
                        dlclose(dlhandle);
 
                /* Unload the old engine. */
@@ -2741,12 +2736,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        warnings_fatal = 1;
                        break;
                case 'j':
-                       max_jobs = atoi(optarg);
-                       if (!max_jobs || max_jobs > REAL_MAX_JOBS) {
-                               log_err("fio: invalid max jobs: %d\n", max_jobs);
-                               do_exit++;
-                               exit_val = 1;
-                       }
+                       /* we don't track/need this anymore, ignore it */
                        break;
                case 'S':
                        did_arg = true;