Add option to select how to service multiple files
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index c1c71465b8789ada64ebf51a8c611358ca1e6fac..8c46b3f905b2d9eb5b320ca96d05e2b8117b8e8d 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -280,7 +280,10 @@ struct thread_data {
        struct fio_file *files;
        unsigned int nr_files;
        unsigned int nr_uniq_files;
-       unsigned int next_file;
+       union {
+               unsigned int next_file;
+               os_random_state_t next_file_state;
+       };
        int error;
        pid_t pid;
        char *orig_buffer;
@@ -340,6 +343,7 @@ struct thread_data {
        unsigned int rwmixread;
        unsigned int rwmixwrite;
        unsigned int nice;
+       unsigned int file_service_type;
 
        char *read_iolog_file;
        char *write_iolog_file;
@@ -436,6 +440,14 @@ struct thread_data {
        struct itimerval timer;
 };
 
+/*
+ * roundrobin available files, or choose one at random.
+ */
+enum {
+       FIO_FSERVICE_RANDOM     = 1,
+       FIO_FSERVICE_RR         = 2,
+};
+
 /*
  * 30 second per-io_u timeout, with 5 second intervals to avoid resetting
  * the timer on each queue operation.
@@ -443,18 +455,20 @@ struct thread_data {
 #define IO_U_TIMEOUT_INC       5
 #define IO_U_TIMEOUT           30
 
-#define __td_verror(td, err, msg)                                      \
+#define __td_verror(td, err, msg, func)                                        \
        do {                                                            \
                if ((td)->error)                                        \
                        break;                                          \
                int e = (err);                                          \
                (td)->error = e;                                        \
-               snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, error=%s", __FILE__, __LINE__, (msg));        \
+               snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg));       \
        } while (0)
 
 
-#define td_verror(td, err)     __td_verror((td), (err), strerror((err)))
-#define td_vmsg(td, err, msg)  __td_verror((td), (err), (msg))
+#define td_verror(td, err, func)       \
+       __td_verror((td), (err), strerror((err)), (func))
+#define td_vmsg(td, err, msg, func)    \
+       __td_verror((td), (err), (msg), (func))
 
 extern int exitall_on_terminate;
 extern int thread_number;
@@ -577,6 +591,7 @@ extern void usec_sleep(struct thread_data *, unsigned long);
 extern void rate_throttle(struct thread_data *, unsigned long, unsigned int, int);
 extern void fill_start_time(struct timeval *);
 extern void fio_gettime(struct timeval *, void *);
+extern void set_genesis_time(void);
 
 /*
  * Init functions