12866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe/*
2a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai * sync/psync engine
3da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe *
4da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * IO engine that does regular read(2)/write(2) with lseek(2) to transfer
5a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai * data and IO engine that does regular pread(2)/pwrite(2) to transfer data.
62866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe *
72866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe */
82866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <stdio.h>
92866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <stdlib.h>
102866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <unistd.h>
115921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe#include <sys/uio.h>
122866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <errno.h>
132866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <assert.h>
145f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe
155f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe#include "../fio.h"
16eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#include "../optgroup.h"
172866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
18ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe/*
19ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe * Sync engine uses engine_data to store last offset
20ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe */
21eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define LAST_POS(f)	((f)->engine_pos)
22ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe
231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestruct syncio_data {
241d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct iovec *iovecs;
251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct io_u **io_us;
261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	unsigned int queued;
27e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe	unsigned int events;
281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	unsigned long queued_bytes;
291d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	unsigned long long last_offset;
311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct fio_file *last_file;
321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	enum fio_ddir last_ddir;
331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe};
341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
35eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2
36eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstruct psyncv2_options {
37eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	void *pad;
38eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	unsigned int hipri;
39eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes};
40eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
41eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic struct fio_option options[] = {
42eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	{
43eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.name	= "hipri",
44eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.lname	= "RWF_HIPRI",
45eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.type	= FIO_OPT_STR_SET,
46eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.off1	= offsetof(struct psyncv2_options, hipri),
47eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.help	= "Set RWF_HIPRI for pwritev2/preadv2",
48eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.category = FIO_OPT_C_ENGINE,
49eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.group	= FIO_OPT_G_INVALID,
50eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	},
51eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	{
52eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		.name	= NULL,
53eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	},
54eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes};
55eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
56eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
572866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboestatic int fio_syncio_prep(struct thread_data *td, struct io_u *io_u)
582866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe{
5953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f = io_u->file;
6053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
61ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe	if (!ddir_rw(io_u->ddir))
6287dc1ab1b4df7b977f60e3d43533a896e2ee665bJens Axboe		return 0;
6387dc1ab1b4df7b977f60e3d43533a896e2ee665bJens Axboe
64ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe	if (LAST_POS(f) != -1ULL && LAST_POS(f) == io_u->offset)
65e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe		return 0;
66e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe
6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) {
68e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "lseek");
692866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe		return 1;
702866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	}
712866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
722866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	return 0;
732866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe}
742866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
752bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_io_end(struct thread_data *td, struct io_u *io_u, int ret)
762866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe{
77ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe	if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir))
78ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe		LAST_POS(io_u->file) = io_u->offset + ret;
79e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe
80cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe	if (ret != (int) io_u->xfer_buflen) {
8122819ec237297fc39435ed566bee01a4225bfb39Jens Axboe		if (ret >= 0) {
82cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe			io_u->resid = io_u->xfer_buflen - ret;
83cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe			io_u->error = 0;
8436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe			return FIO_Q_COMPLETED;
852866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe		} else
862866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe			io_u->error = errno;
872866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	}
882866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
898f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe	if (io_u->error) {
908f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe		io_u_log_error(td, io_u);
91e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, io_u->error, "xfer");
928f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe	}
932866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
9436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe	return FIO_Q_COMPLETED;
952866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe}
962866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
9707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#ifdef CONFIG_PWRITEV
9807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboestatic int fio_pvsyncio_queue(struct thread_data *td, struct io_u *io_u)
9907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe{
100eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
10107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	struct iovec *iov = &sd->iovecs[0];
10207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	struct fio_file *f = io_u->file;
10307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	int ret;
10407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
10507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	fio_ro_check(td, io_u);
10607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
10707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	iov->iov_base = io_u->xfer_buf;
10807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	iov->iov_len = io_u->xfer_buflen;
10907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
11007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	if (io_u->ddir == DDIR_READ)
11107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe		ret = preadv(f->fd, iov, 1, io_u->offset);
11207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	else if (io_u->ddir == DDIR_WRITE)
11307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe		ret = pwritev(f->fd, iov, 1, io_u->offset);
11407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	else if (io_u->ddir == DDIR_TRIM) {
11507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe		do_io_u_trim(td, io_u);
11607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe		return FIO_Q_COMPLETED;
11707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	} else
11807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe		ret = do_io_u_sync(td, io_u);
11907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
12007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	return fio_io_end(td, io_u, ret);
12107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe}
12207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#endif
12307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
124eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2
125eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic int fio_pvsyncio2_queue(struct thread_data *td, struct io_u *io_u)
126eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
127eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
128eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct psyncv2_options *o = td->eo;
129eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct iovec *iov = &sd->iovecs[0];
130eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct fio_file *f = io_u->file;
131eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	int ret, flags = 0;
132eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
133eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	fio_ro_check(td, io_u);
134eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
135eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (o->hipri)
136eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		flags |= RWF_HIPRI;
137eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
138eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	iov->iov_base = io_u->xfer_buf;
139eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	iov->iov_len = io_u->xfer_buflen;
140eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
141eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (io_u->ddir == DDIR_READ)
142eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		ret = preadv2(f->fd, iov, 1, io_u->offset, flags);
143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (io_u->ddir == DDIR_WRITE)
144eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		ret = pwritev2(f->fd, iov, 1, io_u->offset, flags);
145eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (io_u->ddir == DDIR_TRIM) {
146eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		do_io_u_trim(td, io_u);
147eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return FIO_Q_COMPLETED;
148eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else
149eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		ret = do_io_u_sync(td, io_u);
150eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
151eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return fio_io_end(td, io_u, ret);
152eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
153eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
154eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
155eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1562bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u)
157a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai{
1582bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	struct fio_file *f = io_u->file;
1592bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	int ret;
1602bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1612bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	fio_ro_check(td, io_u);
1622bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1632bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	if (io_u->ddir == DDIR_READ)
1642bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe		ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
1652bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	else if (io_u->ddir == DDIR_WRITE)
1662bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe		ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
1676eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	else if (io_u->ddir == DDIR_TRIM) {
1686eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		do_io_u_trim(td, io_u);
1696eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		return FIO_Q_COMPLETED;
1706eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else
1710a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe		ret = do_io_u_sync(td, io_u);
1722bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1732bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	return fio_io_end(td, io_u, ret);
1742bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe}
1752bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1762bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_syncio_queue(struct thread_data *td, struct io_u *io_u)
1772bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe{
1782bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	struct fio_file *f = io_u->file;
1792bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	int ret;
1802bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1812bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	fio_ro_check(td, io_u);
1822bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1832bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	if (io_u->ddir == DDIR_READ)
1842bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe		ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
1852bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	else if (io_u->ddir == DDIR_WRITE)
1862bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe		ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
1876eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	else if (io_u->ddir == DDIR_TRIM) {
1886eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		do_io_u_trim(td, io_u);
1896eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		return FIO_Q_COMPLETED;
1906eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else
1910a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe		ret = do_io_u_sync(td, io_u);
1922bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe
1932bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	return fio_io_end(td, io_u, ret);
194a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai}
195a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai
1961d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_getevents(struct thread_data *td, unsigned int min,
1971d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe				 unsigned int max,
1980cbbc3919c80d969926f499cb6045be3d5cd0305Jens Axboe				 const struct timespec fio_unused *t)
1991d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
200eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
2011d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	int ret;
2021d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (min) {
204e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe		ret = sd->events;
205e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe		sd->events = 0;
2061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	} else
2071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		ret = 0;
2081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	dprint(FD_IO, "vsyncio_getevents: min=%d,max=%d: %d\n", min, max, ret);
2101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return ret;
2111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
2121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic struct io_u *fio_vsyncio_event(struct thread_data *td, int event)
2141d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
215eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
2161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return sd->io_us[event];
2181d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
2191d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2201d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_append(struct thread_data *td, struct io_u *io_u)
2211d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
222eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
2231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2245f9099ea8adf423d0db01274ef0d7e65629c0e1cJens Axboe	if (ddir_sync(io_u->ddir))
2251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return 0;
2261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2271d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (io_u->offset == sd->last_offset && io_u->file == sd->last_file &&
2281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	    io_u->ddir == sd->last_ddir)
2291d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return 1;
2301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return 0;
2321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
2331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic void fio_vsyncio_set_iov(struct syncio_data *sd, struct io_u *io_u,
2352b13e716c0921356c0930522718e00b8df34293aJens Axboe				int idx)
2361d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
2372b13e716c0921356c0930522718e00b8df34293aJens Axboe	sd->io_us[idx] = io_u;
2382b13e716c0921356c0930522718e00b8df34293aJens Axboe	sd->iovecs[idx].iov_base = io_u->xfer_buf;
2392b13e716c0921356c0930522718e00b8df34293aJens Axboe	sd->iovecs[idx].iov_len = io_u->xfer_buflen;
2401d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->last_offset = io_u->offset + io_u->xfer_buflen;
2411d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->last_file = io_u->file;
2421d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->last_ddir = io_u->ddir;
2431d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->queued_bytes += io_u->xfer_buflen;
2441d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->queued++;
2451d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
2461d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2471d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_queue(struct thread_data *td, struct io_u *io_u)
2481d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
249eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
2501d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2511d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	fio_ro_check(td, io_u);
2521d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2531d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (!fio_vsyncio_append(td, io_u)) {
2541d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		dprint(FD_IO, "vsyncio_queue: no append (%d)\n", sd->queued);
2551d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		/*
2561d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		 * If we can't append and have stuff queued, tell fio to
2571d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		 * commit those first and then retry this io
2581d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		 */
2591d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		if (sd->queued)
2601d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			return FIO_Q_BUSY;
2610a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe		if (ddir_sync(io_u->ddir)) {
2620a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe			int ret = do_io_u_sync(td, io_u);
2630a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe
2640a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe			return fio_io_end(td, io_u, ret);
2650a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe		}
266cc9159c3f6f6a650cb973a636c35b41b8be34dbfJens Axboe
2671d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		sd->queued = 0;
2681d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		sd->queued_bytes = 0;
2691d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		fio_vsyncio_set_iov(sd, io_u, 0);
2701d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	} else {
2711d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		if (sd->queued == td->o.iodepth) {
2721d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			dprint(FD_IO, "vsyncio_queue: max depth %d\n", sd->queued);
2731d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			return FIO_Q_BUSY;
2741d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		}
2751d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2761d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		dprint(FD_IO, "vsyncio_queue: append\n");
2771d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		fio_vsyncio_set_iov(sd, io_u, sd->queued);
2781d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	}
2791d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2801d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	dprint(FD_IO, "vsyncio_queue: depth now %d\n", sd->queued);
2811d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return FIO_Q_QUEUED;
2821d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
2831d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2841d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe/*
2851d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe * Check that we transferred all bytes, or saw an error, etc
2861d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe */
2871d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_end(struct thread_data *td, ssize_t bytes)
2881d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
289eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
2901d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct io_u *io_u;
2911d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	unsigned int i;
2921d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	int err;
2931d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
2941d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	/*
2951d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	 * transferred everything, perfect
2961d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	 */
2971d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (bytes == sd->queued_bytes)
2981d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return 0;
2991d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3001d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	err = errno;
3011d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	for (i = 0; i < sd->queued; i++) {
3021d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		io_u = sd->io_us[i];
3031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3041d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		if (bytes == -1) {
3051d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			io_u->error = err;
3061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		} else {
3071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			unsigned int this_io;
3081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			this_io = bytes;
3101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			if (this_io > io_u->xfer_buflen)
3111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe				this_io = io_u->xfer_buflen;
3121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			io_u->resid = io_u->xfer_buflen - this_io;
3141d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			io_u->error = 0;
3151d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe			bytes -= this_io;
3161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		}
3171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	}
3181d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3191d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (bytes == -1) {
3201d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		td_verror(td, err, "xfer vsync");
3211d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return -err;
3221d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	}
3231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3241d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return 0;
3251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
3261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3271d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_commit(struct thread_data *td)
3281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
329eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
3301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct fio_file *f;
3311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	ssize_t ret;
3321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (!sd->queued)
3341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return 0;
3351d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
336838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe	io_u_mark_submit(td, sd->queued);
3371d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	f = sd->last_file;
3381d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3391d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (lseek(f->fd, sd->io_us[0]->offset, SEEK_SET) == -1) {
3401d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		int err = -errno;
3411d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3421d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		td_verror(td, errno, "lseek");
3431d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		return err;
3441d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	}
3451d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3461d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	if (sd->last_ddir == DDIR_READ)
3471d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		ret = readv(f->fd, sd->iovecs, sd->queued);
3481d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	else
3491d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe		ret = writev(f->fd, sd->iovecs, sd->queued);
3501d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3511d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	dprint(FD_IO, "vsyncio_commit: %d\n", (int) ret);
352e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe	sd->events = sd->queued;
353e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe	sd->queued = 0;
3541d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return fio_vsyncio_end(td, ret);
3551d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
3561d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3571d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_init(struct thread_data *td)
3581d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
3591d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	struct syncio_data *sd;
3601d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3611d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd = malloc(sizeof(*sd));
3621d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	memset(sd, 0, sizeof(*sd));
3631d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->last_offset = -1ULL;
3641d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->iovecs = malloc(td->o.iodepth * sizeof(struct iovec));
3651d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	sd->io_us = malloc(td->o.iodepth * sizeof(struct io_u *));
3661d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
367eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	td->io_ops_data = sd;
3681d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	return 0;
3691d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
3701d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
3711d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic void fio_vsyncio_cleanup(struct thread_data *td)
3721d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{
373eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct syncio_data *sd = td->io_ops_data;
3741d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
375eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (sd) {
376eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		free(sd->iovecs);
377eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		free(sd->io_us);
378eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		free(sd);
379eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
3801d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}
3811d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
382a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas paistatic struct ioengine_ops ioengine_rw = {
3832866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.name		= "sync",
3842866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.version	= FIO_IOOPS_VERSION,
3852866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.prep		= fio_syncio_prep,
3862866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.queue		= fio_syncio_queue,
387b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	.open_file	= generic_open_file,
388b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	.close_file	= generic_close_file,
389df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	.get_file_size	= generic_get_file_size,
3902866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.flags		= FIO_SYNCIO,
3912866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe};
3925f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe
393a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas paistatic struct ioengine_ops ioengine_prw = {
394a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	.name		= "psync",
395a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	.version	= FIO_IOOPS_VERSION,
3962bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe	.queue		= fio_psyncio_queue,
397a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	.open_file	= generic_open_file,
398a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	.close_file	= generic_close_file,
399df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	.get_file_size	= generic_get_file_size,
400a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	.flags		= FIO_SYNCIO,
401a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai};
402a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai
4031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic struct ioengine_ops ioengine_vrw = {
4041d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.name		= "vsync",
4051d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.version	= FIO_IOOPS_VERSION,
4061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.init		= fio_vsyncio_init,
4071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.cleanup	= fio_vsyncio_cleanup,
4081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.queue		= fio_vsyncio_queue,
4091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.commit		= fio_vsyncio_commit,
4101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.event		= fio_vsyncio_event,
4111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.getevents	= fio_vsyncio_getevents,
4121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.open_file	= generic_open_file,
4131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.close_file	= generic_close_file,
414df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	.get_file_size	= generic_get_file_size,
4151d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	.flags		= FIO_SYNCIO,
4161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe};
4171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe
41807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#ifdef CONFIG_PWRITEV
41907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboestatic struct ioengine_ops ioengine_pvrw = {
42007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.name		= "pvsync",
42107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.version	= FIO_IOOPS_VERSION,
42207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.init		= fio_vsyncio_init,
42307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.cleanup	= fio_vsyncio_cleanup,
42407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.queue		= fio_pvsyncio_queue,
42507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.open_file	= generic_open_file,
42607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.close_file	= generic_close_file,
42707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.get_file_size	= generic_get_file_size,
42807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	.flags		= FIO_SYNCIO,
42907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe};
43007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#endif
43107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe
432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2
433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic struct ioengine_ops ioengine_pvrw2 = {
434eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.name		= "pvsync2",
435eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.version	= FIO_IOOPS_VERSION,
436eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.init		= fio_vsyncio_init,
437eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.cleanup	= fio_vsyncio_cleanup,
438eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.queue		= fio_pvsyncio2_queue,
439eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.open_file	= generic_open_file,
440eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.close_file	= generic_close_file,
441eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.get_file_size	= generic_get_file_size,
442eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.flags		= FIO_SYNCIO,
443eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.options	= options,
444eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	.option_struct_size	= sizeof(struct psyncv2_options),
445eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes};
446eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
447eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
4485f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_init fio_syncio_register(void)
4495f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{
450a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	register_ioengine(&ioengine_rw);
451a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	register_ioengine(&ioengine_prw);
4521d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	register_ioengine(&ioengine_vrw);
4539a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#ifdef CONFIG_PWRITEV
45407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	register_ioengine(&ioengine_pvrw);
4559a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#endif
456eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2
457eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	register_ioengine(&ioengine_pvrw2);
458eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
4595f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe}
4605f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe
4615f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_exit fio_syncio_unregister(void)
4625f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{
463a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	unregister_ioengine(&ioengine_rw);
464a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai	unregister_ioengine(&ioengine_prw);
4651d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe	unregister_ioengine(&ioengine_vrw);
4669a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#ifdef CONFIG_PWRITEV
46707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe	unregister_ioengine(&ioengine_pvrw);
4689a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#endif
469eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2
470eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	unregister_ioengine(&ioengine_pvrw2);
471eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
4725f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe}
473