From a467027e1c8ae59053bf24eafdceb22f09391028 Mon Sep 17 00:00:00 2001 From: Dmitry Monakhov Date: Fri, 7 Apr 2017 07:59:01 +0300 Subject: [PATCH] engine: add ftruncate ioengine Currently fio does many things but it still cannot substitute fsx because it does not support ftruncate. Let's add this. --- Makefile | 1 + engines/ftruncate.c | 56 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 engines/ftruncate.c diff --git a/Makefile b/Makefile index 37150c69..66083ffc 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,7 @@ SOURCE := $(patsubst $(SRCDIR)/%,%,$(wildcard $(SRCDIR)/crc/*.c)) \ eta.c verify.c memory.c io_u.c parse.c mutex.c options.c \ smalloc.c filehash.c profile.c debug.c engines/cpu.c \ engines/mmap.c engines/sync.c engines/null.c engines/net.c \ + engines/ftruncate.c \ server.c client.c iolog.c backend.c libfio.c flow.c cconv.c \ gettime-thread.c helpers.c json.c idletime.c td_error.c \ profiles/tiobench.c profiles/act.c io_u_queue.c filelock.c \ diff --git a/engines/ftruncate.c b/engines/ftruncate.c new file mode 100644 index 00000000..e86dbac0 --- /dev/null +++ b/engines/ftruncate.c @@ -0,0 +1,56 @@ +/* + * ftruncate: ioengine for git://git.kernel.dk/fio.git + * + * IO engine that does regular truncates to simulate data transfer + * as fio ioengine. + * DDIR_WRITE does ftruncate + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "../fio.h" +#include "../filehash.h" + +static int fio_ftruncate_queue(struct thread_data *td, struct io_u *io_u) +{ + struct fio_file *f = io_u->file; + int ret; + fio_ro_check(td, io_u); + + if (io_u->ddir != DDIR_WRITE) { + io_u->error = EINVAL; + return FIO_Q_COMPLETED; + } + ret = ftruncate(f->fd, io_u->offset); + + if (ret) + io_u->error = errno; + + return FIO_Q_COMPLETED; +} + +static struct ioengine_ops ioengine = { + .name = "ftruncate", + .version = FIO_IOOPS_VERSION, + .queue = fio_ftruncate_queue, + .open_file = generic_open_file, + .close_file = generic_close_file, + .get_file_size = generic_get_file_size, + .flags = FIO_SYNCIO | FIO_FAKEIO +}; + +static void fio_init fio_syncio_register(void) +{ + register_ioengine(&ioengine); +} + +static void fio_exit fio_syncio_unregister(void) +{ + unregister_ioengine(&ioengine); +} -- 2.25.1