[PATCH] Implement file syncing as data direction
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 6ecb11cf9cae333cee0c9fb4333e6ca27993a610..967c42e678b899030df7b6b0229a8e39cc8706ad 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -66,14 +66,20 @@ struct io_u {
        char *buf;
        unsigned int buflen;
        unsigned long long offset;
-       unsigned int index;
 
        unsigned int resid;
        unsigned int error;
 
-       unsigned char seen;
        unsigned char ddir;
 
+       /*
+        * io engine private data
+        */
+       union {
+               unsigned int index;
+               unsigned int seen;
+       };
+
        struct fio_file *file;
 
        struct list_head list;
@@ -107,6 +113,7 @@ struct group_run_stats {
 enum fio_ddir {
        DDIR_READ = 0,
        DDIR_WRITE,
+       DDIR_SYNC,
 };
 
 /*
@@ -151,8 +158,6 @@ struct fio_file {
 
        unsigned long *file_map;
        unsigned int num_maps;
-
-       int fileno;
 };
 
 /*
@@ -161,6 +166,7 @@ struct fio_file {
 struct thread_data {
        char name[32];
        char *directory;
+       char *filename;
        char verror[80];
        pthread_t thread;
        int thread_number;
@@ -168,6 +174,7 @@ struct thread_data {
        enum fio_filetype filetype;
        struct fio_file *files;
        unsigned int nr_files;
+       unsigned int nr_uniq_files;
        unsigned int next_file;
        int error;
        pid_t pid;
@@ -178,10 +185,10 @@ struct thread_data {
        enum fio_ddir ddir;
        unsigned int iomix;
        unsigned int ioprio;
+       unsigned int last_was_sync;
 
        unsigned char sequential;
        unsigned char odirect;
-       unsigned char create_file;
        unsigned char invalidate_cache;
        unsigned char create_serialize;
        unsigned char create_fsync;
@@ -193,6 +200,8 @@ struct thread_data {
        unsigned char do_disk_util;
        unsigned char override_sync;
        unsigned char rand_repeatable;
+       unsigned char write_lat_log;
+       unsigned char write_bw_log;
 
        unsigned int bs;
        unsigned int min_bs;
@@ -334,12 +343,7 @@ struct thread_data {
 #define td_verror(td, err)     __td_verror((td), (err), strerror((err)))
 #define td_vmsg(td, err, msg)  __td_verror((td), (err), (msg))
 
-extern struct io_u *__get_io_u(struct thread_data *);
-extern void put_io_u(struct thread_data *, struct io_u *);
-
 extern int rate_quit;
-extern int write_lat_log;
-extern int write_bw_log;
 extern int exitall_on_terminate;
 extern int thread_number;
 extern int shm_id;
@@ -363,6 +367,18 @@ extern struct thread_data *threads;
 
 #define MAX_JOBS       (1024)
 
+static inline int should_fsync(struct thread_data *td)
+{
+       if (td->last_was_sync)
+               return 0;
+       if (td->odirect)
+               return 0;
+       if (td_write(td) || td_rw(td) || td->override_sync)
+               return 1;
+
+       return 0;
+}
+
 struct disk_util_stat {
        unsigned ios[2];
        unsigned merges[2];
@@ -480,6 +496,33 @@ extern void populate_verify_io_u(struct thread_data *, struct io_u *);
 extern int get_next_verify(struct thread_data *td, struct io_u *);
 extern int do_io_u_verify(struct thread_data *, struct io_u **);
 
+/*
+ * Memory helpers
+ */
+extern int fio_pin_memory(void);
+extern void fio_unpin_memory(void);
+extern int allocate_io_mem(struct thread_data *);
+extern void free_io_mem(struct thread_data *);
+
+/*
+ * io unit handling
+ */
+#define queue_full(td) list_empty(&(td)->io_u_freelist)
+extern struct io_u *__get_io_u(struct thread_data *);
+extern struct io_u *get_io_u(struct thread_data *, struct fio_file *);
+extern void put_io_u(struct thread_data *, struct io_u *);
+extern void ios_completed(struct thread_data *, struct io_completion_data *);
+extern void io_completed(struct thread_data *, struct io_u *, struct io_completion_data *);
+
+/*
+ * io engine entry points
+ */
+extern int td_io_init(struct thread_data *);
+extern int td_io_prep(struct thread_data *, struct io_u *);
+extern int td_io_queue(struct thread_data *, struct io_u *);
+extern int td_io_sync(struct thread_data *, struct fio_file *);
+extern int td_io_getevents(struct thread_data *, int, int, struct timespec *);
+
 /*
  * This is a pretty crappy semaphore implementation, but with the use that fio
  * has (just signalling start/go conditions), it doesn't have to be better.
@@ -525,12 +568,11 @@ struct ioengine_ops {
        struct io_u *(*event)(struct thread_data *, int);
        int (*cancel)(struct thread_data *, struct io_u *);
        void (*cleanup)(struct thread_data *);
-       int (*sync)(struct thread_data *, struct fio_file *);
        void *data;
        void *dlhandle;
 };
 
-#define FIO_IOOPS_VERSION      2
+#define FIO_IOOPS_VERSION      3
 
 extern struct ioengine_ops *load_ioengine(struct thread_data *, char *);
 extern void close_ioengine(struct thread_data *);
@@ -540,7 +582,9 @@ extern void close_ioengine(struct thread_data *);
  */
 #define fio_unused     __attribute((__unused__))
 
+#define for_each_td(td, i)     \
+       for ((i) = 0, (td) = &threads[0]; (i) < (int) thread_number; (i)++, (td)++)
 #define for_each_file(td, f, i)        \
-       for ((i) = 0, (f) = &(td)->files[0]; (i) < (td)->nr_files; (i)++, (f) = &(td)->files[(i)])
+       for ((i) = 0, (f) = &(td)->files[0]; (i) < (int) (td)->nr_files; (i)++, (f)++)
 
 #endif