From 0a28ecda80a78c9d70ae38ced58f3a2fa9c9529d Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 9 Mar 2010 21:40:38 +0100 Subject: [PATCH] Abstract out generic sync helper Signed-off-by: Jens Axboe --- engines/sync.c | 34 +++++++--------------------------- ioengine.h | 2 +- ioengines.c | 25 ++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/engines/sync.c b/engines/sync.c index a673ae9e..5194f0f8 100644 --- a/engines/sync.c +++ b/engines/sync.c @@ -64,29 +64,6 @@ static int fio_io_end(struct thread_data *td, struct io_u *io_u, int ret) return FIO_Q_COMPLETED; } -static int fio_syncio_sync(struct thread_data *td, struct io_u *io_u) -{ - int ret; - - if (io_u->ddir == DDIR_SYNC) { - ret = fsync(io_u->file->fd); - } else if (io_u->ddir == DDIR_DATASYNC) { -#ifdef FIO_HAVE_FDATASYNC - ret = fdatasync(io_u->file->fd); -#else - ret = io_u->xfer_buflen; - io_u->error = EINVAL; -#endif - } else if (io_u->ddir == DDIR_SYNC_FILE_RANGE) - ret = do_sync_file_range(td, io_u->file); - else { - ret = io_u->xfer_buflen; - io_u->error = EINVAL; - } - - return fio_io_end(td, io_u, ret); -} - static int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u) { struct fio_file *f = io_u->file; @@ -99,7 +76,7 @@ static int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u) else if (io_u->ddir == DDIR_WRITE) ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); else - return fio_syncio_sync(td, io_u); + ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret); } @@ -116,7 +93,7 @@ static int fio_syncio_queue(struct thread_data *td, struct io_u *io_u) else if (io_u->ddir == DDIR_WRITE) ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen); else - return fio_syncio_sync(td, io_u); + ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret); } @@ -186,8 +163,11 @@ static int fio_vsyncio_queue(struct thread_data *td, struct io_u *io_u) */ if (sd->queued) return FIO_Q_BUSY; - if (ddir_sync(io_u->ddir)) - return fio_syncio_sync(td, io_u); + if (ddir_sync(io_u->ddir)) { + int ret = do_io_u_sync(td, io_u); + + return fio_io_end(td, io_u, ret); + } sd->queued = 0; sd->queued_bytes = 0; diff --git a/ioengine.h b/ioengine.h index 5acfbd20..91dd429e 100644 --- a/ioengine.h +++ b/ioengine.h @@ -153,7 +153,7 @@ extern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int void io_u_mark_complete(struct thread_data *, unsigned int); void io_u_mark_submit(struct thread_data *, unsigned int); -int do_sync_file_range(struct thread_data *, struct fio_file *); +int do_io_u_sync(struct thread_data *, struct io_u *); #ifdef FIO_INC_DEBUG static inline void dprint_io_u(struct io_u *io_u, const char *p) diff --git a/ioengines.c b/ioengines.c index de934971..155649b4 100644 --- a/ioengines.c +++ b/ioengines.c @@ -432,7 +432,7 @@ int td_io_get_file_size(struct thread_data *td, struct fio_file *f) return td->io_ops->get_file_size(td, f); } -int do_sync_file_range(struct thread_data *td, struct fio_file *f) +static int do_sync_file_range(struct thread_data *td, struct fio_file *f) { off64_t offset, nbytes; @@ -444,3 +444,26 @@ int do_sync_file_range(struct thread_data *td, struct fio_file *f) return sync_file_range(f->fd, offset, nbytes, td->o.sync_file_range); } + +int do_io_u_sync(struct thread_data *td, struct io_u *io_u) +{ + int ret; + + if (io_u->ddir == DDIR_SYNC) { + ret = fsync(io_u->file->fd); + } else if (io_u->ddir == DDIR_DATASYNC) { +#ifdef FIO_HAVE_FDATASYNC + ret = fdatasync(io_u->file->fd); +#else + ret = io_u->xfer_buflen; + io_u->error = EINVAL; +#endif + } else if (io_u->ddir == DDIR_SYNC_FILE_RANGE) + ret = do_sync_file_range(td, io_u->file); + else { + ret = io_u->xfer_buflen; + io_u->error = EINVAL; + } + + return ret; +} -- 2.25.1