X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=diskutil.c;h=bbaa22d56b2a7cab19960c94349e02e385e5af0c;hp=399aced467e0c855884b3c1ea4d7c09752d1f97d;hb=fdf287440fa8486f0e96c8597349d5d25e98fb6a;hpb=9f8f2064bcb196c10c9d3a2b64b951d796af22b5 diff --git a/diskutil.c b/diskutil.c index 399aced4..bbaa22d5 100644 --- a/diskutil.c +++ b/diskutil.c @@ -79,7 +79,7 @@ void update_io_ticks(void) } } -static int disk_util_exists(int major, int minor) +static struct disk_util *disk_util_exists(int major, int minor) { struct list_head *entry; struct disk_util *du; @@ -88,10 +88,10 @@ static int disk_util_exists(int major, int minor) du = list_entry(entry, struct disk_util, list); if (major == du->major && minor == du->minor) - return 1; + return du; } - return 0; + return NULL; } static void disk_util_add(int majdev, int mindev, char *path) @@ -104,6 +104,7 @@ static void disk_util_add(int majdev, int mindev, char *path) INIT_LIST_HEAD(&du->list); sprintf(du->path, "%s/stat", path); du->name = strdup(basename(path)); + du->sysfs_root = path; du->major = majdev; du->minor = mindev; @@ -204,18 +205,22 @@ static void __init_disk_util(struct thread_data *td, struct fio_file *f) { struct stat st; char foo[PATH_MAX], tmp[PATH_MAX]; + struct disk_util *du; int mindev, majdev; char *p; - if (!stat(f->file_name, &st)) { + if (!lstat(f->file_name, &st)) { if (S_ISBLK(st.st_mode)) { majdev = major(st.st_rdev); mindev = minor(st.st_rdev); } else if (S_ISCHR(st.st_mode)) { majdev = major(st.st_rdev); mindev = minor(st.st_rdev); - fio_lookup_raw(st.st_rdev, &majdev, &mindev); - } else { + if (fio_lookup_raw(st.st_rdev, &majdev, &mindev)) + return; + } else if (S_ISFIFO(st.st_mode)) + return; + else { majdev = major(st.st_dev); mindev = minor(st.st_dev); } @@ -234,8 +239,13 @@ static void __init_disk_util(struct thread_data *td, struct fio_file *f) mindev = minor(st.st_dev); } - if (disk_util_exists(majdev, mindev)) + du = disk_util_exists(majdev, mindev); + if (du) { + if (td->o.ioscheduler && !td->sysfs_root) + td->sysfs_root = strdup(du->sysfs_root); + return; + } /* * for an fs without a device, we will repeatedly stat through @@ -303,6 +313,9 @@ void show_disk_util(void) struct disk_util *du; double util; + if (list_empty(&disk_list)) + return; + log_info("\nDisk stats (read/write):\n"); list_for_each(entry, &disk_list) {