1
2
3
4
5#ifndef __LINUX_BLK_TYPES_H
6#define __LINUX_BLK_TYPES_H
7
8#include <linux/types.h>
9
10struct bio_set;
11struct bio;
12struct bio_integrity_payload;
13struct page;
14struct block_device;
15struct io_context;
16struct cgroup_subsys_state;
17typedef void (bio_end_io_t) (struct bio *);
18typedef void (bio_destructor_t) (struct bio *);
19
20
21
22
23struct bio_vec {
24 struct page *bv_page;
25 unsigned int bv_len;
26 unsigned int bv_offset;
27};
28
29#ifdef CONFIG_BLOCK
30
31struct bvec_iter {
32 sector_t bi_sector;
33
34 unsigned int bi_size;
35
36 unsigned int bi_idx;
37
38 unsigned int bi_bvec_done;
39
40};
41
42
43
44
45
46struct bio {
47 struct bio *bi_next;
48 struct block_device *bi_bdev;
49 unsigned int bi_flags;
50 int bi_error;
51 unsigned long bi_rw;
52
53
54
55 struct bvec_iter bi_iter;
56
57
58
59
60 unsigned int bi_phys_segments;
61
62
63
64
65
66 unsigned int bi_seg_front_size;
67 unsigned int bi_seg_back_size;
68
69 atomic_t __bi_remaining;
70
71 bio_end_io_t *bi_end_io;
72
73 void *bi_private;
74#ifdef CONFIG_BLK_CGROUP
75
76
77
78
79 struct io_context *bi_ioc;
80 struct cgroup_subsys_state *bi_css;
81#endif
82 union {
83#if defined(CONFIG_BLK_DEV_INTEGRITY)
84 struct bio_integrity_payload *bi_integrity;
85#endif
86 };
87
88 unsigned short bi_vcnt;
89
90
91
92
93
94 unsigned short bi_max_vecs;
95
96 atomic_t __bi_cnt;
97
98 struct bio_vec *bi_io_vec;
99
100 struct bio_set *bi_pool;
101
102
103
104
105
106
107 struct bio_vec bi_inline_vecs[0];
108};
109
110#define BIO_RESET_BYTES offsetof(struct bio, bi_max_vecs)
111
112
113
114
115#define BIO_SEG_VALID 1
116#define BIO_CLONED 2
117#define BIO_BOUNCED 3
118#define BIO_USER_MAPPED 4
119#define BIO_NULL_MAPPED 5
120#define BIO_QUIET 6
121#define BIO_CHAIN 7
122#define BIO_REFFED 8
123
124
125
126
127
128#define BIO_RESET_BITS 13
129#define BIO_OWNS_VEC 13
130
131
132
133
134#define BIO_POOL_BITS (4)
135#define BIO_POOL_NONE ((1UL << BIO_POOL_BITS) - 1)
136#define BIO_POOL_OFFSET (32 - BIO_POOL_BITS)
137#define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET)
138#define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET)
139
140#endif
141
142
143
144
145
146enum rq_flag_bits {
147
148 __REQ_WRITE,
149 __REQ_FAILFAST_DEV,
150 __REQ_FAILFAST_TRANSPORT,
151 __REQ_FAILFAST_DRIVER,
152
153 __REQ_SYNC,
154 __REQ_META,
155 __REQ_PRIO,
156 __REQ_DISCARD,
157 __REQ_SECURE,
158 __REQ_WRITE_SAME,
159
160 __REQ_NOIDLE,
161 __REQ_INTEGRITY,
162 __REQ_FUA,
163 __REQ_FLUSH,
164
165
166 __REQ_RAHEAD,
167 __REQ_THROTTLED,
168
169
170
171 __REQ_SORTED,
172 __REQ_SOFTBARRIER,
173 __REQ_NOMERGE,
174 __REQ_STARTED,
175 __REQ_DONTPREP,
176 __REQ_QUEUED,
177 __REQ_ELVPRIV,
178 __REQ_FAILED,
179 __REQ_QUIET,
180 __REQ_PREEMPT,
181
182
183 __REQ_ALLOCED,
184 __REQ_COPY_USER,
185 __REQ_FLUSH_SEQ,
186 __REQ_IO_STAT,
187 __REQ_MIXED_MERGE,
188 __REQ_PM,
189 __REQ_HASHED,
190 __REQ_MQ_INFLIGHT,
191 __REQ_NR_BITS,
192};
193
194#define REQ_WRITE (1ULL << __REQ_WRITE)
195#define REQ_FAILFAST_DEV (1ULL << __REQ_FAILFAST_DEV)
196#define REQ_FAILFAST_TRANSPORT (1ULL << __REQ_FAILFAST_TRANSPORT)
197#define REQ_FAILFAST_DRIVER (1ULL << __REQ_FAILFAST_DRIVER)
198#define REQ_SYNC (1ULL << __REQ_SYNC)
199#define REQ_META (1ULL << __REQ_META)
200#define REQ_PRIO (1ULL << __REQ_PRIO)
201#define REQ_DISCARD (1ULL << __REQ_DISCARD)
202#define REQ_WRITE_SAME (1ULL << __REQ_WRITE_SAME)
203#define REQ_NOIDLE (1ULL << __REQ_NOIDLE)
204#define REQ_INTEGRITY (1ULL << __REQ_INTEGRITY)
205
206#define REQ_FAILFAST_MASK \
207 (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER)
208#define REQ_COMMON_MASK \
209 (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \
210 REQ_DISCARD | REQ_WRITE_SAME | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | \
211 REQ_SECURE | REQ_INTEGRITY)
212#define REQ_CLONE_MASK REQ_COMMON_MASK
213
214#define BIO_NO_ADVANCE_ITER_MASK (REQ_DISCARD|REQ_WRITE_SAME)
215
216
217#define REQ_NOMERGE_FLAGS \
218 (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_FLUSH_SEQ)
219
220#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)
221#define REQ_THROTTLED (1ULL << __REQ_THROTTLED)
222
223#define REQ_SORTED (1ULL << __REQ_SORTED)
224#define REQ_SOFTBARRIER (1ULL << __REQ_SOFTBARRIER)
225#define REQ_FUA (1ULL << __REQ_FUA)
226#define REQ_NOMERGE (1ULL << __REQ_NOMERGE)
227#define REQ_STARTED (1ULL << __REQ_STARTED)
228#define REQ_DONTPREP (1ULL << __REQ_DONTPREP)
229#define REQ_QUEUED (1ULL << __REQ_QUEUED)
230#define REQ_ELVPRIV (1ULL << __REQ_ELVPRIV)
231#define REQ_FAILED (1ULL << __REQ_FAILED)
232#define REQ_QUIET (1ULL << __REQ_QUIET)
233#define REQ_PREEMPT (1ULL << __REQ_PREEMPT)
234#define REQ_ALLOCED (1ULL << __REQ_ALLOCED)
235#define REQ_COPY_USER (1ULL << __REQ_COPY_USER)
236#define REQ_FLUSH (1ULL << __REQ_FLUSH)
237#define REQ_FLUSH_SEQ (1ULL << __REQ_FLUSH_SEQ)
238#define REQ_IO_STAT (1ULL << __REQ_IO_STAT)
239#define REQ_MIXED_MERGE (1ULL << __REQ_MIXED_MERGE)
240#define REQ_SECURE (1ULL << __REQ_SECURE)
241#define REQ_PM (1ULL << __REQ_PM)
242#define REQ_HASHED (1ULL << __REQ_HASHED)
243#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
244
245typedef unsigned int blk_qc_t;
246#define BLK_QC_T_NONE -1U
247#define BLK_QC_T_SHIFT 16
248
249static inline bool blk_qc_t_valid(blk_qc_t cookie)
250{
251 return cookie != BLK_QC_T_NONE;
252}
253
254static inline blk_qc_t blk_tag_to_qc_t(unsigned int tag, unsigned int queue_num)
255{
256 return tag | (queue_num << BLK_QC_T_SHIFT);
257}
258
259static inline unsigned int blk_qc_t_to_queue_num(blk_qc_t cookie)
260{
261 return cookie >> BLK_QC_T_SHIFT;
262}
263
264static inline unsigned int blk_qc_t_to_tag(blk_qc_t cookie)
265{
266 return cookie & ((1u << BLK_QC_T_SHIFT) - 1);
267}
268
269#endif
270