X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=04d7b987085f00eb2e195e8a469d39adffede7b4;hp=a52dae0f64cc270e9605b24475e87f11c228f918;hb=77787c82d755cc8ab8fda82531dd648cfd127d8d;hpb=c48c0be79173897824d8f439c39374f2588931dc diff --git a/filesetup.c b/filesetup.c index a52dae0f..04d7b987 100644 --- a/filesetup.c +++ b/filesetup.c @@ -136,7 +136,7 @@ static int file_size(struct thread_data *td, struct fio_file *f) { struct stat st; - if (fstat(f->fd, &st) == -1) { + if (stat(f->file_name, &st) == -1) { td_verror(td, errno, "fstat"); return 1; } @@ -150,14 +150,28 @@ static int bdev_size(struct thread_data *td, struct fio_file *f) 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 = blockdev_size(f->fd, &bytes); if (r) { td_verror(td, r, "blockdev_size"); - return 1; + goto err; + } + + if (!bytes) { + log_err("%s: zero sized block device?\n", f->file_name); + goto err; } f->real_file_size = bytes; return 0; +err: + td->io_ops->close_file(td, f); + return 1; } static int get_file_size(struct thread_data *td, struct fio_file *f) @@ -309,6 +323,8 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) flags |= O_SYNC; if (f->filetype != FIO_TYPE_FILE) flags |= FIO_O_NOATIME; + if (td->o.create_on_open) + flags |= O_CREAT; open_again: if (td_write(td)) { @@ -348,9 +364,6 @@ open_again: td_verror(td, __e, buf); } - if (get_file_size(td, f)) - goto err; - if (!from_hash && f->fd != -1) { if (add_file_hash(f)) { int ret; @@ -364,43 +377,11 @@ open_again: } return 0; -err: - close(f->fd); - return 1; } -int open_files(struct thread_data *td) +int generic_get_file_size(struct thread_data *td, struct fio_file *f) { - struct fio_file *f; - unsigned int i; - int err = 0; - - dprint(FD_FILE, "open files\n"); - - for_each_file(td, f, i) { - err = td_io_open_file(td, f); - if (err) { - if (td->error == EMFILE) { - log_err("fio: limited open files to: %d\n", - td->nr_open_files); - td->o.open_files = td->nr_open_files; - err = 0; - clear_error(td); - } - break; - } - - if (td->o.open_files == td->nr_open_files) - break; - } - - if (!err) - return 0; - - for_each_file(td, f, i) - td_io_close_file(td, f); - - return err; + return get_file_size(td, f); } /* @@ -416,15 +397,12 @@ static int get_file_sizes(struct thread_data *td) dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, f->file_name); - if (td->io_ops->open_file(td, f)) { + if (td_io_get_file_size(td, f)) { if (td->error != ENOENT) { log_err("%s\n", td->verror); err = 1; } clear_error(td); - } else { - if (td->io_ops->close_file) - td->io_ops->close_file(td, f); } if (f->real_file_size == -1ULL && td->o.size) @@ -529,8 +507,11 @@ int setup_files(struct thread_data *td) if (f->filetype == FIO_TYPE_FILE && (f->io_size + f->file_offset) > f->real_file_size && !(td->io_ops->flags & FIO_DISKLESSIO)) { - need_extend++; - extend_size += (f->io_size + f->file_offset); + if (!td->o.create_on_open) { + need_extend++; + extend_size += (f->io_size + f->file_offset); + } else + f->real_file_size = f->io_size + f->file_offset; f->flags |= FIO_FILE_EXTEND; } } @@ -543,8 +524,10 @@ int setup_files(struct thread_data *td) */ if (need_extend) { temp_stall_ts = 1; - log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n", - td->o.name, need_extend, extend_size >> 20); + if (!terse_output) + log_info("%s: Laying out IO file(s) (%u file(s) /" + " %LuMiB)\n", td->o.name, need_extend, + extend_size >> 20); for_each_file(td, f, i) { unsigned long long old_len, extend_len; @@ -647,6 +630,7 @@ void close_and_free_files(struct thread_data *td) } td_io_close_file(td, f); + remove_file_hash(f); sfree(f->file_name); f->file_name = NULL; @@ -701,9 +685,14 @@ int add_file(struct thread_data *td, const char *fname) f->fd = -1; - dprint(FD_FILE, "resize file array to %d files\n", cur_files + 1); + if (td->files_size <= td->files_index) { + int new_size = td->o.nr_files + 1; - td->files = realloc(td->files, (cur_files + 1) * sizeof(f)); + dprint(FD_FILE, "resize file array to %d files\n", new_size); + + td->files = realloc(td->files, new_size * sizeof(f)); + td->files_size = new_size; + } td->files[cur_files] = f; /*