X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=0e5599ab16502e9541023af6028e9814f366a844;hp=683a5c55c12f4347fea4d10f90de49e6c4cd1dc1;hb=afe8d310df03abf53281fa695d62ba9b875ec5e4;hpb=f0d1393544bf5e2bfdb26d09f5153533f63d7375 diff --git a/filesetup.c b/filesetup.c index 683a5c55..0e5599ab 100644 --- a/filesetup.c +++ b/filesetup.c @@ -38,12 +38,76 @@ static inline void clear_error(struct thread_data *td) td->verror[0] = '\0'; } +static inline int native_fallocate(struct thread_data *td, struct fio_file *f) +{ + bool success; + + success = fio_fallocate(f, 0, f->real_file_size); + dprint(FD_FILE, "native fallocate of file %s size %llu was " + "%ssuccessful\n", f->file_name, + (unsigned long long) f->real_file_size, + !success ? "un": ""); + + if (success) + return 0; + + if (errno == ENOSYS) + dprint(FD_FILE, "native fallocate is not implemented\n"); + + return -1; +} + +static void fallocate_file(struct thread_data *td, struct fio_file *f) +{ + int r; + + if (td->o.fill_device) + return; + + switch (td->o.fallocate_mode) { + case FIO_FALLOCATE_NATIVE: + r = native_fallocate(td, f); + if (r != 0 && errno != ENOSYS) + log_err("fio: native_fallocate call failed: %s\n", + strerror(errno)); + break; + case FIO_FALLOCATE_NONE: + break; +#ifdef CONFIG_POSIX_FALLOCATE + case FIO_FALLOCATE_POSIX: + dprint(FD_FILE, "posix_fallocate file %s size %llu\n", + f->file_name, + (unsigned long long) f->real_file_size); + + r = posix_fallocate(f->fd, 0, f->real_file_size); + if (r > 0) + log_err("fio: posix_fallocate fails: %s\n", strerror(r)); + break; +#endif /* CONFIG_POSIX_FALLOCATE */ +#ifdef CONFIG_LINUX_FALLOCATE + case FIO_FALLOCATE_KEEP_SIZE: + dprint(FD_FILE, "fallocate(FALLOC_FL_KEEP_SIZE) " + "file %s size %llu\n", f->file_name, + (unsigned long long) f->real_file_size); + + r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, f->real_file_size); + if (r != 0) + td_verror(td, errno, "fallocate"); + + break; +#endif /* CONFIG_LINUX_FALLOCATE */ + default: + log_err("fio: unknown fallocate mode: %d\n", td->o.fallocate_mode); + assert(0); + } +} + /* * Leaves f->fd open on success, caller must close */ static int extend_file(struct thread_data *td, struct fio_file *f) { - int r, new_layout = 0, unlink_file = 0, flags; + int new_layout = 0, unlink_file = 0, flags; unsigned long long left; unsigned int bs; char *b = NULL; @@ -82,6 +146,8 @@ static int extend_file(struct thread_data *td, struct fio_file *f) flags |= O_CREAT; if (new_layout) flags |= O_TRUNC; + if (td->o.odirect) + flags |= OS_O_DIRECT; #ifdef WIN32 flags |= _O_BINARY; @@ -100,43 +166,7 @@ static int extend_file(struct thread_data *td, struct fio_file *f) return 1; } -#ifdef CONFIG_POSIX_FALLOCATE - if (!td->o.fill_device) { - switch (td->o.fallocate_mode) { - case FIO_FALLOCATE_NONE: - break; - case FIO_FALLOCATE_POSIX: - dprint(FD_FILE, "posix_fallocate file %s size %llu\n", - f->file_name, - (unsigned long long) f->real_file_size); - - r = posix_fallocate(f->fd, 0, f->real_file_size); - if (r > 0) { - log_err("fio: posix_fallocate fails: %s\n", - strerror(r)); - } - break; -#ifdef CONFIG_LINUX_FALLOCATE - case FIO_FALLOCATE_KEEP_SIZE: - dprint(FD_FILE, - "fallocate(FALLOC_FL_KEEP_SIZE) " - "file %s size %llu\n", f->file_name, - (unsigned long long) f->real_file_size); - - r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, - f->real_file_size); - if (r != 0) - td_verror(td, errno, "fallocate"); - - break; -#endif /* CONFIG_LINUX_FALLOCATE */ - default: - log_err("fio: unknown fallocate mode: %d\n", - td->o.fallocate_mode); - assert(0); - } - } -#endif /* CONFIG_POSIX_FALLOCATE */ + fallocate_file(td, f); /* * If our jobs don't require regular files initially, we're done. @@ -171,6 +201,8 @@ static int extend_file(struct thread_data *td, struct fio_file *f) } while (left && !td->terminate) { + ssize_t r; + if (bs > left) bs = left; @@ -497,8 +529,6 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, } if (ret < 0) errval = errno; - else if (ret) /* probably not supported */ - errval = ret; } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) { dprint(FD_IO, "invalidate not supported %s\n", f->file_name); @@ -833,18 +863,22 @@ static unsigned long long get_fs_free_counts(struct thread_data *td) uint64_t get_start_offset(struct thread_data *td, struct fio_file *f) { struct thread_options *o = &td->o; - unsigned long long align_bs; /* align the offset to this block size */ - unsigned long long offset; /* align_bs-aligned offset */ + unsigned long long align_bs; + unsigned long long offset; if (o->file_append && f->filetype == FIO_TYPE_FILE) return f->real_file_size; if (o->start_offset_percent > 0) { - /* if blockalign is provided, find the min across read, write, and trim */ + /* + * if blockalign is provided, find the min across read, write, + * and trim + */ if (fio_option_is_set(o, ba)) { align_bs = (unsigned long long) min(o->ba[DDIR_READ], o->ba[DDIR_WRITE]); align_bs = min((unsigned long long) o->ba[DDIR_TRIM], align_bs); - } else { /* else take the minimum block size */ + } else { + /* else take the minimum block size */ align_bs = td_min_bs(td); } @@ -852,14 +886,18 @@ uint64_t get_start_offset(struct thread_data *td, struct fio_file *f) offset = (f->real_file_size * o->start_offset_percent / 100) + (td->subjob_number * o->offset_increment); - /* block align the offset at the next available boundary at - ceiling(offset / align_bs) * align_bs */ + /* + * block align the offset at the next available boundary at + * ceiling(offset / align_bs) * align_bs + */ offset = (offset / align_bs + (offset % align_bs != 0)) * align_bs; - } else { /* start_offset_percent not set */ + } else { + /* start_offset_percent not set */ offset = o->start_offset + td->subjob_number * o->offset_increment; } + return offset; }