Home | History | Annotate | Download | only in fio
      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