X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=5a8105a6032e24b2e45a8a9d028c2a0b7e2552fe;hp=ec5d781ed0dea0e8c98c5a05289340969123e4c5;hb=ef5249d5e5f0bb5f0adfb182b1dbc988aee976de;hpb=2e3bd4c21cc239fbda992a4ede89ebb85f550920 diff --git a/filesetup.c b/filesetup.c index ec5d781e..5a8105a6 100644 --- a/filesetup.c +++ b/filesetup.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -70,9 +71,9 @@ static int extend_file(struct thread_data *td, struct fio_file *f) f->real_file_size); r = posix_fallocate(f->fd, 0, f->real_file_size); - if (r < 0) { + if (r > 0) { log_err("fio: posix_fallocate fails: %s\n", - strerror(-r)); + strerror(r)); } } #endif @@ -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; @@ -865,6 +909,7 @@ int add_file(struct thread_data *td, const char *fname) } f->fd = -1; + fio_file_reset(f); if (td->files_size <= td->files_index) { int new_size = td->o.nr_files + 1; @@ -918,6 +963,19 @@ int add_file(struct thread_data *td, const char *fname) return cur_files; } +int add_file_exclusive(struct thread_data *td, const char *fname) +{ + struct fio_file *f; + unsigned int i; + + for_each_file(td, f, i) { + if (!strcmp(f->file_name, fname)) + return i; + } + + return add_file(td, fname); +} + void get_file(struct fio_file *f) { dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); @@ -1092,6 +1150,7 @@ void dup_files(struct thread_data *td, struct thread_data *org) assert(0); } __f->fd = -1; + fio_file_reset(__f); if (f->file_name) { __f->file_name = smalloc_strdup(f->file_name);