1 #ifndef FIO_VERIFY_STATE_H 2 #define FIO_VERIFY_STATE_H 3 4 #include <stdint.h> 5 #include <string.h> 6 #include <limits.h> 7 8 struct thread_rand32_state { 9 uint32_t s[4]; 10 }; 11 12 struct thread_rand64_state { 13 uint64_t s[6]; 14 }; 15 16 struct thread_rand_state { 17 uint64_t use64; 18 union { 19 struct thread_rand32_state state32; 20 struct thread_rand64_state state64; 21 }; 22 }; 23 24 /* 25 * For dumping current write state 26 */ 27 struct file_comp { 28 uint64_t fileno; 29 uint64_t offset; 30 }; 31 32 struct thread_io_list { 33 uint64_t no_comps; 34 uint32_t depth; 35 uint32_t nofiles; 36 uint64_t numberio; 37 uint64_t index; 38 struct thread_rand_state rand; 39 uint8_t name[64]; 40 struct file_comp comps[0]; 41 }; 42 43 struct all_io_list { 44 uint64_t threads; 45 struct thread_io_list state[0]; 46 }; 47 48 #define VSTATE_HDR_VERSION 0x03 49 50 struct verify_state_hdr { 51 uint64_t version; 52 uint64_t size; 53 uint64_t crc; 54 }; 55 56 #define IO_LIST_ALL 0xffffffff 57 58 struct io_u; 59 extern struct all_io_list *get_all_io_list(int, size_t *); 60 extern void __verify_save_state(struct all_io_list *, const char *); 61 extern void verify_save_state(int mask); 62 extern int verify_load_state(struct thread_data *, const char *); 63 extern void verify_free_state(struct thread_data *); 64 extern int verify_state_should_stop(struct thread_data *, struct io_u *); 65 extern void verify_assign_state(struct thread_data *, void *); 66 extern int verify_state_hdr(struct verify_state_hdr *, struct thread_io_list *); 67 68 static inline size_t __thread_io_list_sz(uint32_t depth, uint32_t nofiles) 69 { 70 return sizeof(struct thread_io_list) + depth * nofiles * sizeof(struct file_comp); 71 } 72 73 static inline size_t thread_io_list_sz(struct thread_io_list *s) 74 { 75 return __thread_io_list_sz(le32_to_cpu(s->depth), le32_to_cpu(s->nofiles)); 76 } 77 78 static inline struct thread_io_list *io_list_next(struct thread_io_list *s) 79 { 80 return (void *) s + thread_io_list_sz(s); 81 } 82 83 static inline void verify_state_gen_name(char *out, size_t size, 84 const char *name, const char *prefix, 85 int num) 86 { 87 char ename[PATH_MAX]; 88 char *ptr; 89 90 /* 91 * Escape '/', just turn them into '.' 92 */ 93 ptr = ename; 94 do { 95 *ptr = *name; 96 if (*ptr == '\0') 97 break; 98 else if (*ptr == '/') 99 *ptr = '.'; 100 ptr++; 101 name++; 102 } while (1); 103 104 snprintf(out, size, "%s-%s-%d-verify.state", prefix, ename, num); 105 out[size - 1] = '\0'; 106 } 107 108 #endif 109