X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=b90d12ae8f17aefb4aeb11c1dac3a45b697c9546;hp=ec5d781ed0dea0e8c98c5a05289340969123e4c5;hb=4ccdccd149d82c94ec6ccdb4118d9e27479b8516;hpb=2e3bd4c21cc239fbda992a4ede89ebb85f550920 diff --git a/filesetup.c b/filesetup.c index ec5d781e..b90d12ae 100644 --- a/filesetup.c +++ b/filesetup.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -259,6 +260,41 @@ err: return 1; } +static int char_size(struct thread_data *td, struct fio_file *f) +{ +#ifdef FIO_HAVE_CHARDEV_SIZE + unsigned long long bytes; + int r; + + if (td->io_ops->open_file(td, f)) { + log_err("fio: failed opening blockdev %s for size check\n", + f->file_name); + return 1; + } + + r = chardev_size(f->fd, &bytes); + if (r) { + td_verror(td, r, "chardev_size"); + goto err; + } + + if (!bytes) { + log_err("%s: zero sized char device?\n", f->file_name); + goto err; + } + + f->real_file_size = bytes; + td->io_ops->close_file(td, f); + return 0; +err: + td->io_ops->close_file(td, f); + return 1; +#else + f->real_file_size = -1ULL; + return 0; +#endif +} + static int get_file_size(struct thread_data *td, struct fio_file *f) { int ret = 0; @@ -270,6 +306,8 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) ret = file_size(td, f); else if (f->filetype == FIO_TYPE_BD) ret = bdev_size(td, f); + else if (f->filetype == FIO_TYPE_CHAR) + ret = char_size(td, f); else f->real_file_size = -1; @@ -516,7 +554,7 @@ struct fio_mount { static unsigned long long get_fs_free_counts(struct thread_data *td) { struct flist_head *n, *tmp; - unsigned long long ret; + unsigned long long ret = 0; struct fio_mount *fm; FLIST_HEAD(list); struct fio_file *f; @@ -526,6 +564,13 @@ static unsigned long long get_fs_free_counts(struct thread_data *td) struct stat sb; char buf[256]; + if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) { + if (f->real_file_size != -1ULL) + ret += f->real_file_size; + continue; + } else if (f->filetype != FIO_TYPE_FILE) + continue; + strcpy(buf, f->file_name); if (stat(buf, &sb) < 0) { @@ -555,7 +600,6 @@ static unsigned long long get_fs_free_counts(struct thread_data *td) flist_add(&fm->list, &list); } - ret = 0; flist_for_each_safe(n, tmp, &list) { unsigned long long sz;