X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=1f1259d1ac156bd99666b73e8a6a71ecdd4d28ee;hp=50434e641b7af1cbc9617c50c75e27e1a2cde0f1;hb=4d9345ae968ca92ace3dab06c25a9b73159cb329;hpb=7abf833d25ab6cc866308fe37483dfe2fde28efc diff --git a/filesetup.c b/filesetup.c index 50434e64..1f1259d1 100644 --- a/filesetup.c +++ b/filesetup.c @@ -15,7 +15,7 @@ static int file_ok(struct thread_data *td, struct fio_file *f) { struct stat st; - if (td->filetype != FIO_TYPE_FILE) + if (td->filetype != FIO_TYPE_FILE || (td->io_ops->flags & FIO_NULLIO)) return 0; if (stat(f->file_name, &st) == -1) @@ -103,9 +103,19 @@ static int create_files(struct thread_data *td) return 0; need_create = 0; - if (td->filetype == FIO_TYPE_FILE) - for_each_file(td, f, i) - need_create += file_ok(td, f); + if (td->filetype == FIO_TYPE_FILE) { + for_each_file(td, f, i) { + int file_there = !file_ok(td, f); + + if (file_there && td->ddir == DDIR_WRITE && + !td->overwrite) { + unlink(f->file_name); + file_there = 0; + } + + need_create += !file_there; + } + } if (!need_create) return 0; @@ -117,14 +127,19 @@ static int create_files(struct thread_data *td) } temp_stall_ts = 1; - fprintf(f_out, "%s: Laying out IO file(s) (%d x %LuMiB == %LuMiB)\n", + fprintf(f_out, "%s: Laying out IO file(s) (%u x %LuMiB == %LuMiB)\n", td->name, td->nr_uniq_files, (td->total_file_size >> 20) / td->nr_uniq_files, td->total_file_size >> 20); err = 0; for_each_file(td, f, i) { + /* + * Only unlink files that we created. + */ + f->unlink = 0; if (file_ok(td, f)) { + f->unlink = td->unlink; err = create_file(td, f); if (err) break; @@ -149,9 +164,9 @@ static int file_size(struct thread_data *td, struct fio_file *f) if (!f->file_size || f->file_size > f->real_file_size) f->file_size = f->real_file_size; - } + } else + f->real_file_size = f->file_size; - f->file_size -= f->file_offset; return 0; } @@ -315,29 +330,40 @@ static int setup_file(struct thread_data *td, struct fio_file *f) { int flags = 0; - if (td->odirect) - flags |= OS_O_DIRECT; - if (td->sync_io) - flags |= O_SYNC; + if (td->io_ops->flags & FIO_NETIO) + return 0; - if (td_write(td) || td_rw(td)) { - flags |= O_RDWR; + /* + * we need a valid file descriptor, but don't create a real file. + * lets just dup stdout, seems like a sensible approach. + */ + if (td->io_ops->flags & FIO_NULLIO) + f->fd = dup(STDOUT_FILENO); + else { + if (td->odirect) + flags |= OS_O_DIRECT; + if (td->sync_io) + flags |= O_SYNC; + + if (td_write(td) || td_rw(td)) { + flags |= O_RDWR; - if (td->filetype == FIO_TYPE_FILE) { - if (!td->overwrite) - flags |= O_TRUNC; + if (td->filetype == FIO_TYPE_FILE) { + if (!td->overwrite) + flags |= O_TRUNC; - flags |= O_CREAT; - } + flags |= O_CREAT; + } - f->fd = open(f->file_name, flags, 0600); - } else { - if (td->filetype == FIO_TYPE_CHAR) - flags |= O_RDWR; - else - flags |= O_RDONLY; + f->fd = open(f->file_name, flags, 0600); + } else { + if (td->filetype == FIO_TYPE_CHAR) + flags |= O_RDWR; + else + flags |= O_RDONLY; - f->fd = open(f->file_name, flags); + f->fd = open(f->file_name, flags); + } } if (f->fd == -1) { @@ -434,7 +460,8 @@ void close_files(struct thread_data *td) int i; for_each_file(td, f, i) { - if (td->unlink && td->filetype == FIO_TYPE_FILE) { + if (!td->filename && f->unlink && + td->filetype == FIO_TYPE_FILE) { unlink(f->file_name); free(f->file_name); f->file_name = NULL;