X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=230e846b2d52bf12b89e588fc19114ea4e833df6;hp=e447539c2051d1ece8714669e53a996a4ca3cbd3;hb=22a57ba81de2c3f458797e9158da760c9e0ea435;hpb=4950421a7e379ba0ca642390ae4ae7b68e92a42f diff --git a/ioengines.c b/ioengines.c index e447539c..230e846b 100644 --- a/ioengines.c +++ b/ioengines.c @@ -17,6 +17,7 @@ #include #include "fio.h" +#include "diskutil.h" static FLIST_HEAD(engine_list); @@ -220,22 +221,21 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) assert((io_u->flags & IO_U_F_FLIGHT) == 0); io_u->flags |= IO_U_F_FLIGHT; - assert(io_u->file->flags & FIO_FILE_OPEN); + assert(fio_file_open(io_u->file)); io_u->error = 0; io_u->resid = 0; if (td->io_ops->flags & FIO_SYNCIO) { - fio_gettime(&io_u->issue_time, NULL); - memcpy(&td->last_issue, &io_u->issue_time, - sizeof(struct timeval)); + if (fio_fill_issue_time(td)) + fio_gettime(&io_u->issue_time, NULL); /* - * for a sync engine, set the timeout upfront + * only used for iolog */ - if (mtime_since(&td->timeout_end, &io_u->issue_time) - < IO_U_TIMEOUT) - io_u_set_timeout(td); + if (td->o.read_iolog_file) + memcpy(&td->last_issue, &io_u->issue_time, + sizeof(struct timeval)); } if (io_u->ddir != DDIR_SYNC) @@ -271,18 +271,15 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) } if ((td->io_ops->flags & FIO_SYNCIO) == 0) { - fio_gettime(&io_u->issue_time, NULL); - memcpy(&td->last_issue, &io_u->issue_time, - sizeof(struct timeval)); + if (fio_fill_issue_time(td)) + fio_gettime(&io_u->issue_time, NULL); /* - * async engine, set the timeout here + * only used for iolog */ - if (ret == FIO_Q_QUEUED && - (mtime_since(&td->timeout_end, &io_u->issue_time) - < IO_U_TIMEOUT)) { - io_u_set_timeout(td); - } + if (td->o.read_iolog_file) + memcpy(&td->last_issue, &io_u->issue_time, + sizeof(struct timeval)); } return ret; @@ -321,6 +318,9 @@ int td_io_commit(struct thread_data *td) int td_io_open_file(struct thread_data *td, struct fio_file *f) { + assert(!fio_file_open(f)); + assert(f->fd == -1); + if (td->io_ops->open_file(td, f)) { if (td->error == EINVAL && td->o.odirect) log_err("fio: destination does not support O_DIRECT\n"); @@ -330,12 +330,15 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) td->o.nr_files); } + assert(f->fd == -1); + assert(!fio_file_open(f)); return 1; } fio_file_reset(f); - f->flags |= FIO_FILE_OPEN; - f->flags &= ~FIO_FILE_CLOSING; + fio_file_set_open(f); + fio_file_clear_closing(f); + disk_util_inc(f->du); td->nr_open_files++; get_file(f); @@ -368,9 +371,6 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) } } - if (f->file_map) - memset(f->file_map, 0, f->num_maps * sizeof(int)); - #ifdef FIO_OS_DIRECTIO /* * Some OS's have a distinct call to mark the file non-buffered, @@ -390,6 +390,7 @@ done: log_file(td, f, FIO_LOG_OPEN_FILE); return 0; err: + disk_util_dec(f->du); if (td->io_ops->close_file) td->io_ops->close_file(td, f); return 1; @@ -397,15 +398,26 @@ err: int td_io_close_file(struct thread_data *td, struct fio_file *f) { - if (!(f->flags & FIO_FILE_CLOSING)) + assert(f->references); + + if (!fio_file_closing(f)) log_file(td, f, FIO_LOG_CLOSE_FILE); /* * mark as closing, do real close when last io on it has completed */ - f->flags |= FIO_FILE_CLOSING; + fio_file_set_closing(f); + disk_util_dec(f->du); unlock_file_all(td, f); return put_file(td, f); } + +int td_io_get_file_size(struct thread_data *td, struct fio_file *f) +{ + if (!td->io_ops->get_file_size) + return 0; + + return td->io_ops->get_file_size(td, f); +}