X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=d8b7401b35e0230d9f40afe53dcbfcd5e84b83e1;hb=cade3ef44669c5c962d7ed18ca0e361116ee44ad;hp=6c0af85c545748c75cd2215b7befe711a1748f28;hpb=c343981b9874179009a92e4d29eae95cf341843a;p=fio.git diff --git a/filesetup.c b/filesetup.c index 6c0af85c..d8b7401b 100644 --- a/filesetup.c +++ b/filesetup.c @@ -178,7 +178,7 @@ static int create_files(struct thread_data *td) * unless specifically asked for overwrite, let normal io extend it */ can_extend = !td->o.overwrite && !(td->io_ops->flags & FIO_NOEXTEND); - if (can_extend) { + if (can_extend && new_files) { for_each_file(td, f, i) { if (fill_file_size(td, f, &total_file_size, new_files)) { log_info("fio: limited to %d files\n", i); @@ -384,9 +384,12 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) } if (f->fd == -1) { + char buf[FIO_VERROR_SIZE]; int __e = errno; - td_verror(td, __e, "open"); + snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); + + td_verror(td, __e, buf); if (__e == EINVAL && td->o.odirect) log_err("fio: destination does not support O_DIRECT\n"); if (__e == EMFILE) @@ -400,6 +403,9 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) if (td->o.invalidate_cache && file_invalidate_cache(td, f)) goto err; + if (!td->o.fadvise_hint) + return 0; + if (!td_random(td)) { if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) { td_verror(td, errno, "fadvise"); @@ -517,15 +523,15 @@ void close_files(struct thread_data *td) unsigned int i; for_each_file(td, f, i) { - if (!f->file_name && (f->flags & FIO_FILE_UNLINK) && - f->filetype == FIO_TYPE_FILE) { + if ((f->flags & FIO_FILE_UNLINK) && + f->filetype == FIO_TYPE_FILE) unlink(f->file_name); - free(f->file_name); - f->file_name = NULL; - } td_io_close_file(td, f); + free(f->file_name); + f->file_name = NULL; + if (f->file_map) { free(f->file_map); f->file_map = NULL; @@ -533,6 +539,7 @@ void close_files(struct thread_data *td) } td->o.filename = NULL; + free(td->files); td->files = NULL; td->o.nr_files = 0; } @@ -563,14 +570,21 @@ static void get_file_type(struct fio_file *f) void add_file(struct thread_data *td, const char *fname) { int cur_files = td->files_index; + char file_name[PATH_MAX]; struct fio_file *f; + int len = 0; td->files = realloc(td->files, (cur_files + 1) * sizeof(*f)); f = &td->files[cur_files]; memset(f, 0, sizeof(*f)); f->fd = -1; - f->file_name = strdup(fname); + + if (td->o.directory) + len = sprintf(file_name, "%s/", td->o.directory); + + sprintf(file_name + len, "%s", fname); + f->file_name = strdup(file_name); get_file_type(f); @@ -648,3 +662,22 @@ int add_dir_files(struct thread_data *td, const char *path) { return recurse_dir(td, path); } + +void dup_files(struct thread_data *td, struct thread_data *org) +{ + struct fio_file *f; + unsigned int i; + size_t bytes; + + if (!org->files) + return; + + bytes = org->files_index * sizeof(*f); + td->files = malloc(bytes); + memcpy(td->files, org->files, bytes); + + for_each_file(td, f, i) { + if (f->file_name) + f->file_name = strdup(f->file_name); + } +}