X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fsync.c;h=87796289dcc9ca0591e265d1eee83696bd2eb034;hb=0303a2613762c630083c4bf7418f7e08c1d552a5;hp=3377f81a627f3578c713f049610151f8c7d218eb;hpb=2b13e716c0921356c0930522718e00b8df34293a;p=fio.git diff --git a/engines/sync.c b/engines/sync.c index 3377f81a..87796289 100644 --- a/engines/sync.c +++ b/engines/sync.c @@ -14,6 +14,11 @@ #include "../fio.h" +/* + * Sync engine uses engine_data to store last offset + */ +#define LAST_POS(f) ((f)->engine_data) + struct syncio_data { struct iovec *iovecs; struct io_u **io_us; @@ -33,7 +38,7 @@ static int fio_syncio_prep(struct thread_data *td, struct io_u *io_u) if (!ddir_rw(io_u->ddir)) return 0; - if (f->file_pos != -1ULL && f->file_pos == io_u->offset) + if (LAST_POS(f) != -1ULL && LAST_POS(f) == io_u->offset) return 0; if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) { @@ -47,7 +52,7 @@ static int fio_syncio_prep(struct thread_data *td, struct io_u *io_u) static int fio_io_end(struct thread_data *td, struct io_u *io_u, int ret) { if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir)) - io_u->file->file_pos = io_u->offset + ret; + LAST_POS(io_u->file) = io_u->offset + ret; if (ret != (int) io_u->xfer_buflen) { if (ret >= 0) { @@ -75,9 +80,10 @@ static int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u) ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); else if (io_u->ddir == DDIR_WRITE) ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); - else if (io_u->ddir == DDIR_TRIM) - ret = do_io_u_trim(td, io_u); - else + else if (io_u->ddir == DDIR_TRIM) { + do_io_u_trim(td, io_u); + return FIO_Q_COMPLETED; + } else ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret); @@ -94,9 +100,10 @@ static int fio_syncio_queue(struct thread_data *td, struct io_u *io_u) ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen); else if (io_u->ddir == DDIR_WRITE) ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen); - else if (io_u->ddir == DDIR_TRIM) - ret = do_io_u_trim(td, io_u); - else + else if (io_u->ddir == DDIR_TRIM) { + do_io_u_trim(td, io_u); + return FIO_Q_COMPLETED; + } else ret = do_io_u_sync(td, io_u); return fio_io_end(td, io_u, ret);