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" |
d6aed795 JA |
11 | |
12 | /* | |
13 | * The type of object we are working on | |
14 | */ | |
15 | enum fio_filetype { | |
16 | FIO_TYPE_FILE = 1, /* plain file */ | |
17 | FIO_TYPE_BD, /* block device */ | |
18 | FIO_TYPE_CHAR, /* character device */ | |
19 | FIO_TYPE_PIPE, /* pipe */ | |
20 | }; | |
21 | ||
22 | enum fio_file_flags { | |
23 | FIO_FILE_open = 1 << 0, /* file is open */ | |
24 | FIO_FILE_closing = 1 << 1, /* file being closed */ | |
25 | FIO_FILE_extend = 1 << 2, /* needs extend */ | |
26 | FIO_FILE_done = 1 << 3, /* io completed to this file */ | |
27 | FIO_FILE_size_known = 1 << 4, /* size has been set */ | |
28 | FIO_FILE_hashed = 1 << 5, /* file is on hash */ | |
ed47cbf7 | 29 | FIO_FILE_partial_mmap = 1 << 6, /* can't do full mmap */ |
d6aed795 JA |
30 | }; |
31 | ||
32 | enum file_lock_mode { | |
33 | FILE_LOCK_NONE, | |
34 | FILE_LOCK_EXCLUSIVE, | |
35 | FILE_LOCK_READWRITE, | |
36 | }; | |
37 | ||
590aebda JA |
38 | /* |
39 | * roundrobin available files, or choose one at random, or do each one | |
40 | * serially. | |
41 | */ | |
42 | enum { | |
43 | FIO_FSERVICE_RANDOM = 1, | |
44 | FIO_FSERVICE_RR = 2, | |
45 | FIO_FSERVICE_SEQ = 3, | |
46 | }; | |
47 | ||
a596f047 EG |
48 | /* |
49 | * No pre-allocation when laying down files, or call posix_fallocate(), or | |
50 | * call fallocate() with FALLOC_FL_KEEP_SIZE set. | |
51 | */ | |
52 | enum fio_fallocate_mode { | |
53 | FIO_FALLOCATE_NONE = 1, | |
54 | FIO_FALLOCATE_POSIX = 2, | |
55 | FIO_FALLOCATE_KEEP_SIZE = 3, | |
56 | }; | |
57 | ||
d6aed795 JA |
58 | /* |
59 | * Each thread_data structure has a number of files associated with it, | |
60 | * this structure holds state information for a single file. | |
61 | */ | |
62 | struct fio_file { | |
63 | struct flist_head hash_list; | |
64 | enum fio_filetype filetype; | |
65 | ||
0e238572 | 66 | int fd; |
e6c4d732 | 67 | int shadow_fd; |
93bcfd20 | 68 | #ifdef WIN32 |
03e20d68 BC |
69 | HANDLE hFile; |
70 | HANDLE ioCP; | |
71 | #endif | |
d6aed795 JA |
72 | |
73 | /* | |
74 | * filename and possible memory mapping | |
75 | */ | |
76 | char *file_name; | |
77 | unsigned int major, minor; | |
89ac1d48 | 78 | int fileno; |
d6aed795 JA |
79 | |
80 | void *mmap_ptr; | |
81 | size_t mmap_sz; | |
82 | off_t mmap_off; | |
83 | ||
84 | /* | |
85 | * size of the file, offset into file, and io size from that offset | |
86 | */ | |
293b8c1f JA |
87 | uint64_t real_file_size; |
88 | uint64_t file_offset; | |
89 | uint64_t io_size; | |
d6aed795 | 90 | |
293b8c1f JA |
91 | uint64_t last_pos; |
92 | uint64_t last_start; | |
d6aed795 | 93 | |
293b8c1f JA |
94 | uint64_t first_write; |
95 | uint64_t last_write; | |
44f29692 | 96 | |
e943b878 JA |
97 | /* |
98 | * For use by the io engine | |
99 | */ | |
47f07ddc | 100 | uint64_t engine_data; |
e943b878 | 101 | |
d6aed795 JA |
102 | /* |
103 | * if io is protected by a semaphore, this is set | |
104 | */ | |
d7df1d13 JA |
105 | union { |
106 | struct fio_mutex *lock; | |
107 | struct fio_rwlock *rwlock; | |
108 | }; | |
d6aed795 JA |
109 | |
110 | /* | |
111 | * block map for random io | |
112 | */ | |
7ebd796f | 113 | struct axmap *io_axmap; |
d6aed795 | 114 | |
8055e41d JA |
115 | struct fio_lfsr lfsr; |
116 | ||
9c6f6316 JA |
117 | /* |
118 | * Used for zipf random distribution | |
119 | */ | |
120 | struct zipf_state zipf; | |
121 | ||
d6aed795 JA |
122 | int references; |
123 | enum fio_file_flags flags; | |
124 | ||
125 | struct disk_util *du; | |
126 | }; | |
127 | ||
128 | #define FILE_FLAG_FNS(name) \ | |
129 | static inline void fio_file_set_##name(struct fio_file *f) \ | |
130 | { \ | |
131 | (f)->flags |= FIO_FILE_##name; \ | |
132 | } \ | |
133 | static inline void fio_file_clear_##name(struct fio_file *f) \ | |
134 | { \ | |
135 | (f)->flags &= ~FIO_FILE_##name; \ | |
136 | } \ | |
137 | static inline int fio_file_##name(struct fio_file *f) \ | |
138 | { \ | |
139 | return ((f)->flags & FIO_FILE_##name) != 0; \ | |
140 | } | |
141 | ||
142 | FILE_FLAG_FNS(open); | |
143 | FILE_FLAG_FNS(closing); | |
144 | FILE_FLAG_FNS(extend); | |
145 | FILE_FLAG_FNS(done); | |
146 | FILE_FLAG_FNS(size_known); | |
147 | FILE_FLAG_FNS(hashed); | |
ed47cbf7 | 148 | FILE_FLAG_FNS(partial_mmap); |
d6aed795 JA |
149 | #undef FILE_FLAG_FNS |
150 | ||
4cd02b3f JA |
151 | /* |
152 | * File setup/shutdown | |
153 | */ | |
154 | struct thread_data; | |
155 | extern void close_files(struct thread_data *); | |
156 | extern void close_and_free_files(struct thread_data *); | |
293b8c1f | 157 | extern uint64_t get_start_offset(struct thread_data *); |
4cd02b3f JA |
158 | extern int __must_check setup_files(struct thread_data *); |
159 | extern int __must_check file_invalidate_cache(struct thread_data *, struct fio_file *); | |
160 | extern int __must_check generic_open_file(struct thread_data *, struct fio_file *); | |
161 | extern int __must_check generic_close_file(struct thread_data *, struct fio_file *); | |
162 | extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *); | |
1ccc6dc7 | 163 | extern int __must_check file_lookup_open(struct fio_file *f, int flags); |
4cd02b3f JA |
164 | extern int __must_check pre_read_files(struct thread_data *); |
165 | extern int add_file(struct thread_data *, const char *); | |
49ffb4a2 | 166 | extern int add_file_exclusive(struct thread_data *, const char *); |
4cd02b3f JA |
167 | extern void get_file(struct fio_file *); |
168 | extern int __must_check put_file(struct thread_data *, struct fio_file *); | |
e8462bd8 | 169 | extern void put_file_log(struct thread_data *, struct fio_file *); |
4cd02b3f JA |
170 | extern void lock_file(struct thread_data *, struct fio_file *, enum fio_ddir); |
171 | extern void unlock_file(struct thread_data *, struct fio_file *); | |
172 | extern void unlock_file_all(struct thread_data *, struct fio_file *); | |
173 | extern int add_dir_files(struct thread_data *, const char *); | |
174 | extern int init_random_map(struct thread_data *); | |
175 | extern void dup_files(struct thread_data *, struct thread_data *); | |
176 | extern int get_fileno(struct thread_data *, const char *); | |
177 | extern void free_release_files(struct thread_data *); | |
33c48814 | 178 | void fio_file_reset(struct thread_data *, struct fio_file *); |
c592b9fe | 179 | |
d6aed795 | 180 | #endif |