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