static int fio_vsyncio_queue(struct thread_data *td, struct io_u *io_u) { struct syncio_data *sd = td->io_ops->data; fio_ro_check(td, io_u); if (!fio_vsyncio_append(td, io_u)) { dprint(FD_IO, "vsyncio_queue: no append (%d)\n", sd->queued); /* * If we can't append and have stuff queued, tell fio to * commit those first and then retry this io */ if (sd->queued) return FIO_Q_BUSY; if (io_u->ddir == DDIR_SYNC) { int ret = fsync(io_u->file->fd); return fio_io_end(td, io_u, ret); } else if (io_u->ddir == DDIR_DATASYNC) { int ret = fdatasync(io_u->file->fd); return fio_io_end(td, io_u, ret); } sd->queued = 0; sd->queued_bytes = 0; fio_vsyncio_set_iov(sd, io_u, 0); } else { if (sd->queued == td->o.iodepth) { dprint(FD_IO, "vsyncio_queue: max depth %d\n", sd->queued); return FIO_Q_BUSY; } dprint(FD_IO, "vsyncio_queue: append\n"); fio_vsyncio_set_iov(sd, io_u, sd->queued); } dprint(FD_IO, "vsyncio_queue: depth now %d\n", sd->queued); return FIO_Q_QUEUED; }
static int fio_syncio_queue(struct thread_data *td, struct io_u *io_u) { struct fio_file *f = io_u->file; int ret; fio_ro_check(td, io_u); if (io_u->ddir == DDIR_READ) ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen); else if (io_u->ddir == DDIR_WRITE) ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen); else ret = fsync(f->fd); return fio_io_end(td, io_u, ret); }
static int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u) { struct fio_file *f = io_u->file; int ret; fio_ro_check(td, io_u); if (io_u->ddir == DDIR_READ) ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); else if (io_u->ddir == DDIR_WRITE) ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); else if (io_u->ddir == DDIR_TRIM) { do_io_u_trim(td, io_u); return FIO_Q_COMPLETED; } else ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret); }
static int fio_pvsyncio_queue(struct thread_data *td, struct io_u *io_u) { struct syncio_data *sd = td->io_ops->data; struct iovec *iov = &sd->iovecs[0]; struct fio_file *f = io_u->file; int ret; fio_ro_check(td, io_u); iov->iov_base = io_u->xfer_buf; iov->iov_len = io_u->xfer_buflen; if (io_u->ddir == DDIR_READ) ret = preadv(f->fd, iov, 1, io_u->offset); else if (io_u->ddir == DDIR_WRITE) ret = pwritev(f->fd, iov, 1, io_u->offset); else if (io_u->ddir == DDIR_TRIM) { do_io_u_trim(td, io_u); return FIO_Q_COMPLETED; } else ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret); }