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