#include <unistd.h>
#include <string.h>
#include <getopt.h>
+#include <inttypes.h>
#include "compiler/compiler.h"
#include "list.h"
#include "fifo.h"
#include "rbtree.h"
-#include "md5.h"
-#include "crc32.h"
#include "arch/arch.h"
#include "os/os.h"
#include "mutex.h"
DDIR_READ = 0,
DDIR_WRITE,
DDIR_SYNC,
+ DDIR_INVAL = -1,
};
enum td_ddir {
struct rb_node rb_node;
struct list_head list;
};
- struct fio_file *file;
+ union {
+ int fileno;
+ struct fio_file *file;
+ };
unsigned long long offset;
unsigned long len;
enum fio_ddir ddir;
- unsigned long delay;
+ union {
+ unsigned long delay;
+ unsigned int file_action;
+ };
};
#ifdef FIO_HAVE_SYSLET
* Callback for io completion
*/
int (*end_io)(struct thread_data *, struct io_u *);
+
+ /*
+ * Called when io_u is about to be freed
+ */
+ void (*unmap)(struct thread_data *, struct io_u *);
};
/*
enum {
VERIFY_NONE = 0, /* no verification */
VERIFY_MD5, /* md5 sum data blocks */
+ VERIFY_CRC64, /* crc64 sum data blocks */
VERIFY_CRC32, /* crc32 sum data blocks */
+ VERIFY_CRC16, /* crc16 sum data blocks */
+ VERIFY_CRC7, /* crc7 sum data blocks */
+ VERIFY_SHA256, /* sha256 sum data blocks */
+ VERIFY_SHA512, /* sha512 sum data blocks */
+ VERIFY_META, /* block_num, timestamp etc. */
+ VERIFY_PATTERN, /* verify a specific pattern */
VERIFY_NULL, /* pretend to verify */
};
/*
- * A header structure associated with each checksummed data block
+ * A header structure associated with each checksummed data block. It is
+ * followed by a checksum specific header that contains the verification
+ * data.
*/
struct verify_header {
unsigned int fio_magic;
unsigned int len;
unsigned int verify_type;
- union {
- char md5_digest[MD5_HASH_WORDS * 4];
- unsigned long crc32;
- };
+};
+
+struct vhdr_md5 {
+ uint32_t md5_digest[16];
+};
+struct vhdr_sha512 {
+ uint8_t sha512[128];
+};
+struct vhdr_sha256 {
+ uint8_t sha256[128];
+};
+struct vhdr_crc64 {
+ uint64_t crc64;
+};
+struct vhdr_crc32 {
+ uint32_t crc32;
+};
+struct vhdr_crc16 {
+ uint16_t crc16;
+};
+struct vhdr_crc7 {
+ uint8_t crc7;
+};
+struct vhdr_meta {
+ uint64_t offset;
+ unsigned char thread;
+ unsigned short numberio;
+ unsigned long time_sec;
+ unsigned long time_usec;
};
struct group_run_stats {
FIO_DISKLESSIO = 1 << 2, /* no disk involved */
FIO_NOEXTEND = 1 << 3, /* engine can't extend file */
FIO_NODISKUTIL = 1 << 4, /* diskutil can't handle filename */
+ FIO_UNIDIR = 1 << 5, /* engine is uni-directional */
};
enum fio_file_flags {
unsigned int end_fsync;
unsigned int sync_io;
unsigned int verify;
+ unsigned int do_verify;
unsigned int verifysort;
+ unsigned int verify_interval;
+ unsigned int verify_offset;
+ unsigned int verify_pattern;
+ unsigned int verify_pattern_bytes;
+ unsigned int verify_fatal;
unsigned int use_thread;
unsigned int unlink;
unsigned int do_disk_util;
os_random_state_t next_file_state;
};
int error;
+ int done;
pid_t pid;
char *orig_buffer;
size_t orig_buffer_size;
unsigned long io_issues[2];
unsigned long long io_blocks[2];
unsigned long long io_bytes[2];
+ unsigned long long io_skip_bytes;
unsigned long long this_io_bytes[2];
unsigned long long zone_bytes;
struct fio_sem *mutex;
/*
* Log exports
*/
+enum file_log_act {
+ FIO_LOG_ADD_FILE,
+ FIO_LOG_OPEN_FILE,
+ FIO_LOG_CLOSE_FILE,
+};
+
extern int __must_check read_iolog_get(struct thread_data *, struct io_u *);
-extern void write_iolog_put(struct thread_data *, struct io_u *);
+extern void log_io_u(struct thread_data *, struct io_u *);
+extern void log_file(struct thread_data *, struct fio_file *, enum file_log_act);
extern int __must_check init_iolog(struct thread_data *td);
extern void log_io_piece(struct thread_data *, struct io_u *);
extern void prune_io_piece_log(struct thread_data *);
extern int __must_check file_invalidate_cache(struct thread_data *, struct fio_file *);
extern int __must_check generic_open_file(struct thread_data *, struct fio_file *);
extern void generic_close_file(struct thread_data *, struct fio_file *);
-extern void add_file(struct thread_data *, const char *);
+extern int add_file(struct thread_data *, const char *);
extern void get_file(struct fio_file *);
extern void put_file(struct thread_data *, struct fio_file *);
extern int add_dir_files(struct thread_data *, const char *);
extern int init_random_map(struct thread_data *);
extern void dup_files(struct thread_data *, struct thread_data *);
+extern int get_fileno(struct thread_data *, const char *);
+extern void free_release_files(struct thread_data *);
/*
* ETA/status stuff