Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}