Home | History | Annotate | Download | only in engines
      1 /*
      2  * glusterfs engine
      3  *
      4  * IO engine using Glusterfs's gfapi sync interface
      5  *
      6  */
      7 
      8 #include "gfapi.h"
      9 
     10 #define LAST_POS(f)	((f)->engine_pos)
     11 static int fio_gf_prep(struct thread_data *td, struct io_u *io_u)
     12 {
     13 	struct fio_file *f = io_u->file;
     14 	struct gf_data *g = td->io_ops_data;
     15 
     16 	dprint(FD_FILE, "fio prep\n");
     17 
     18 	if (!ddir_rw(io_u->ddir))
     19 		return 0;
     20 
     21 	if (LAST_POS(f) != -1ULL && LAST_POS(f) == io_u->offset)
     22 		return 0;
     23 
     24 	if (glfs_lseek(g->fd, io_u->offset, SEEK_SET) < 0) {
     25 		td_verror(td, errno, "lseek");
     26 		return 1;
     27 	}
     28 
     29 	return 0;
     30 }
     31 
     32 static int fio_gf_queue(struct thread_data *td, struct io_u *io_u)
     33 {
     34 	struct gf_data *g = td->io_ops_data;
     35 	int ret = 0;
     36 
     37 	dprint(FD_FILE, "fio queue len %lu\n", io_u->xfer_buflen);
     38 	fio_ro_check(td, io_u);
     39 
     40 	if (io_u->ddir == DDIR_READ)
     41 		ret = glfs_read(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0);
     42 	else if (io_u->ddir == DDIR_WRITE)
     43 		ret = glfs_write(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0);
     44 	else if (io_u->ddir == DDIR_SYNC)
     45 		ret = glfs_fsync(g->fd);
     46 	else if (io_u->ddir == DDIR_DATASYNC)
     47 		ret = glfs_fdatasync(g->fd);
     48 	else {
     49 		log_err("unsupported operation.\n");
     50 		return -EINVAL;
     51 	}
     52 	dprint(FD_FILE, "fio len %lu ret %d\n", io_u->xfer_buflen, ret);
     53 	if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir))
     54 		LAST_POS(io_u->file) = io_u->offset + ret;
     55 
     56 	if (ret != (int)io_u->xfer_buflen) {
     57 		if (ret >= 0) {
     58 			io_u->resid = io_u->xfer_buflen - ret;
     59 			io_u->error = 0;
     60 			return FIO_Q_COMPLETED;
     61 		} else
     62 			io_u->error = errno;
     63 	}
     64 
     65 	if (io_u->error) {
     66 		log_err("IO failed.\n");
     67 		td_verror(td, io_u->error, "xfer");
     68 	}
     69 
     70 	return FIO_Q_COMPLETED;
     71 
     72 }
     73 
     74 static struct ioengine_ops ioengine = {
     75 	.name = "gfapi",
     76 	.version = FIO_IOOPS_VERSION,
     77 	.init = fio_gf_setup,
     78 	.cleanup = fio_gf_cleanup,
     79 	.prep = fio_gf_prep,
     80 	.queue = fio_gf_queue,
     81 	.open_file = fio_gf_open_file,
     82 	.close_file = fio_gf_close_file,
     83 	.unlink_file = fio_gf_unlink_file,
     84 	.get_file_size = fio_gf_get_file_size,
     85 	.options = gfapi_options,
     86 	.option_struct_size = sizeof(struct gf_options),
     87 	.flags = FIO_SYNCIO | FIO_DISKLESSIO,
     88 };
     89 
     90 static void fio_init fio_gf_register(void)
     91 {
     92 	register_ioengine(&ioengine);
     93 }
     94 
     95 static void fio_exit fio_gf_unregister(void)
     96 {
     97 	unregister_ioengine(&ioengine);
     98 }
     99