[PATCH] fsx example
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 718a8ab2acc1ee65618f132c3efabb9dc6ce7aef..0ae19b282026782e09a8298f1363d4c448a24bf1 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -189,7 +189,7 @@ void init_disk_util(struct thread_data *td)
 {
        struct fio_file *f;
        struct stat st;
-       char foo[256], tmp[256];
+       char foo[PATH_MAX], tmp[PATH_MAX];
        dev_t dev;
        char *p;
 
@@ -209,7 +209,7 @@ void init_disk_util(struct thread_data *td)
                /*
                 * must be a file, open "." in that path
                 */
-               strcpy(foo, f->file_name);
+               strncpy(foo, f->file_name, PATH_MAX - 1);
                p = dirname(foo);
                if (stat(p, &st)) {
                        perror("disk util stat");
@@ -239,11 +239,13 @@ void init_disk_util(struct thread_data *td)
                        log_err("unknown sysfs layout\n");
                        return;
                }
-               strcpy(tmp, p);
+               strncpy(tmp, p, PATH_MAX - 1);
                sprintf(foo, "%s", tmp);
        }
 
-       td->sysfs_root = strdup(foo);
+       if (td->ioscheduler)
+               td->sysfs_root = strdup(foo);
+
        disk_util_add(dev, foo);
 }
 
@@ -300,7 +302,7 @@ static void show_group_stats(struct group_run_stats *rs, int id)
 static void show_disk_util(void)
 {
        struct disk_util_stat *dus;
-       struct list_head *entry;
+       struct list_head *entry, *next;
        struct disk_util *du;
        double util;
 
@@ -316,6 +318,16 @@ static void show_disk_util(void)
 
                fprintf(f_out, "  %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, in_queue=%u, util=%3.2f%%\n", du->name, dus->ios[0], dus->ios[1], dus->merges[0], dus->merges[1], dus->ticks[0], dus->ticks[1], dus->time_in_queue, util);
        }
+
+       /*
+        * now free the list
+        */
+       list_for_each_safe(entry, next, &disk_list) {
+               list_del(entry);
+               du = list_entry(entry, struct disk_util, list);
+               free(du->name);
+               free(du);
+       }
 }
 
 static void show_ddir_status(struct thread_data *td, struct group_run_stats *rs,
@@ -514,6 +526,8 @@ void show_run_stats(void)
 
                show_disk_util();
        }
+
+       free(runstats);
 }
 
 static inline void add_stat_sample(struct io_stat *is, unsigned long val)