X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fmmap.c;h=dffad90bbff8b2d357f9690b16c391cce1989da2;hb=3776041ebbd9b19ebaf90b9951a1dbc085fa9325;hp=95ad1d842250049162564a078864070cc28c8f2e;hpb=317b95d07d4921d2594a1be6e014c9c2d062fe75;p=fio.git diff --git a/engines/mmap.c b/engines/mmap.c index 95ad1d84..dffad90b 100644 --- a/engines/mmap.c +++ b/engines/mmap.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "../fio.h" @@ -19,6 +18,8 @@ static int fio_mmapio_queue(struct thread_data *td, struct io_u *io_u) struct fio_file *f = io_u->file; unsigned long long real_off = io_u->offset - f->file_offset; + fio_ro_check(td, io_u); + if (io_u->ddir == DDIR_READ) memcpy(io_u->xfer_buf, f->mmap + real_off, io_u->xfer_buflen); else if (io_u->ddir == DDIR_WRITE) @@ -60,6 +61,12 @@ static int fio_mmapio_open(struct thread_data *td, struct fio_file *f) if (ret) return ret; + /* + * for size checkup, don't mmap anything. + */ + if (!f->io_size) + return 0; + if (td_rw(td)) flags = PROT_READ | PROT_WRITE; else if (td_write(td)) { @@ -99,14 +106,23 @@ err: return 1; } -static void fio_mmapio_close(struct thread_data fio_unused *td, - struct fio_file *f) +static int fio_mmapio_close(struct thread_data fio_unused *td, + struct fio_file *f) { + int ret = 0, ret2; + if (f->mmap) { - munmap(f->mmap, f->io_size); + if (munmap(f->mmap, f->io_size) < 0) + ret = errno; + f->mmap = NULL; } - generic_close_file(td, f); + + ret2 = generic_close_file(td, f); + if (!ret && ret2) + ret = ret2; + + return ret; } static struct ioengine_ops ioengine = { @@ -115,6 +131,7 @@ static struct ioengine_ops ioengine = { .queue = fio_mmapio_queue, .open_file = fio_mmapio_open, .close_file = fio_mmapio_close, + .get_file_size = generic_get_file_size, .flags = FIO_SYNCIO | FIO_NOEXTEND, };