FIO_SYNCIO = 1 << 0,
FIO_CPUIO = 1 << 1,
FIO_MMAPIO = 1 << 2,
+ FIO_RAWIO = 1 << 3,
};
struct fio_file {
unsigned long *file_map;
unsigned int num_maps;
+
+ int fileno;
};
/*
unsigned char sync_io;
unsigned char verify;
unsigned char use_thread;
+ unsigned char unlink;
unsigned char do_disk_util;
unsigned char override_sync;
unsigned char rand_repeatable;
/*
* Time functions
*/
+extern void time_init(void);
extern unsigned long utime_since(struct timeval *, struct timeval *);
extern unsigned long mtime_since(struct timeval *, struct timeval *);
extern unsigned long mtime_since_now(struct timeval *);
extern unsigned long time_since_now(struct timeval *);
+extern unsigned long mtime_since_genesis(void);
extern void __usec_sleep(unsigned int);
extern void usec_sleep(struct thread_data *, unsigned long);
extern void rate_throttle(struct thread_data *, unsigned long, unsigned int);
extern void close_files(struct thread_data *);
extern int setup_files(struct thread_data *);
+/*
+ * ETA/status stuff
+ */
+extern void print_thread_status(void);
+extern void print_status_init(int);
+
+/*
+ * Thread life cycle. Once a thread has a runstate beyond TD_INITIALIZED, it
+ * will never back again. It may cycle between running/verififying/fsyncing.
+ * Once the thread reaches TD_EXITED, it is just waiting for the core to
+ * reap it.
+ */
+enum {
+ TD_NOT_CREATED = 0,
+ TD_CREATED,
+ TD_INITIALIZED,
+ TD_RUNNING,
+ TD_VERIFYING,
+ TD_FSYNCING,
+ TD_EXITED,
+ TD_REAPED,
+};
+
/*
* 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.
#define fio_unused __attribute((__unused__))
#define for_each_file(td, f, i) \
- for ((i) = 0, (f) = &(td)->files[(i)]; (i) < (td)->nr_files; (i)++, (f) = &(td)->files[(i)])
+ for ((i) = 0, (f) = &(td)->files[0]; (i) < (td)->nr_files; (i)++, (f) = &(td)->files[(i)])
#endif