1 #ifndef FIO_FILE_H 2 #define FIO_FILE_H 3 4 #include <string.h> 5 #include "compiler/compiler.h" 6 #include "io_ddir.h" 7 #include "flist.h" 8 #include "lib/zipf.h" 9 #include "lib/axmap.h" 10 #include "lib/lfsr.h" 11 #include "lib/gauss.h" 12 13 /* 14 * The type of object we are working on 15 */ 16 enum fio_filetype { 17 FIO_TYPE_FILE = 1, /* plain file */ 18 FIO_TYPE_BLOCK, /* block device */ 19 FIO_TYPE_CHAR, /* character device */ 20 FIO_TYPE_PIPE, /* pipe */ 21 }; 22 23 enum fio_file_flags { 24 FIO_FILE_open = 1 << 0, /* file is open */ 25 FIO_FILE_closing = 1 << 1, /* file being closed */ 26 FIO_FILE_extend = 1 << 2, /* needs extend */ 27 FIO_FILE_done = 1 << 3, /* io completed to this file */ 28 FIO_FILE_size_known = 1 << 4, /* size has been set */ 29 FIO_FILE_hashed = 1 << 5, /* file is on hash */ 30 FIO_FILE_partial_mmap = 1 << 6, /* can't do full mmap */ 31 FIO_FILE_axmap = 1 << 7, /* uses axmap */ 32 FIO_FILE_lfsr = 1 << 8, /* lfsr is used */ 33 }; 34 35 enum file_lock_mode { 36 FILE_LOCK_NONE, 37 FILE_LOCK_EXCLUSIVE, 38 FILE_LOCK_READWRITE, 39 }; 40 41 /* 42 * How fio chooses what file to service next. Choice of uniformly random, or 43 * some skewed random variants, or just sequentially go through them or 44 * roundrobing. 45 */ 46 enum { 47 FIO_FSERVICE_RANDOM = 1, 48 FIO_FSERVICE_RR = 2, 49 FIO_FSERVICE_SEQ = 3, 50 __FIO_FSERVICE_NONUNIFORM = 0x100, 51 FIO_FSERVICE_ZIPF = __FIO_FSERVICE_NONUNIFORM | 4, 52 FIO_FSERVICE_PARETO = __FIO_FSERVICE_NONUNIFORM | 5, 53 FIO_FSERVICE_GAUSS = __FIO_FSERVICE_NONUNIFORM | 6, 54 55 FIO_FSERVICE_SHIFT = 10, 56 }; 57 58 /* 59 * No pre-allocation when laying down files, or call posix_fallocate(), or 60 * call fallocate() with FALLOC_FL_KEEP_SIZE set. 61 */ 62 enum fio_fallocate_mode { 63 FIO_FALLOCATE_NONE = 1, 64 FIO_FALLOCATE_POSIX = 2, 65 FIO_FALLOCATE_KEEP_SIZE = 3, 66 }; 67 68 /* 69 * Each thread_data structure has a number of files associated with it, 70 * this structure holds state information for a single file. 71 */ 72 struct fio_file { 73 struct flist_head hash_list; 74 enum fio_filetype filetype; 75 76 int fd; 77 int shadow_fd; 78 #ifdef WIN32 79 HANDLE hFile; 80 HANDLE ioCP; 81 #endif 82 83 /* 84 * filename and possible memory mapping 85 */ 86 unsigned int major, minor; 87 int fileno; 88 int bs; 89 char *file_name; 90 91 /* 92 * size of the file, offset into file, and io size from that offset 93 * (be aware io_size is different from thread_options::io_size) 94 */ 95 uint64_t real_file_size; 96 uint64_t file_offset; 97 uint64_t io_size; 98 99 /* 100 * Track last end and last start of IO for a given data direction 101 */ 102 uint64_t last_pos[DDIR_RWDIR_CNT]; 103 uint64_t last_start[DDIR_RWDIR_CNT]; 104 105 uint64_t first_write; 106 uint64_t last_write; 107 108 /* 109 * Tracks the last iodepth number of completed writes, if data 110 * verification is enabled 111 */ 112 uint64_t *last_write_comp; 113 unsigned int last_write_idx; 114 115 /* 116 * For use by the io engine for offset or private data storage 117 */ 118 union { 119 uint64_t engine_pos; 120 void *engine_data; 121 }; 122 123 /* 124 * if io is protected by a semaphore, this is set 125 */ 126 union { 127 struct fio_mutex *lock; 128 struct fio_rwlock *rwlock; 129 }; 130 131 /* 132 * block map or LFSR for random io 133 */ 134 union { 135 struct axmap *io_axmap; 136 struct fio_lfsr lfsr; 137 }; 138 139 /* 140 * Used for zipf random distribution 141 */ 142 union { 143 struct zipf_state zipf; 144 struct gauss_state gauss; 145 }; 146 147 int references; 148 enum fio_file_flags flags; 149 150 struct disk_util *du; 151 }; 152 153 #define FILE_ENG_DATA(f) ((f)->engine_data) 154 #define FILE_SET_ENG_DATA(f, data) ((f)->engine_data = (data)) 155 156 #define FILE_FLAG_FNS(name) \ 157 static inline void fio_file_set_##name(struct fio_file *f) \ 158 { \ 159 (f)->flags = (enum fio_file_flags) ((f)->flags | FIO_FILE_##name); \ 160 } \ 161 static inline void fio_file_clear_##name(struct fio_file *f) \ 162 { \ 163 (f)->flags = (enum fio_file_flags) ((f)->flags & ~FIO_FILE_##name); \ 164 } \ 165 static inline int fio_file_##name(struct fio_file *f) \ 166 { \ 167 return ((f)->flags & FIO_FILE_##name) != 0; \ 168 } 169 170 FILE_FLAG_FNS(open); 171 FILE_FLAG_FNS(closing); 172 FILE_FLAG_FNS(extend); 173 FILE_FLAG_FNS(done); 174 FILE_FLAG_FNS(size_known); 175 FILE_FLAG_FNS(hashed); 176 FILE_FLAG_FNS(partial_mmap); 177 FILE_FLAG_FNS(axmap); 178 FILE_FLAG_FNS(lfsr); 179 #undef FILE_FLAG_FNS 180 181 /* 182 * File setup/shutdown 183 */ 184 struct thread_data; 185 extern void close_files(struct thread_data *); 186 extern void close_and_free_files(struct thread_data *); 187 extern uint64_t get_start_offset(struct thread_data *, struct fio_file *); 188 extern int __must_check setup_files(struct thread_data *); 189 extern int __must_check file_invalidate_cache(struct thread_data *, struct fio_file *); 190 extern int __must_check generic_open_file(struct thread_data *, struct fio_file *); 191 extern int __must_check generic_close_file(struct thread_data *, struct fio_file *); 192 extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *); 193 extern int __must_check file_lookup_open(struct fio_file *f, int flags); 194 extern int __must_check pre_read_files(struct thread_data *); 195 extern unsigned long long get_rand_file_size(struct thread_data *td); 196 extern int add_file(struct thread_data *, const char *, int, int); 197 extern int add_file_exclusive(struct thread_data *, const char *); 198 extern void get_file(struct fio_file *); 199 extern int __must_check put_file(struct thread_data *, struct fio_file *); 200 extern void put_file_log(struct thread_data *, struct fio_file *); 201 extern void lock_file(struct thread_data *, struct fio_file *, enum fio_ddir); 202 extern void unlock_file(struct thread_data *, struct fio_file *); 203 extern void unlock_file_all(struct thread_data *, struct fio_file *); 204 extern int add_dir_files(struct thread_data *, const char *); 205 extern int init_random_map(struct thread_data *); 206 extern void dup_files(struct thread_data *, struct thread_data *); 207 extern int get_fileno(struct thread_data *, const char *); 208 extern void free_release_files(struct thread_data *); 209 extern void filesetup_mem_free(void); 210 extern void fio_file_reset(struct thread_data *, struct fio_file *); 211 extern bool fio_files_done(struct thread_data *); 212 extern bool exists_and_not_regfile(const char *); 213 214 #endif 215