Blame engines/glusterfs_sync.c

Packit Service 0e769b
/*
Packit Service 0e769b
 * glusterfs engine
Packit Service 0e769b
 *
Packit Service 0e769b
 * IO engine using Glusterfs's gfapi sync interface
Packit Service 0e769b
 *
Packit Service 0e769b
 */
Packit Service 0e769b
Packit Service 0e769b
#include "gfapi.h"
Packit Service 0e769b
Packit Service 0e769b
#define LAST_POS(f)	((f)->engine_pos)
Packit Service 0e769b
static int fio_gf_prep(struct thread_data *td, struct io_u *io_u)
Packit Service 0e769b
{
Packit Service 0e769b
	struct fio_file *f = io_u->file;
Packit Service 0e769b
	struct gf_data *g = td->io_ops_data;
Packit Service 0e769b
Packit Service 0e769b
	dprint(FD_FILE, "fio prep\n");
Packit Service 0e769b
Packit Service 0e769b
	if (!ddir_rw(io_u->ddir))
Packit Service 0e769b
		return 0;
Packit Service 0e769b
Packit Service 0e769b
	if (LAST_POS(f) != -1ULL && LAST_POS(f) == io_u->offset)
Packit Service 0e769b
		return 0;
Packit Service 0e769b
Packit Service 0e769b
	if (glfs_lseek(g->fd, io_u->offset, SEEK_SET) < 0) {
Packit Service 0e769b
		td_verror(td, errno, "lseek");
Packit Service 0e769b
		return 1;
Packit Service 0e769b
	}
Packit Service 0e769b
Packit Service 0e769b
	return 0;
Packit Service 0e769b
}
Packit Service 0e769b
Packit Service 0e769b
static enum fio_q_status fio_gf_queue(struct thread_data *td, struct io_u *io_u)
Packit Service 0e769b
{
Packit Service 0e769b
	struct gf_data *g = td->io_ops_data;
Packit Service 0e769b
	int ret = 0;
Packit Service 0e769b
Packit Service 0e769b
	dprint(FD_FILE, "fio queue len %llu\n", io_u->xfer_buflen);
Packit Service 0e769b
	fio_ro_check(td, io_u);
Packit Service 0e769b
Packit Service 0e769b
	if (io_u->ddir == DDIR_READ)
Packit Service 0e769b
		ret = glfs_read(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0);
Packit Service 0e769b
	else if (io_u->ddir == DDIR_WRITE)
Packit Service 0e769b
		ret = glfs_write(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0);
Packit Service 0e769b
	else if (io_u->ddir == DDIR_SYNC)
Packit Service 0e769b
#if defined(CONFIG_GF_NEW_API)
Packit Service 0e769b
		ret = glfs_fsync(g->fd, NULL, NULL);
Packit Service 0e769b
#else
Packit Service 0e769b
		ret = glfs_fsync(g->fd);
Packit Service 0e769b
#endif
Packit Service 0e769b
	else if (io_u->ddir == DDIR_DATASYNC)
Packit Service 0e769b
#if defined(CONFIG_GF_NEW_API)
Packit Service 0e769b
		ret = glfs_fdatasync(g->fd, NULL, NULL);
Packit Service 0e769b
#else
Packit Service 0e769b
		ret = glfs_fdatasync(g->fd);
Packit Service 0e769b
#endif
Packit Service 0e769b
	else {
Packit Service 0e769b
		log_err("unsupported operation.\n");
Packit Service 0e769b
		io_u->error = EINVAL;
Packit Service 0e769b
		return FIO_Q_COMPLETED;
Packit Service 0e769b
	}
Packit Service 0e769b
	dprint(FD_FILE, "fio len %llu ret %d\n", io_u->xfer_buflen, ret);
Packit Service 0e769b
	if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir))
Packit Service 0e769b
		LAST_POS(io_u->file) = io_u->offset + ret;
Packit Service 0e769b
Packit Service 0e769b
	if (ret != (int)io_u->xfer_buflen) {
Packit Service 0e769b
		if (ret >= 0) {
Packit Service 0e769b
			io_u->resid = io_u->xfer_buflen - ret;
Packit Service 0e769b
			io_u->error = 0;
Packit Service 0e769b
			return FIO_Q_COMPLETED;
Packit Service 0e769b
		} else
Packit Service 0e769b
			io_u->error = errno;
Packit Service 0e769b
	}
Packit Service 0e769b
Packit Service 0e769b
	if (io_u->error) {
Packit Service 0e769b
		log_err("IO failed.\n");
Packit Service 0e769b
		td_verror(td, io_u->error, "xfer");
Packit Service 0e769b
	}
Packit Service 0e769b
Packit Service 0e769b
	return FIO_Q_COMPLETED;
Packit Service 0e769b
Packit Service 0e769b
}
Packit Service 0e769b
Packit Service 0e769b
static struct ioengine_ops ioengine = {
Packit Service 0e769b
	.name = "gfapi",
Packit Service 0e769b
	.version = FIO_IOOPS_VERSION,
Packit Service 0e769b
	.init = fio_gf_setup,
Packit Service 0e769b
	.cleanup = fio_gf_cleanup,
Packit Service 0e769b
	.prep = fio_gf_prep,
Packit Service 0e769b
	.queue = fio_gf_queue,
Packit Service 0e769b
	.open_file = fio_gf_open_file,
Packit Service 0e769b
	.close_file = fio_gf_close_file,
Packit Service 0e769b
	.unlink_file = fio_gf_unlink_file,
Packit Service 0e769b
	.get_file_size = fio_gf_get_file_size,
Packit Service 0e769b
	.options = gfapi_options,
Packit Service 0e769b
	.option_struct_size = sizeof(struct gf_options),
Packit Service 0e769b
	.flags = FIO_SYNCIO | FIO_DISKLESSIO,
Packit Service 0e769b
};
Packit Service 0e769b
Packit Service 0e769b
static void fio_init fio_gf_register(void)
Packit Service 0e769b
{
Packit Service 0e769b
	register_ioengine(&ioengine);
Packit Service 0e769b
}
Packit Service 0e769b
Packit Service 0e769b
static void fio_exit fio_gf_unregister(void)
Packit Service 0e769b
{
Packit Service 0e769b
	unregister_ioengine(&ioengine);
Packit Service 0e769b
}