X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Fmmap.c;h=3e1e6c8d9a38c5e4536cb34985680f6e6c9694cb;hp=da6906947764ba099c377be51bae7c231b070ee6;hb=28cfeb6851703cf12b54b3a06bf3ff611198933e;hpb=7bb48f84ac78cac1f90e3e04d0220d90d6a64a6b diff --git a/engines/mmap.c b/engines/mmap.c index da690694..3e1e6c8d 100644 --- a/engines/mmap.c +++ b/engines/mmap.c @@ -13,13 +13,14 @@ #include #include "../fio.h" -#include "../os.h" 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) @@ -61,6 +62,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)) { @@ -100,14 +107,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 = {