#ifndef FIO_VERIFY_STATE_H #define FIO_VERIFY_STATE_H #include #include #include #include "lib/nowarn_snprintf.h" struct thread_rand32_state { uint32_t s[4]; }; struct thread_rand64_state { uint64_t s[6]; }; struct thread_rand_state { uint64_t use64; union { struct thread_rand32_state state32; struct thread_rand64_state state64; }; }; /* * For dumping current write state */ struct file_comp { uint64_t fileno; uint64_t offset; }; struct thread_io_list { uint64_t no_comps; uint32_t depth; uint32_t nofiles; uint64_t numberio; uint64_t index; struct thread_rand_state rand; uint8_t name[64]; struct file_comp comps[0]; }; struct all_io_list { uint64_t threads; struct thread_io_list state[0]; }; #define VSTATE_HDR_VERSION 0x03 struct verify_state_hdr { uint64_t version; uint64_t size; uint64_t crc; }; #define IO_LIST_ALL 0xffffffff struct io_u; extern struct all_io_list *get_all_io_list(int, size_t *); extern void __verify_save_state(struct all_io_list *, const char *); extern void verify_save_state(int mask); extern int verify_load_state(struct thread_data *, const char *); extern void verify_free_state(struct thread_data *); extern int verify_state_should_stop(struct thread_data *, struct io_u *); extern void verify_assign_state(struct thread_data *, void *); extern int verify_state_hdr(struct verify_state_hdr *, struct thread_io_list *); static inline size_t __thread_io_list_sz(uint32_t depth, uint32_t nofiles) { return sizeof(struct thread_io_list) + depth * nofiles * sizeof(struct file_comp); } static inline size_t thread_io_list_sz(struct thread_io_list *s) { return __thread_io_list_sz(le32_to_cpu(s->depth), le32_to_cpu(s->nofiles)); } static inline struct thread_io_list *io_list_next(struct thread_io_list *s) { return (struct thread_io_list *)((char *) s + thread_io_list_sz(s)); } static inline void verify_state_gen_name(char *out, size_t size, const char *name, const char *prefix, int num) { char ename[PATH_MAX]; char *ptr; /* * Escape '/', just turn them into '.' */ ptr = ename; do { *ptr = *name; if (*ptr == '\0') break; else if (*ptr == '/') *ptr = '.'; ptr++; name++; } while (1); nowarn_snprintf(out, size, "%s-%s-%d-verify.state", prefix, ename, num); out[size - 1] = '\0'; } #endif