X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=850dc2f078cd0967703624fc51f6dc2f634dae3f;hp=356580e74c1276ccde5af550116e3bfd6813321b;hb=4f45320a29179d802073b392fd7e10bf0975d6bc;hpb=413dd459a7710ba421061e840dd9ac3161c70f20 diff --git a/filesetup.c b/filesetup.c index 356580e7..850dc2f0 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. */ @@ -239,11 +263,13 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f) */ if (td->io_ops->flags & FIO_MMAPIO) ret = madvise(f->mmap, f->file_size, MADV_DONTNEED); - else if (td->filetype == FIO_TYPE_FILE) - ret = fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_DONTNEED); - else if (td->filetype == FIO_TYPE_BD) - ret = blockdev_invalidate_cache(f->fd); - else if (td->filetype == FIO_TYPE_CHAR) + else if (td->filetype == FIO_TYPE_FILE) { + if (!td->odirect) + ret = fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_DONTNEED); + } else if (td->filetype == FIO_TYPE_BD) { + if (!td->odirect) + ret = blockdev_invalidate_cache(f->fd); + } else if (td->filetype == FIO_TYPE_CHAR) ret = 0; if (ret < 0) { @@ -251,7 +277,7 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f) return 1; } - return 0; + return ret; } static int __setup_file_mmap(struct thread_data *td, struct fio_file *f) @@ -345,7 +371,7 @@ static int setup_file(struct thread_data *td, struct fio_file *f) { int flags = 0; - if (td->io_ops->flags & FIO_NETIO) + if (td->io_ops->flags & FIO_SELFOPEN) return 0; /* @@ -370,14 +396,14 @@ static int setup_file(struct thread_data *td, struct fio_file *f) flags |= O_CREAT; } - f->fd = open(f->file_name, flags, 0600); + open_file(td, f, flags, 0600); } else { if (td->filetype == FIO_TYPE_CHAR) flags |= O_RDWR; else flags |= O_RDONLY; - f->fd = open(f->file_name, flags); + open_file(td, f, flags, 0); } } @@ -390,8 +416,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; } @@ -410,12 +438,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; } @@ -463,12 +487,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; } @@ -485,10 +505,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;