X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=502d79f8be93fae2ec9108025d344212bb284153;hb=b9448b92bead64e3b4162418e65354a56047221e;hp=cf9fa3c4fb665f30854b36c2cb25b0dd88f43116;hpb=a9defc9abb4a3013335d3aeeb132fd90900cac85;p=fio.git diff --git a/filesetup.c b/filesetup.c index cf9fa3c4..502d79f8 100644 --- a/filesetup.c +++ b/filesetup.c @@ -8,6 +8,30 @@ #include "fio.h" #include "os.h" +int open_file(struct thread_data *td, struct fio_file *f, int flags, int perm) +{ + if (flags & O_CREAT) + f->fd = open(f->file_name, flags, perm); + else + f->fd = open(f->file_name, flags); + + if (f->fd != -1) { + td->nr_open_files++; + return 0; + } + + return 1; +} + +void close_file(struct thread_data *td, struct fio_file *f) +{ + if (f->fd != -1) { + close(f->fd); + f->fd = -1; + td->nr_open_files--; + } +} + /* * Check if the file exists and it's large enough. */ @@ -15,7 +39,7 @@ static int file_ok(struct thread_data *td, struct fio_file *f) { struct stat st; - if (td->filetype != FIO_TYPE_FILE || (td->io_ops->flags & FIO_NULLIO)) + if (td->filetype != FIO_TYPE_FILE) return 0; if (lstat(f->file_name, &st) == -1) @@ -159,16 +183,6 @@ static int file_size(struct thread_data *td, struct fio_file *f) { struct stat st; - /* - * if we are not doing real io, just pretend the file is as large - * as the size= given. this works fine with nrfiles > 1 as well, - * we only really care about it being at least as big as size= - */ - if (td->io_ops->flags & FIO_NULLIO) { - f->real_file_size = f->file_size = td->total_file_size; - return 0; - } - if (td->overwrite) { if (fstat(f->fd, &st) == -1) { td_verror(td, errno, "fstat"); @@ -350,37 +364,29 @@ static int setup_file(struct thread_data *td, struct fio_file *f) if (td->io_ops->flags & FIO_SELFOPEN) return 0; - /* - * 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->odirect) + flags |= OS_O_DIRECT; + if (td->sync_io) + flags |= O_SYNC; - if (td->filetype == FIO_TYPE_FILE) { - if (!td->overwrite) - flags |= O_TRUNC; + if (td_write(td) || td_rw(td)) { + flags |= O_RDWR; - flags |= O_CREAT; - } + if (td->filetype == FIO_TYPE_FILE) { + if (!td->overwrite) + flags |= O_TRUNC; - 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); + flags |= O_CREAT; } + + open_file(td, f, flags, 0600); + } else { + if (td->filetype == FIO_TYPE_CHAR) + flags |= O_RDWR; + else + flags |= O_RDONLY; + + open_file(td, f, flags, 0); } if (f->fd == -1) { @@ -392,8 +398,10 @@ static int setup_file(struct thread_data *td, struct fio_file *f) return 1; } - if (get_file_size(td, f)) + if (get_file_size(td, f)) { + close_file(td, f); return 1; + } return 0; } @@ -412,12 +420,8 @@ int open_files(struct thread_data *td) if (!err) return 0; - for_each_file(td, f, i) { - if (f->fd != -1) { - close(f->fd); - f->fd = -1; - } - } + for_each_file(td, f, i) + close_file(td, f); return err; } @@ -465,12 +469,8 @@ int setup_files(struct thread_data *td) else err = setup_files_plain(td); - for_each_file(td, f, i) { - if (f->fd != -1) { - close(f->fd); - f->fd = -1; - } - } + for_each_file(td, f, i) + close_file(td, f); return err; } @@ -487,10 +487,9 @@ void close_files(struct thread_data *td) free(f->file_name); f->file_name = NULL; } - if (f->fd != -1) { - close(f->fd); - f->fd = -1; - } + + close_file(td, f); + if (f->mmap) { munmap(f->mmap, f->file_size); f->mmap = NULL;