Commit | Line | Data |
---|---|---|
cc47f094 | 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_data) | |
11 | static int fio_gf_prep(struct thread_data *td, struct io_u *io_u) | |
12 | { | |
13 | struct fio_file *f = io_u->file; | |
565e784d | 14 | struct gf_data *g = td->io_ops_data; |
cc47f094 | 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 | { | |
565e784d | 34 | struct gf_data *g = td->io_ops_data; |
b29c813f JA |
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); | |
656955eb JA |
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); | |
b29c813f JA |
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; | |
cc47f094 | 71 | |
72 | } | |
73 | ||
74 | static struct ioengine_ops ioengine = { | |
b29c813f JA |
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, | |
38ef9c90 | 83 | .unlink_file = fio_gf_unlink_file, |
b29c813f JA |
84 | .get_file_size = fio_gf_get_file_size, |
85 | .options = gfapi_options, | |
cc47f094 | 86 | .option_struct_size = sizeof(struct gf_options), |
b29c813f | 87 | .flags = FIO_SYNCIO | FIO_DISKLESSIO, |
cc47f094 | 88 | }; |
89 | ||
90 | static void fio_init fio_gf_register(void) | |
91 | { | |
b29c813f | 92 | register_ioengine(&ioengine); |
cc47f094 | 93 | } |
94 | ||
95 | static void fio_exit fio_gf_unregister(void) | |
96 | { | |
b29c813f | 97 | unregister_ioengine(&ioengine); |
cc47f094 | 98 | } |