blob: 3cd4e90ae4debe89bab56fe1e3be191e510832dc [file] [log] [blame]
Jens Axboe2866c822006-10-09 15:57:48 +02001/*
gurudas paia31041e2007-10-23 15:12:30 +02002 * sync/psync engine
Jens Axboeda751ca2007-03-14 10:59:33 +01003 *
4 * IO engine that does regular read(2)/write(2) with lseek(2) to transfer
gurudas paia31041e2007-10-23 15:12:30 +02005 * data and IO engine that does regular pread(2)/pwrite(2) to transfer data.
Jens Axboe2866c822006-10-09 15:57:48 +02006 *
7 */
8#include <stdio.h>
9#include <stdlib.h>
10#include <unistd.h>
11#include <errno.h>
12#include <assert.h>
Jens Axboe5f350952006-11-07 15:20:59 +010013
14#include "../fio.h"
Jens Axboe2866c822006-10-09 15:57:48 +020015
gurudas paia31041e2007-10-23 15:12:30 +020016#define is_psync(td) ((td)->io_ops->data == (void *) 1)
17
Jens Axboe2866c822006-10-09 15:57:48 +020018static int fio_syncio_prep(struct thread_data *td, struct io_u *io_u)
19{
Jens Axboe53cdc682006-10-18 11:50:58 +020020 struct fio_file *f = io_u->file;
21
Jens Axboe87dc1ab2006-10-24 14:41:26 +020022 if (io_u->ddir == DDIR_SYNC)
23 return 0;
Jens Axboe02bcaa82006-11-24 10:42:00 +010024 if (io_u->offset == f->last_completed_pos)
25 return 0;
Jens Axboe87dc1ab2006-10-24 14:41:26 +020026
Jens Axboe53cdc682006-10-18 11:50:58 +020027 if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) {
Jens Axboee1161c32007-02-22 19:36:48 +010028 td_verror(td, errno, "lseek");
Jens Axboe2866c822006-10-09 15:57:48 +020029 return 1;
30 }
31
32 return 0;
33}
34
35static int fio_syncio_queue(struct thread_data *td, struct io_u *io_u)
36{
Jens Axboe53cdc682006-10-18 11:50:58 +020037 struct fio_file *f = io_u->file;
Jens Axboecec6b552007-02-06 20:15:38 +010038 int ret;
Jens Axboe2866c822006-10-09 15:57:48 +020039
Jens Axboe7101d9c2007-09-12 13:12:39 +020040 fio_ro_check(td, io_u);
41
gurudas paia31041e2007-10-23 15:12:30 +020042 if (io_u->ddir == DDIR_READ) {
43 if (is_psync(td))
44 ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen,io_u->offset);
45 else
46 ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
47 } else if (io_u->ddir == DDIR_WRITE) {
48 if (is_psync(td))
49 ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen,io_u->offset);
50 else
51 ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
52 } else
Jens Axboe87dc1ab2006-10-24 14:41:26 +020053 ret = fsync(f->fd);
Jens Axboe2866c822006-10-09 15:57:48 +020054
Jens Axboecec6b552007-02-06 20:15:38 +010055 if (ret != (int) io_u->xfer_buflen) {
Jens Axboe22819ec2007-02-18 07:47:14 +010056 if (ret >= 0) {
Jens Axboecec6b552007-02-06 20:15:38 +010057 io_u->resid = io_u->xfer_buflen - ret;
58 io_u->error = 0;
Jens Axboe36167d82007-02-18 05:41:31 +010059 return FIO_Q_COMPLETED;
Jens Axboe2866c822006-10-09 15:57:48 +020060 } else
61 io_u->error = errno;
62 }
63
Jens Axboe36167d82007-02-18 05:41:31 +010064 if (io_u->error)
Jens Axboee1161c32007-02-22 19:36:48 +010065 td_verror(td, io_u->error, "xfer");
Jens Axboe2866c822006-10-09 15:57:48 +020066
Jens Axboe36167d82007-02-18 05:41:31 +010067 return FIO_Q_COMPLETED;
Jens Axboe2866c822006-10-09 15:57:48 +020068}
69
gurudas paia31041e2007-10-23 15:12:30 +020070static int fio_psyncio_init(struct thread_data *td)
71{
72 td->io_ops->data = (void *) 1;
73 return 0;
74}
75
76static struct ioengine_ops ioengine_rw = {
Jens Axboe2866c822006-10-09 15:57:48 +020077 .name = "sync",
78 .version = FIO_IOOPS_VERSION,
Jens Axboe2866c822006-10-09 15:57:48 +020079 .prep = fio_syncio_prep,
80 .queue = fio_syncio_queue,
Jens Axboeb5af8292007-03-08 12:43:13 +010081 .open_file = generic_open_file,
82 .close_file = generic_close_file,
Jens Axboe2866c822006-10-09 15:57:48 +020083 .flags = FIO_SYNCIO,
84};
Jens Axboe5f350952006-11-07 15:20:59 +010085
gurudas paia31041e2007-10-23 15:12:30 +020086static struct ioengine_ops ioengine_prw = {
87 .name = "psync",
88 .version = FIO_IOOPS_VERSION,
89 .queue = fio_syncio_queue,
90 .init = fio_psyncio_init,
91 .open_file = generic_open_file,
92 .close_file = generic_close_file,
93 .flags = FIO_SYNCIO,
94};
95
Jens Axboe5f350952006-11-07 15:20:59 +010096static void fio_init fio_syncio_register(void)
97{
gurudas paia31041e2007-10-23 15:12:30 +020098 register_ioengine(&ioengine_rw);
99 register_ioengine(&ioengine_prw);
Jens Axboe5f350952006-11-07 15:20:59 +0100100}
101
102static void fio_exit fio_syncio_unregister(void)
103{
gurudas paia31041e2007-10-23 15:12:30 +0200104 unregister_ioengine(&ioengine_rw);
105 unregister_ioengine(&ioengine_prw);
Jens Axboe5f350952006-11-07 15:20:59 +0100106}