return 0;
}
+static int fio_rbd_invalidate(struct thread_data *td, struct fio_file *f)
+{
+ return 0;
+}
+
static void fio_rbd_io_u_free(struct thread_data *td, struct io_u *io_u)
{
struct fio_rbd_iou *o = io_u->engine_data;
}
static struct ioengine_ops ioengine = {
- .name = "rbd",
- .version = FIO_IOOPS_VERSION,
- .setup = fio_rbd_setup,
- .init = fio_rbd_init,
- .queue = fio_rbd_queue,
- .getevents = fio_rbd_getevents,
- .event = fio_rbd_event,
- .cleanup = fio_rbd_cleanup,
- .open_file = fio_rbd_open,
- .options = options,
- .io_u_init = fio_rbd_io_u_init,
- .io_u_free = fio_rbd_io_u_free,
- .option_struct_size = sizeof(struct rbd_options),
+ .name = "rbd",
+ .version = FIO_IOOPS_VERSION,
+ .setup = fio_rbd_setup,
+ .init = fio_rbd_init,
+ .queue = fio_rbd_queue,
+ .getevents = fio_rbd_getevents,
+ .event = fio_rbd_event,
+ .cleanup = fio_rbd_cleanup,
+ .open_file = fio_rbd_open,
+ .invalidate = fio_rbd_invalidate,
+ .options = options,
+ .io_u_init = fio_rbd_io_u_init,
+ .io_u_free = fio_rbd_io_u_free,
+ .option_struct_size = sizeof(struct rbd_options),
};
static void fio_init fio_rbd_register(void)
dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
len);
- if (f->mmap_ptr) {
+ if (td->io_ops->invalidate)
+ ret = td->io_ops->invalidate(td, f);
+ else if (f->mmap_ptr) {
ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
#ifdef FIO_MADV_FREE
if (f->filetype == FIO_TYPE_BD)
#include <guasi.h>
#endif
-#define FIO_IOOPS_VERSION 18
+#define FIO_IOOPS_VERSION 19
enum {
IO_U_F_FREE = 1 << 0,
void (*cleanup)(struct thread_data *);
int (*open_file)(struct thread_data *, struct fio_file *);
int (*close_file)(struct thread_data *, struct fio_file *);
+ int (*invalidate)(struct thread_data *, struct fio_file *);
int (*get_file_size)(struct thread_data *, struct fio_file *);
void (*terminate)(struct thread_data *);
int (*io_u_init)(struct thread_data *, struct io_u *);