X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=filesetup.c;h=502d79f8be93fae2ec9108025d344212bb284153;hb=c39cced652676a2b1dd76a98ca54f23b1f844cc5;hp=11138b7a5cddc662f0b872819ecc812d40361196;hpb=9d80e114104d43103d6acc920bce69296b647a53;p=fio.git diff --git a/filesetup.c b/filesetup.c index 11138b7a..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) @@ -113,8 +137,7 @@ static int create_files(struct thread_data *td) for_each_file(td, f, i) { int file_there = !file_ok(td, f); - if (file_there && td->ddir == DDIR_WRITE && - !td->overwrite) { + if (file_there && td_write(td) && !td->overwrite) { unlink(f->file_name); file_there = 0; } @@ -160,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"); @@ -240,11 +253,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) { @@ -252,7 +267,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) @@ -279,7 +294,7 @@ static int __setup_file_mmap(struct thread_data *td, struct fio_file *f) if (td->invalidate_cache && file_invalidate_cache(td, f)) return 1; - if (td->sequential) { + if (!td_random(td)) { if (madvise(f->mmap, f->file_size, MADV_SEQUENTIAL) < 0) { td_verror(td, errno, "madvise"); return 1; @@ -313,7 +328,7 @@ static int __setup_file_plain(struct thread_data *td, struct fio_file *f) if (td->invalidate_cache && file_invalidate_cache(td, f)) return 1; - if (td->sequential) { + if (!td_random(td)) { if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) { td_verror(td, errno, "fadvise"); return 1; @@ -346,40 +361,32 @@ 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; - /* - * 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->odirect) + flags |= OS_O_DIRECT; + if (td->sync_io) + flags |= O_SYNC; - flags |= O_CREAT; - } + if (td_write(td) || td_rw(td)) { + flags |= O_RDWR; - f->fd = open(f->file_name, flags, 0600); - } else { - if (td->filetype == FIO_TYPE_CHAR) - flags |= O_RDWR; - else - flags |= O_RDONLY; + if (td->filetype == FIO_TYPE_FILE) { + if (!td->overwrite) + flags |= O_TRUNC; - 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) { @@ -391,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; } @@ -411,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; } @@ -464,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; } @@ -486,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;