diskutil: ensure we have enough room to not write past end
[fio.git] / diskutil.c
index a1077d4001459a159c37076478fa4e04f882ecc8..9767ea255c882a66511954472a2a9f70f56c5d41 100644 (file)
@@ -18,8 +18,6 @@ static struct disk_util *last_du;
 
 static struct fio_mutex *disk_util_mutex;
 
-FLIST_HEAD(disk_list);
-
 static struct disk_util *__init_per_file_disk_util(struct thread_data *td,
                int majdev, int mindev, char *path);
 
@@ -37,6 +35,7 @@ static void disk_util_free(struct disk_util *du)
        }
 
        fio_mutex_remove(du->lock);
+       free(du->sysfs_root);
        sfree(du);
 }
 
@@ -292,10 +291,8 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev,
        dprint(FD_DISKUTIL, "add maj/min %d/%d: %s\n", majdev, mindev, path);
 
        du = smalloc(sizeof(*du));
-       if (!du) {
-               log_err("fio: smalloc() pool exhausted\n");
+       if (!du)
                return NULL;
-       }
 
        memset(du, 0, sizeof(*du));
        INIT_FLIST_HEAD(&du->list);
@@ -307,7 +304,7 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev,
                return NULL;
        }
        strncpy((char *) du->dus.name, basename(path), FIO_DU_NAME_SZ - 1);
-       du->sysfs_root = path;
+       du->sysfs_root = strdup(path);
        du->major = majdev;
        du->minor = mindev;
        INIT_FLIST_HEAD(&du->slavelist);
@@ -366,7 +363,7 @@ static int find_block_dir(int majdev, int mindev, char *path, int link_ok)
                return 0;
 
        while ((dir = readdir(D)) != NULL) {
-               char full_path[256];
+               char full_path[257];
 
                if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
                        continue;
@@ -432,9 +429,6 @@ static struct disk_util *__init_per_file_disk_util(struct thread_data *td,
                sprintf(path, "%s", tmp);
        }
 
-       if (td->o.ioscheduler && !td->sysfs_root)
-               td->sysfs_root = strdup(path);
-
        return disk_util_add(td, majdev, mindev, path);
 }
 
@@ -453,12 +447,8 @@ static struct disk_util *init_per_file_disk_util(struct thread_data *td,
                        mindev);
 
        du = disk_util_exists(majdev, mindev);
-       if (du) {
-               if (td->o.ioscheduler && !td->sysfs_root)
-                       td->sysfs_root = strdup(du->sysfs_root);
-
+       if (du)
                return du;
-       }
 
        /*
         * for an fs without a device, we will repeatedly stat through
@@ -491,7 +481,7 @@ void init_disk_util(struct thread_data *td)
        unsigned int i;
 
        if (!td->o.do_disk_util ||
-           (td->io_ops->flags & (FIO_DISKLESSIO | FIO_NODISKUTIL)))
+           td_ioengine_flagged(td, FIO_DISKLESSIO | FIO_NODISKUTIL))
                return;
 
        for_each_file(td, f, i)