Add parser support for out-of-td option storage
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 4bbab5af9a12e9c0d00fa559bdddb94107b42f77..778749d6a3322411a7affc06f945ee2c3a4a2aff 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -61,6 +61,8 @@ static volatile int fio_abort;
 static int exit_value;
 static struct itimerval itimer;
 static pthread_t gtod_thread;
+static struct flist_head *cgroup_list;
+static char *cgroup_mnt;
 
 struct io_log *agg_io_log[2];
 
@@ -132,7 +134,7 @@ static void sig_quit(int sig)
 static void sig_int(int sig)
 {
        if (threads) {
-               printf("\nfio: terminating on signal %d\n", sig);
+               log_info("\nfio: terminating on signal %d\n", sig);
                fflush(stdout);
                terminate_threads(TERMINATE_ALL);
        }
@@ -1039,6 +1041,15 @@ static void *thread_main(void *data)
         */
        fio_mutex_remove(td->mutex);
 
+       if (td->o.uid != -1U && setuid(td->o.uid)) {
+               td_verror(td, errno, "setuid");
+               goto err;
+       }
+       if (td->o.gid != -1U && setgid(td->o.gid)) {
+               td_verror(td, errno, "setgid");
+               goto err;
+       }
+
        /*
         * May alter parameters that init_io_u() will use, so we need to
         * do this first.
@@ -1076,7 +1087,7 @@ static void *thread_main(void *data)
                }
        }
 
-       if (td->o.cgroup_weight && cgroup_setup(td))
+       if (td->o.cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
                goto err;
 
        if (nice(td->o.nice) == -1) {
@@ -1199,7 +1210,7 @@ static void *thread_main(void *data)
 
 err:
        if (td->error)
-               printf("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
+               log_info("fio: pid=%d, err=%d/%s\n", (int) td->pid, td->error,
                                                        td->verror);
 
        if (td->o.verify_async)
@@ -1208,7 +1219,7 @@ err:
        close_and_free_files(td);
        close_ioengine(td);
        cleanup_io_u(td);
-       cgroup_shutdown(td);
+       cgroup_shutdown(td, &cgroup_mnt);
 
        if (td->o.cpumask_set) {
                int ret = fio_cpuset_exit(&td->o.cpumask);
@@ -1401,17 +1412,17 @@ static void run_threads(void)
                return;
 
        if (!terse_output) {
-               printf("Starting ");
+               log_info("Starting ");
                if (nr_thread)
-                       printf("%d thread%s", nr_thread,
+                       log_info("%d thread%s", nr_thread,
                                                nr_thread > 1 ? "s" : "");
                if (nr_process) {
                        if (nr_thread)
                                printf(" and ");
-                       printf("%d process%s", nr_process,
+                       log_info("%d process%s", nr_process,
                                                nr_process > 1 ? "es" : "");
                }
-               printf("\n");
+               log_info("\n");
                fflush(stdout);
        }
 
@@ -1657,6 +1668,9 @@ int main(int argc, char *argv[])
 
        status_timer_arm();
 
+       cgroup_list = smalloc(sizeof(*cgroup_list));
+       INIT_FLIST_HEAD(cgroup_list);
+
        run_threads();
 
        if (!fio_abort) {
@@ -1668,6 +1682,11 @@ int main(int argc, char *argv[])
                }
        }
 
+       cgroup_kill(cgroup_list);
+       sfree(cgroup_list);
+       if (cgroup_mnt)
+               sfree(cgroup_mnt);
+
        fio_mutex_remove(startup_mutex);
        fio_mutex_remove(writeout_mutex);
        return exit_value;