Commit | Line | Data |
---|---|---|
d6aed795 JA |
1 | #ifndef FIO_FILE_H |
2 | #define FIO_FILE_H | |
3 | ||
e2e58886 | 4 | #include <string.h> |
ecc314ba | 5 | #include "compiler/compiler.h" |
d6aed795 | 6 | #include "io_ddir.h" |
ecc314ba | 7 | #include "flist.h" |
9c6f6316 | 8 | #include "lib/zipf.h" |
7ebd796f | 9 | #include "lib/axmap.h" |
8055e41d | 10 | #include "lib/lfsr.h" |
56d9fa4b | 11 | #include "lib/gauss.h" |
d6aed795 | 12 | |
bfbdd35b BVA |
13 | /* Forward declarations */ |
14 | struct zoned_block_device_info; | |
a7e8aae0 | 15 | struct fdp_ruh_info; |
bfbdd35b | 16 | |
d6aed795 JA |
17 | /* |
18 | * The type of object we are working on | |
19 | */ | |
20 | enum fio_filetype { | |
21 | FIO_TYPE_FILE = 1, /* plain file */ | |
686fbd31 | 22 | FIO_TYPE_BLOCK, /* block device */ |
d6aed795 JA |
23 | FIO_TYPE_CHAR, /* character device */ |
24 | FIO_TYPE_PIPE, /* pipe */ | |
25 | }; | |
26 | ||
27 | enum fio_file_flags { | |
28 | FIO_FILE_open = 1 << 0, /* file is open */ | |
29 | FIO_FILE_closing = 1 << 1, /* file being closed */ | |
30 | FIO_FILE_extend = 1 << 2, /* needs extend */ | |
31 | FIO_FILE_done = 1 << 3, /* io completed to this file */ | |
32 | FIO_FILE_size_known = 1 << 4, /* size has been set */ | |
33 | FIO_FILE_hashed = 1 << 5, /* file is on hash */ | |
ed47cbf7 | 34 | FIO_FILE_partial_mmap = 1 << 6, /* can't do full mmap */ |
967d1b63 JA |
35 | FIO_FILE_axmap = 1 << 7, /* uses axmap */ |
36 | FIO_FILE_lfsr = 1 << 8, /* lfsr is used */ | |
6081231a | 37 | FIO_FILE_smalloc = 1 << 9, /* smalloc file/file_name */ |
d6aed795 JA |
38 | }; |
39 | ||
40 | enum file_lock_mode { | |
41 | FILE_LOCK_NONE, | |
42 | FILE_LOCK_EXCLUSIVE, | |
43 | FILE_LOCK_READWRITE, | |
44 | }; | |
45 | ||
590aebda | 46 | /* |
8c07860d JA |
47 | * How fio chooses what file to service next. Choice of uniformly random, or |
48 | * some skewed random variants, or just sequentially go through them or | |
49 | * roundrobing. | |
590aebda JA |
50 | */ |
51 | enum { | |
8c07860d JA |
52 | FIO_FSERVICE_RANDOM = 1, |
53 | FIO_FSERVICE_RR = 2, | |
54 | FIO_FSERVICE_SEQ = 3, | |
55 | __FIO_FSERVICE_NONUNIFORM = 0x100, | |
56 | FIO_FSERVICE_ZIPF = __FIO_FSERVICE_NONUNIFORM | 4, | |
57 | FIO_FSERVICE_PARETO = __FIO_FSERVICE_NONUNIFORM | 5, | |
58 | FIO_FSERVICE_GAUSS = __FIO_FSERVICE_NONUNIFORM | 6, | |
59 | ||
60 | FIO_FSERVICE_SHIFT = 10, | |
590aebda JA |
61 | }; |
62 | ||
a596f047 EG |
63 | /* |
64 | * No pre-allocation when laying down files, or call posix_fallocate(), or | |
65 | * call fallocate() with FALLOC_FL_KEEP_SIZE set. | |
66 | */ | |
67 | enum fio_fallocate_mode { | |
68 | FIO_FALLOCATE_NONE = 1, | |
69 | FIO_FALLOCATE_POSIX = 2, | |
70 | FIO_FALLOCATE_KEEP_SIZE = 3, | |
2c3e17be | 71 | FIO_FALLOCATE_NATIVE = 4, |
38ca5f03 | 72 | FIO_FALLOCATE_TRUNCATE = 5, |
a596f047 EG |
73 | }; |
74 | ||
d6aed795 JA |
75 | /* |
76 | * Each thread_data structure has a number of files associated with it, | |
77 | * this structure holds state information for a single file. | |
78 | */ | |
79 | struct fio_file { | |
80 | struct flist_head hash_list; | |
81 | enum fio_filetype filetype; | |
82 | ||
0e238572 | 83 | int fd; |
e6c4d732 | 84 | int shadow_fd; |
93bcfd20 | 85 | #ifdef WIN32 |
03e20d68 BC |
86 | HANDLE hFile; |
87 | HANDLE ioCP; | |
88 | #endif | |
d6aed795 JA |
89 | |
90 | /* | |
91 | * filename and possible memory mapping | |
92 | */ | |
d6aed795 | 93 | unsigned int major, minor; |
89ac1d48 | 94 | int fileno; |
d8f1f7d4 | 95 | char *file_name; |
d6aed795 | 96 | |
d6aed795 JA |
97 | /* |
98 | * size of the file, offset into file, and io size from that offset | |
79591fa9 | 99 | * (be aware io_size is different from thread_options::io_size) |
d6aed795 | 100 | */ |
293b8c1f JA |
101 | uint64_t real_file_size; |
102 | uint64_t file_offset; | |
103 | uint64_t io_size; | |
d6aed795 | 104 | |
a7e8aae0 KB |
105 | struct fio_ruhs_info *ruhs_info; |
106 | ||
bfbdd35b BVA |
107 | /* |
108 | * Zoned block device information. See also zonemode=zbd. | |
109 | */ | |
110 | struct zoned_block_device_info *zbd_info; | |
fae3b9a0 AD |
111 | /* zonemode=zbd working area */ |
112 | uint32_t min_zone; /* inclusive */ | |
113 | uint32_t max_zone; /* exclusive */ | |
bfbdd35b | 114 | |
f1dfb668 JA |
115 | /* |
116 | * Track last end and last start of IO for a given data direction | |
117 | */ | |
118 | uint64_t last_pos[DDIR_RWDIR_CNT]; | |
119 | uint64_t last_start[DDIR_RWDIR_CNT]; | |
d6aed795 | 120 | |
293b8c1f JA |
121 | uint64_t first_write; |
122 | uint64_t last_write; | |
44f29692 | 123 | |
94a6e1bb JA |
124 | /* |
125 | * Tracks the last iodepth number of completed writes, if data | |
126 | * verification is enabled | |
127 | */ | |
128 | uint64_t *last_write_comp; | |
129 | unsigned int last_write_idx; | |
130 | ||
e943b878 | 131 | /* |
855dc4d4 | 132 | * For use by the io engine to store offset |
e943b878 | 133 | */ |
855dc4d4 AG |
134 | uint64_t engine_pos; |
135 | ||
136 | /* | |
137 | * For use by the io engine for private data storage | |
138 | */ | |
139 | void *engine_data; | |
e943b878 | 140 | |
d6aed795 JA |
141 | /* |
142 | * if io is protected by a semaphore, this is set | |
143 | */ | |
d7df1d13 | 144 | union { |
971caeb1 | 145 | struct fio_sem *lock; |
d7df1d13 JA |
146 | struct fio_rwlock *rwlock; |
147 | }; | |
d6aed795 JA |
148 | |
149 | /* | |
967d1b63 | 150 | * block map or LFSR for random io |
d6aed795 | 151 | */ |
967d1b63 JA |
152 | union { |
153 | struct axmap *io_axmap; | |
154 | struct fio_lfsr lfsr; | |
155 | }; | |
8055e41d | 156 | |
9c6f6316 JA |
157 | /* |
158 | * Used for zipf random distribution | |
159 | */ | |
56d9fa4b JA |
160 | union { |
161 | struct zipf_state zipf; | |
162 | struct gauss_state gauss; | |
163 | }; | |
9c6f6316 | 164 | |
d6aed795 JA |
165 | int references; |
166 | enum fio_file_flags flags; | |
167 | ||
168 | struct disk_util *du; | |
169 | }; | |
170 | ||
710bf9c5 TK |
171 | #define FILE_ENG_DATA(f) ((f)->engine_data) |
172 | #define FILE_SET_ENG_DATA(f, data) ((f)->engine_data = (data)) | |
e19ccb55 | 173 | |
d6aed795 JA |
174 | #define FILE_FLAG_FNS(name) \ |
175 | static inline void fio_file_set_##name(struct fio_file *f) \ | |
176 | { \ | |
bea5c23d | 177 | (f)->flags = (enum fio_file_flags) ((f)->flags | FIO_FILE_##name); \ |
d6aed795 JA |
178 | } \ |
179 | static inline void fio_file_clear_##name(struct fio_file *f) \ | |
180 | { \ | |
bea5c23d | 181 | (f)->flags = (enum fio_file_flags) ((f)->flags & ~FIO_FILE_##name); \ |
d6aed795 JA |
182 | } \ |
183 | static inline int fio_file_##name(struct fio_file *f) \ | |
184 | { \ | |
185 | return ((f)->flags & FIO_FILE_##name) != 0; \ | |
186 | } | |
187 | ||
188 | FILE_FLAG_FNS(open); | |
189 | FILE_FLAG_FNS(closing); | |
190 | FILE_FLAG_FNS(extend); | |
191 | FILE_FLAG_FNS(done); | |
192 | FILE_FLAG_FNS(size_known); | |
193 | FILE_FLAG_FNS(hashed); | |
ed47cbf7 | 194 | FILE_FLAG_FNS(partial_mmap); |
967d1b63 JA |
195 | FILE_FLAG_FNS(axmap); |
196 | FILE_FLAG_FNS(lfsr); | |
6081231a | 197 | FILE_FLAG_FNS(smalloc); |
d6aed795 JA |
198 | #undef FILE_FLAG_FNS |
199 | ||
4cd02b3f JA |
200 | /* |
201 | * File setup/shutdown | |
202 | */ | |
203 | struct thread_data; | |
204 | extern void close_files(struct thread_data *); | |
205 | extern void close_and_free_files(struct thread_data *); | |
bedc9dc2 | 206 | extern uint64_t get_start_offset(struct thread_data *, struct fio_file *); |
4cd02b3f JA |
207 | extern int __must_check setup_files(struct thread_data *); |
208 | extern int __must_check file_invalidate_cache(struct thread_data *, struct fio_file *); | |
966fcbd4 | 209 | #ifdef __cplusplus |
210 | extern "C" { | |
211 | #endif | |
4cd02b3f JA |
212 | extern int __must_check generic_open_file(struct thread_data *, struct fio_file *); |
213 | extern int __must_check generic_close_file(struct thread_data *, struct fio_file *); | |
214 | extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *); | |
8c47cc76 | 215 | extern int __must_check generic_prepopulate_file(struct thread_data *, struct fio_file *); |
966fcbd4 | 216 | #ifdef __cplusplus |
217 | } | |
218 | #endif | |
1ccc6dc7 | 219 | extern int __must_check file_lookup_open(struct fio_file *f, int flags); |
c139f3b4 | 220 | extern bool __must_check pre_read_files(struct thread_data *); |
a3f001f5 | 221 | extern unsigned long long get_rand_file_size(struct thread_data *td); |
5903e7b7 | 222 | extern int add_file(struct thread_data *, const char *, int, int); |
49ffb4a2 | 223 | extern int add_file_exclusive(struct thread_data *, const char *); |
4cd02b3f JA |
224 | extern void get_file(struct fio_file *); |
225 | extern int __must_check put_file(struct thread_data *, struct fio_file *); | |
e8462bd8 | 226 | extern void put_file_log(struct thread_data *, struct fio_file *); |
4cd02b3f JA |
227 | extern void lock_file(struct thread_data *, struct fio_file *, enum fio_ddir); |
228 | extern void unlock_file(struct thread_data *, struct fio_file *); | |
229 | extern void unlock_file_all(struct thread_data *, struct fio_file *); | |
230 | extern int add_dir_files(struct thread_data *, const char *); | |
4d832322 | 231 | extern bool init_random_map(struct thread_data *); |
4cd02b3f JA |
232 | extern void dup_files(struct thread_data *, struct thread_data *); |
233 | extern int get_fileno(struct thread_data *, const char *); | |
234 | extern void free_release_files(struct thread_data *); | |
bcbfeefa | 235 | extern void filesetup_mem_free(void); |
8aa89d70 | 236 | extern void fio_file_reset(struct thread_data *, struct fio_file *); |
747b3105 | 237 | extern bool fio_files_done(struct thread_data *); |
04d6530f | 238 | extern bool exists_and_not_regfile(const char *); |
47534cda | 239 | extern int fio_set_directio(struct thread_data *, struct fio_file *); |
e711df54 | 240 | extern void fio_file_free(struct fio_file *); |
c592b9fe | 241 | |
d6aed795 | 242 | #endif |