X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=ioengines.c;h=7df0abac0bf9a427fbb8273ddf6f151797c8fead;hp=155649b4007ff765f1277b96c6889286de205d72;hb=d708ac5e21c97a92c9c7b6b7593d9f2b0d7c9d3f;hpb=0a28ecda80a78c9d70ae38ced58f3a2fa9c9529d diff --git a/ioengines.c b/ioengines.c index 155649b4..7df0abac 100644 --- a/ioengines.c +++ b/ioengines.c @@ -207,6 +207,9 @@ int td_io_getevents(struct thread_data *td, unsigned int min, unsigned int max, out: if (r >= 0) io_u_mark_complete(td, r); + else + td_verror(td, r, "get_events"); + dprint(FD_IO, "getevents: %d\n", r); return r; } @@ -238,7 +241,7 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) sizeof(struct timeval)); } - if (!ddir_sync(io_u->ddir)) + if (ddir_rw(io_u->ddir)) td->io_issues[io_u->ddir]++; ret = td->io_ops->queue(td, io_u); @@ -251,7 +254,7 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) * IO, then it's likely an alignment problem or because the host fs * does not support O_DIRECT */ - if (io_u->error == EINVAL && td->io_issues[io_u->ddir] == 1 && + if (io_u->error == EINVAL && td->io_issues[io_u->ddir & 1] == 1 && td->o.odirect) { log_info("fio: first direct IO errored. File system may not " "support direct IO, or iomem_align= is bad.\n"); @@ -263,14 +266,15 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) } if (ret == FIO_Q_COMPLETED) { - if (!ddir_sync(io_u->ddir)) { + if (ddir_rw(io_u->ddir)) { io_u_mark_depth(td, 1); td->ts.total_io_u[io_u->ddir]++; - } + } else if (io_u->ddir == DDIR_TRIM) + td->ts.total_io_u[2]++; } else if (ret == FIO_Q_QUEUED) { int r; - if (!ddir_sync(io_u->ddir)) { + if (ddir_rw(io_u->ddir)) { td->io_u_queued++; td->ts.total_io_u[io_u->ddir]++; } @@ -314,6 +318,8 @@ int td_io_init(struct thread_data *td) int td_io_commit(struct thread_data *td) { + int ret; + dprint(FD_IO, "calling ->commit(), depth %d\n", td->cur_depth); if (!td->cur_depth || !td->io_u_queued) @@ -322,8 +328,11 @@ int td_io_commit(struct thread_data *td) io_u_mark_depth(td, td->io_u_queued); td->io_u_queued = 0; - if (td->io_ops->commit) - return td->io_ops->commit(td); + if (td->io_ops->commit) { + ret = td->io_ops->commit(td); + if (ret) + td_verror(td, -ret, "io commit"); + } return 0; } @@ -465,5 +474,26 @@ int do_io_u_sync(struct thread_data *td, struct io_u *io_u) io_u->error = EINVAL; } + if (ret < 0) + io_u->error = errno; + return ret; } + +int do_io_u_trim(struct thread_data *td, struct io_u *io_u) +{ +#ifndef FIO_HAVE_TRIM + io_u->error = EINVAL; + return 0; +#else + struct fio_file *f = io_u->file; + int ret; + + ret = os_trim(f->fd, io_u->offset + f->file_offset, io_u->xfer_buflen); + if (!ret) + return io_u->xfer_buflen;; + + io_u->error = ret; + return 0; +#endif +}