X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=bd975d82470ce4dc7bedb82a5f1cbd151e5574c1;hp=40a16638f9ea798a9e4b5c0c97c37ee5e691da15;hb=07eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3;hpb=541d66d70b8fbe9860b31307c0760e6d5f4c78a8 diff --git a/filesetup.c b/filesetup.c index 40a16638..bd975d82 100644 --- a/filesetup.c +++ b/filesetup.c @@ -8,11 +8,10 @@ #include #include "fio.h" -#include "os.h" static int extend_file(struct thread_data *td, struct fio_file *f) { - int r, new_layout = 0, flags; + int r, new_layout = 0, unlink_file = 0, flags; unsigned long long left; unsigned int bs; char *b; @@ -24,8 +23,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f) */ if (td_read(td) || (td_write(td) && td->o.overwrite)) new_layout = 1; + if (td_write(td) && !td->o.overwrite) + unlink_file = 1; - if (new_layout && (f->flags & FIO_FILE_EXISTS)) { + if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) { if (unlink(f->file_name) < 0) { td_verror(td, errno, "unlink"); return 1; @@ -47,14 +48,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f) goto err; } + if (!new_layout) + goto done; + if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) { td_verror(td, errno, "posix_fallocate"); goto err; } - if (!new_layout) - goto done; - b = malloc(td->o.max_bs[DDIR_WRITE]); memset(b, 0, td->o.max_bs[DDIR_WRITE]); @@ -138,6 +139,9 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) { int ret = 0; + if (f->flags & FIO_SIZE_KNOWN) + return 0; + if (f->filetype == FIO_TYPE_FILE) ret = file_size(td, f); else if (f->filetype == FIO_TYPE_BD) @@ -153,6 +157,7 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) return 1; } + f->flags |= FIO_SIZE_KNOWN; return 0; } @@ -270,17 +275,29 @@ int open_files(struct thread_data *td) /* * open/close all files, so that ->real_file_size gets set */ -static void get_file_sizes(struct thread_data *td) +static int get_file_sizes(struct thread_data *td) { struct fio_file *f; unsigned int i; + int err = 0; for_each_file(td, f, i) { - if (td->io_ops->open_file(td, f)) + if (td->io_ops->open_file(td, f)) { + if (td->error != ENOENT) { + log_err("%s\n", td->verror); + err = 1; + } clear_error(td); - else - td->io_ops->close_file(td, f); + } else { + if (td->io_ops->close_file) + td->io_ops->close_file(td, f); + } + + if (f->real_file_size == -1ULL && td->o.size) + f->real_file_size = td->o.size / td->o.nr_files; } + + return err; } /* @@ -301,7 +318,7 @@ int setup_files(struct thread_data *td) if (td->io_ops->setup) err = td->io_ops->setup(td); else - get_file_sizes(td); + err = get_file_sizes(td); if (err) return err; @@ -321,7 +338,7 @@ int setup_files(struct thread_data *td) /* * device/file sizes are zero and no size given, punt */ - if (!total_size && !td->o.size) { + if ((!total_size || total_size == -1ULL) && !td->o.size) { log_err("%s: you need to specify size=\n", td->o.name); td_verror(td, EINVAL, "total_file_size"); return 1; @@ -386,6 +403,7 @@ int setup_files(struct thread_data *td) if (!(f->flags & FIO_FILE_EXTEND)) continue; + assert(f->filetype == FIO_TYPE_FILE); f->flags &= ~FIO_FILE_EXTEND; f->real_file_size = f->io_size; err = extend_file(td, f); @@ -483,6 +501,12 @@ void add_file(struct thread_data *td, const char *fname) memset(f, 0, sizeof(*f)); f->fd = -1; + /* + * init function, io engine may not be loaded yet + */ + if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) + f->real_file_size = -1ULL; + if (td->o.directory) len = sprintf(file_name, "%s/", td->o.directory); @@ -515,6 +539,7 @@ void put_file(struct thread_data *td, struct fio_file *f) if (td->io_ops->close_file) td->io_ops->close_file(td, f); + td->nr_open_files--; f->flags &= ~FIO_FILE_OPEN; }