[PATCH] Implement file syncing as data direction
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 03a2378d94c9451f13d8b2f9177d5602a91910c3..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,6 +185,7 @@ struct thread_data {
        enum fio_ddir ddir;
        unsigned int iomix;
        unsigned int ioprio;
+       unsigned int last_was_sync;
 
        unsigned char sequential;
        unsigned char odirect;
@@ -359,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];
@@ -497,6 +517,7 @@ extern void io_completed(struct thread_data *, struct io_u *, struct io_completi
 /*
  * 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 *);
@@ -547,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 *);