Blame view

include/linux/bio.h 20.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
   * Copyright (C) 2001 Jens Axboe <axboe@suse.de>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
7cc015811   Tejun Heo   bio, fs: separate...
10
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
20
21
22
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public Licens
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-
   */
  #ifndef __LINUX_BIO_H
  #define __LINUX_BIO_H
  
  #include <linux/highmem.h>
  #include <linux/mempool.h>
22e2c507c   Jens Axboe   [PATCH] Update cf...
23
  #include <linux/ioprio.h>
187f1882b   Paul Gortmaker   BUG: headers with...
24
  #include <linux/bug.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25

02a5e0acb   David Howells   BLOCK: Hide the c...
26
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  #include <asm/io.h>
7cc015811   Tejun Heo   bio, fs: separate...
28
29
  /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */
  #include <linux/blk_types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
  #define BIO_DEBUG
  
  #ifdef BIO_DEBUG
  #define BIO_BUG_ON	BUG_ON
  #else
  #define BIO_BUG_ON
  #endif
225311a46   Huang Ying   mm: test code to ...
37
38
39
40
  #ifdef CONFIG_THP_SWAP
  #if HPAGE_PMD_NR > 256
  #define BIO_MAX_PAGES		HPAGE_PMD_NR
  #else
d84a84775   Alexey Dobriyan   [PATCH] Fix "biov...
41
  #define BIO_MAX_PAGES		256
225311a46   Huang Ying   mm: test code to ...
42
43
44
45
  #endif
  #else
  #define BIO_MAX_PAGES		256
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

43b62ce3f   Mike Christie   block: move bio i...
47
48
  #define bio_prio(bio)			(bio)->bi_ioprio
  #define bio_set_prio(bio, prio)		((bio)->bi_ioprio = prio)
22e2c507c   Jens Axboe   [PATCH] Update cf...
49

4550dd6c6   Kent Overstreet   block: Immutable ...
50
51
52
53
54
55
56
57
58
59
60
61
62
  #define bio_iter_iovec(bio, iter)				\
  	bvec_iter_bvec((bio)->bi_io_vec, (iter))
  
  #define bio_iter_page(bio, iter)				\
  	bvec_iter_page((bio)->bi_io_vec, (iter))
  #define bio_iter_len(bio, iter)					\
  	bvec_iter_len((bio)->bi_io_vec, (iter))
  #define bio_iter_offset(bio, iter)				\
  	bvec_iter_offset((bio)->bi_io_vec, (iter))
  
  #define bio_page(bio)		bio_iter_page((bio), (bio)->bi_iter)
  #define bio_offset(bio)		bio_iter_offset((bio), (bio)->bi_iter)
  #define bio_iovec(bio)		bio_iter_iovec((bio), (bio)->bi_iter)
7988613b0   Kent Overstreet   block: Convert bi...
63

458b76ed2   Kent Overstreet   block: Kill bio_s...
64
65
  #define bio_multiple_segments(bio)				\
  	((bio)->bi_iter.bi_size != bio_iovec(bio).bv_len)
4f024f379   Kent Overstreet   block: Abstract o...
66
67
  #define bio_sectors(bio)	((bio)->bi_iter.bi_size >> 9)
  #define bio_end_sector(bio)	((bio)->bi_iter.bi_sector + bio_sectors((bio)))
bf2de6f5a   Jens Axboe   block: Initial su...
68

458b76ed2   Kent Overstreet   block: Kill bio_s...
69
  /*
d38499530   Christoph Hellwig   fs: decouple READ...
70
71
72
73
74
75
   * Return the data direction, READ or WRITE.
   */
  #define bio_data_dir(bio) \
  	(op_is_write(bio_op(bio)) ? WRITE : READ)
  
  /*
458b76ed2   Kent Overstreet   block: Kill bio_s...
76
77
78
79
80
81
   * Check whether this bio carries any data or not. A NULL bio is allowed.
   */
  static inline bool bio_has_data(struct bio *bio)
  {
  	if (bio &&
  	    bio->bi_iter.bi_size &&
7afafc8a4   Adrian Hunter   block: Fix secure...
82
  	    bio_op(bio) != REQ_OP_DISCARD &&
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
83
84
  	    bio_op(bio) != REQ_OP_SECURE_ERASE &&
  	    bio_op(bio) != REQ_OP_WRITE_ZEROES)
458b76ed2   Kent Overstreet   block: Kill bio_s...
85
86
87
88
  		return true;
  
  	return false;
  }
95fe6c1a2   Mike Christie   block, fs, mm, dr...
89
90
  static inline bool bio_no_advance_iter(struct bio *bio)
  {
7afafc8a4   Adrian Hunter   block: Fix secure...
91
92
  	return bio_op(bio) == REQ_OP_DISCARD ||
  	       bio_op(bio) == REQ_OP_SECURE_ERASE ||
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
93
94
  	       bio_op(bio) == REQ_OP_WRITE_SAME ||
  	       bio_op(bio) == REQ_OP_WRITE_ZEROES;
95fe6c1a2   Mike Christie   block, fs, mm, dr...
95
  }
458b76ed2   Kent Overstreet   block: Kill bio_s...
96
97
  static inline bool bio_mergeable(struct bio *bio)
  {
1eff9d322   Jens Axboe   block: rename bio...
98
  	if (bio->bi_opf & REQ_NOMERGE_FLAGS)
458b76ed2   Kent Overstreet   block: Kill bio_s...
99
100
101
102
  		return false;
  
  	return true;
  }
2e46e8b27   Tejun Heo   block: drop reque...
103
  static inline unsigned int bio_cur_bytes(struct bio *bio)
bf2de6f5a   Jens Axboe   block: Initial su...
104
  {
458b76ed2   Kent Overstreet   block: Kill bio_s...
105
  	if (bio_has_data(bio))
a4ad39b1d   Kent Overstreet   block: Convert bi...
106
  		return bio_iovec(bio).bv_len;
fb2dce862   David Woodhouse   Add 'discard' req...
107
  	else /* dataless requests such as discard */
4f024f379   Kent Overstreet   block: Abstract o...
108
  		return bio->bi_iter.bi_size;
bf2de6f5a   Jens Axboe   block: Initial su...
109
110
111
112
  }
  
  static inline void *bio_data(struct bio *bio)
  {
458b76ed2   Kent Overstreet   block: Kill bio_s...
113
  	if (bio_has_data(bio))
bf2de6f5a   Jens Axboe   block: Initial su...
114
115
116
117
  		return page_address(bio_page(bio)) + bio_offset(bio);
  
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
121
  
  /*
   * will die
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
124
125
126
127
128
129
  #define bvec_to_phys(bv)	(page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset)
  
  /*
   * queues that have highmem support enabled may still need to revert to
   * PIO transfers occasionally and thus map high pages temporarily. For
   * permanent PIO fall back, user is probably better off disabling highmem
   * I/O completely on that queue (see ide-dma for example)
   */
f619d2546   Kent Overstreet   block: Kill bio_i...
130
131
132
  #define __bio_kmap_atomic(bio, iter)				\
  	(kmap_atomic(bio_iter_iovec((bio), (iter)).bv_page) +	\
  		bio_iter_iovec((bio), (iter)).bv_offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133

f619d2546   Kent Overstreet   block: Kill bio_i...
134
  #define __bio_kunmap_atomic(addr)	kunmap_atomic(addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
137
138
  
  /*
   * merge helpers etc
   */
f92131c3d   Jeremy Fitzhardinge   bio: define __BIO...
139
140
141
  /* Default implementation of BIOVEC_PHYS_MERGEABLE */
  #define __BIOVEC_PHYS_MERGEABLE(vec1, vec2)	\
  	((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
145
146
  /*
   * allow arch override, for eg virtualized architectures (put in asm/io.h)
   */
  #ifndef BIOVEC_PHYS_MERGEABLE
  #define BIOVEC_PHYS_MERGEABLE(vec1, vec2)	\
f92131c3d   Jeremy Fitzhardinge   bio: define __BIO...
147
  	__BIOVEC_PHYS_MERGEABLE(vec1, vec2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
151
  #define __BIO_SEG_BOUNDARY(addr1, addr2, mask) \
  	(((addr1) | (mask)) == (((addr2) - 1) | (mask)))
  #define BIOVEC_SEG_BOUNDARY(q, b1, b2) \
ae03bf639   Martin K. Petersen   block: Use access...
152
  	__BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, queue_segment_boundary((q)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153

66cb45aa4   Jens Axboe   block: add suppor...
154
  /*
d74c6d514   Kent Overstreet   block: Add bio_fo...
155
156
157
158
   * drivers should _never_ use the all version - the bio may have been split
   * before it got to the driver and the driver won't own all of it
   */
  #define bio_for_each_segment_all(bvl, bio, i)				\
f619d2546   Kent Overstreet   block: Kill bio_i...
159
  	for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++)
d74c6d514   Kent Overstreet   block: Add bio_fo...
160

4550dd6c6   Kent Overstreet   block: Immutable ...
161
162
163
164
  static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter,
  				    unsigned bytes)
  {
  	iter->bi_sector += bytes >> 9;
f9df1cd99   Dmitry Monakhov   bio: add bvec_ite...
165
  	if (bio_no_advance_iter(bio)) {
4550dd6c6   Kent Overstreet   block: Immutable ...
166
  		iter->bi_size -= bytes;
f9df1cd99   Dmitry Monakhov   bio: add bvec_ite...
167
168
  		iter->bi_done += bytes;
  	} else {
4550dd6c6   Kent Overstreet   block: Immutable ...
169
  		bvec_iter_advance(bio->bi_io_vec, iter, bytes);
b1fb2c52b   Dmitry Monakhov   block: guard bvec...
170
171
  		/* TODO: It is reasonable to complete bio with error here. */
  	}
4550dd6c6   Kent Overstreet   block: Immutable ...
172
  }
f9df1cd99   Dmitry Monakhov   bio: add bvec_ite...
173
174
175
176
177
178
179
180
181
182
183
184
185
  static inline bool bio_rewind_iter(struct bio *bio, struct bvec_iter *iter,
  		unsigned int bytes)
  {
  	iter->bi_sector -= bytes >> 9;
  
  	if (bio_no_advance_iter(bio)) {
  		iter->bi_size += bytes;
  		iter->bi_done -= bytes;
  		return true;
  	}
  
  	return bvec_iter_rewind(bio->bi_io_vec, iter, bytes);
  }
7988613b0   Kent Overstreet   block: Convert bi...
186
187
  #define __bio_for_each_segment(bvl, bio, iter, start)			\
  	for (iter = (start);						\
4550dd6c6   Kent Overstreet   block: Immutable ...
188
189
190
  	     (iter).bi_size &&						\
  		((bvl = bio_iter_iovec((bio), (iter))), 1);		\
  	     bio_advance_iter((bio), &(iter), (bvl).bv_len))
7988613b0   Kent Overstreet   block: Convert bi...
191
192
193
  
  #define bio_for_each_segment(bvl, bio, iter)				\
  	__bio_for_each_segment(bvl, bio, iter, (bio)->bi_iter)
4550dd6c6   Kent Overstreet   block: Immutable ...
194
  #define bio_iter_last(bvec, iter) ((iter).bi_size == (bvec).bv_len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195

f45958756   Shaohua Li   block: remove bio...
196
  static inline unsigned bio_segments(struct bio *bio)
458b76ed2   Kent Overstreet   block: Kill bio_s...
197
198
199
200
  {
  	unsigned segs = 0;
  	struct bio_vec bv;
  	struct bvec_iter iter;
8423ae3d7   Kent Overstreet   block: Fix clonin...
201
  	/*
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
202
203
  	 * We special case discard/write same/write zeroes, because they
  	 * interpret bi_size differently:
8423ae3d7   Kent Overstreet   block: Fix clonin...
204
  	 */
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
205
206
207
  	switch (bio_op(bio)) {
  	case REQ_OP_DISCARD:
  	case REQ_OP_SECURE_ERASE:
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
208
  	case REQ_OP_WRITE_ZEROES:
f9d03f96b   Christoph Hellwig   block: improve ha...
209
210
  		return 0;
  	case REQ_OP_WRITE_SAME:
8423ae3d7   Kent Overstreet   block: Fix clonin...
211
  		return 1;
a6f0788ec   Chaitanya Kulkarni   block: add suppor...
212
213
214
  	default:
  		break;
  	}
8423ae3d7   Kent Overstreet   block: Fix clonin...
215

f45958756   Shaohua Li   block: remove bio...
216
  	bio_for_each_segment(bv, bio, iter)
458b76ed2   Kent Overstreet   block: Kill bio_s...
217
218
219
220
  		segs++;
  
  	return segs;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
222
223
224
225
226
227
228
229
230
231
232
233
234
  /*
   * get a reference to a bio, so it won't disappear. the intended use is
   * something like:
   *
   * bio_get(bio);
   * submit_bio(rw, bio);
   * if (bio->bi_flags ...)
   *	do_something
   * bio_put(bio);
   *
   * without the bio_get(), it could potentially complete I/O before submit_bio
   * returns. and then bio would be freed memory when if (bio->bi_flags ...)
   * runs
   */
dac56212e   Jens Axboe   bio: skip atomic ...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  static inline void bio_get(struct bio *bio)
  {
  	bio->bi_flags |= (1 << BIO_REFFED);
  	smp_mb__before_atomic();
  	atomic_inc(&bio->__bi_cnt);
  }
  
  static inline void bio_cnt_set(struct bio *bio, unsigned int count)
  {
  	if (count != 1) {
  		bio->bi_flags |= (1 << BIO_REFFED);
  		smp_mb__before_atomic();
  	}
  	atomic_set(&bio->__bi_cnt, count);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250

b7c44ed9d   Jens Axboe   block: manipulate...
251
252
  static inline bool bio_flagged(struct bio *bio, unsigned int bit)
  {
2c68f6dc6   Jens Axboe   block: shrink str...
253
  	return (bio->bi_flags & (1U << bit)) != 0;
b7c44ed9d   Jens Axboe   block: manipulate...
254
255
256
257
  }
  
  static inline void bio_set_flag(struct bio *bio, unsigned int bit)
  {
2c68f6dc6   Jens Axboe   block: shrink str...
258
  	bio->bi_flags |= (1U << bit);
b7c44ed9d   Jens Axboe   block: manipulate...
259
260
261
262
  }
  
  static inline void bio_clear_flag(struct bio *bio, unsigned int bit)
  {
2c68f6dc6   Jens Axboe   block: shrink str...
263
  	bio->bi_flags &= ~(1U << bit);
b7c44ed9d   Jens Axboe   block: manipulate...
264
  }
7bcd79ac5   Ming Lei   block: bio: intro...
265
266
267
268
269
270
271
272
273
  static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv)
  {
  	*bv = bio_iovec(bio);
  }
  
  static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv)
  {
  	struct bvec_iter iter = bio->bi_iter;
  	int idx;
7bcd79ac5   Ming Lei   block: bio: intro...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
  	if (unlikely(!bio_multiple_segments(bio))) {
  		*bv = bio_iovec(bio);
  		return;
  	}
  
  	bio_advance_iter(bio, &iter, iter.bi_size);
  
  	if (!iter.bi_bvec_done)
  		idx = iter.bi_idx - 1;
  	else	/* in the middle of bvec */
  		idx = iter.bi_idx;
  
  	*bv = bio->bi_io_vec[idx];
  
  	/*
  	 * iter.bi_bvec_done records actual length of the last bvec
  	 * if this bio ends in the middle of one io vector
  	 */
  	if (iter.bi_bvec_done)
  		bv->bv_len = iter.bi_bvec_done;
  }
c611529e7   Martin K. Petersen   sd: Honor block l...
295
296
297
298
299
300
301
  enum bip_flags {
  	BIP_BLOCK_INTEGRITY	= 1 << 0, /* block layer owns integrity data */
  	BIP_MAPPED_INTEGRITY	= 1 << 1, /* ref tag has been remapped */
  	BIP_CTRL_NOCHECK	= 1 << 2, /* disable HBA integrity checking */
  	BIP_DISK_NOCHECK	= 1 << 3, /* disable disk integrity checking */
  	BIP_IP_CHECKSUM		= 1 << 4, /* IP checksum */
  };
7ba1ba12e   Martin K. Petersen   block: Block laye...
302
303
304
305
306
  /*
   * bio integrity payload
   */
  struct bio_integrity_payload {
  	struct bio		*bip_bio;	/* parent bio */
7ba1ba12e   Martin K. Petersen   block: Block laye...
307

d57a5f7c6   Kent Overstreet   bio-integrity: Co...
308
  	struct bvec_iter	bip_iter;
7ba1ba12e   Martin K. Petersen   block: Block laye...
309

7878cba9f   Martin K. Petersen   block: Create bip...
310
  	unsigned short		bip_slab;	/* slab the bip came from */
7ba1ba12e   Martin K. Petersen   block: Block laye...
311
  	unsigned short		bip_vcnt;	/* # of integrity bio_vecs */
cbcd1054a   Gu Zheng   bio-integrity: ad...
312
  	unsigned short		bip_max_vcnt;	/* integrity bio_vec slots */
b1f013885   Martin K. Petersen   block: Relocate b...
313
  	unsigned short		bip_flags;	/* control flags */
7ba1ba12e   Martin K. Petersen   block: Block laye...
314
315
  
  	struct work_struct	bip_work;	/* I/O completion */
6fda981ca   Kent Overstreet   block: Fix a buff...
316
317
318
  
  	struct bio_vec		*bip_vec;
  	struct bio_vec		bip_inline_vecs[0];/* embedded bvec array */
7ba1ba12e   Martin K. Petersen   block: Block laye...
319
  };
185930885   Martin K. Petersen   block: Clean up t...
320

06c1e3902   Keith Busch   blk-integrity: em...
321
322
323
324
  #if defined(CONFIG_BLK_DEV_INTEGRITY)
  
  static inline struct bio_integrity_payload *bio_integrity(struct bio *bio)
  {
1eff9d322   Jens Axboe   block: rename bio...
325
  	if (bio->bi_opf & REQ_INTEGRITY)
06c1e3902   Keith Busch   blk-integrity: em...
326
327
328
329
  		return bio->bi_integrity;
  
  	return NULL;
  }
c611529e7   Martin K. Petersen   sd: Honor block l...
330
331
332
333
334
335
336
337
338
  static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
  {
  	struct bio_integrity_payload *bip = bio_integrity(bio);
  
  	if (bip)
  		return bip->bip_flags & flag;
  
  	return false;
  }
b1f013885   Martin K. Petersen   block: Relocate b...
339

185930885   Martin K. Petersen   block: Clean up t...
340
341
342
343
344
345
346
347
348
349
  static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
  {
  	return bip->bip_iter.bi_sector;
  }
  
  static inline void bip_set_seed(struct bio_integrity_payload *bip,
  				sector_t seed)
  {
  	bip->bip_iter.bi_sector = seed;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
350
  #endif /* CONFIG_BLK_DEV_INTEGRITY */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
351

6678d83f1   Kent Overstreet   block: Consolidat...
352
  extern void bio_trim(struct bio *bio, int offset, int size);
20d0189b1   Kent Overstreet   block: Introduce ...
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  extern struct bio *bio_split(struct bio *bio, int sectors,
  			     gfp_t gfp, struct bio_set *bs);
  
  /**
   * bio_next_split - get next @sectors from a bio, splitting if necessary
   * @bio:	bio to split
   * @sectors:	number of sectors to split from the front of @bio
   * @gfp:	gfp mask
   * @bs:		bio set to allocate from
   *
   * Returns a bio representing the next @sectors of @bio - if the bio is smaller
   * than @sectors, returns the original bio unchanged.
   */
  static inline struct bio *bio_next_split(struct bio *bio, int sectors,
  					 gfp_t gfp, struct bio_set *bs)
  {
  	if (sectors >= bio_sectors(bio))
  		return bio;
  
  	return bio_split(bio, sectors, gfp, bs);
  }
011067b05   NeilBrown   blk: replace bios...
374
375
376
  extern struct bio_set *bioset_create(unsigned int, unsigned int, int flags);
  enum {
  	BIOSET_NEED_BVECS = BIT(0),
47e0fb461   NeilBrown   blk: make the bio...
377
  	BIOSET_NEED_RESCUER = BIT(1),
011067b05   NeilBrown   blk: replace bios...
378
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379
  extern void bioset_free(struct bio_set *);
a6c39cb4f   Fabian Frederick   fs/bio: remove bs...
380
  extern mempool_t *biovec_create_pool(int pool_entries);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381

7a88fa191   Dan Carpenter   block: make nr_io...
382
  extern struct bio *bio_alloc_bioset(gfp_t, unsigned int, struct bio_set *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
  extern void bio_put(struct bio *);
59d276fe0   Kent Overstreet   block: Add bio_cl...
384
385
  extern void __bio_clone_fast(struct bio *, struct bio *);
  extern struct bio *bio_clone_fast(struct bio *, gfp_t, struct bio_set *);
bf800ef18   Kent Overstreet   block: Add bio_cl...
386
  extern struct bio *bio_clone_bioset(struct bio *, gfp_t, struct bio_set *bs);
3f86a82ae   Kent Overstreet   block: Consolidat...
387
388
389
390
391
392
393
394
395
396
397
  extern struct bio_set *fs_bio_set;
  
  static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
  {
  	return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
  }
  
  static inline struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs)
  {
  	return bio_alloc_bioset(gfp_mask, nr_iovecs, NULL);
  }
bf800ef18   Kent Overstreet   block: Add bio_cl...
398
399
400
401
402
  static inline struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask)
  {
  	return bio_clone_bioset(bio, gfp_mask, NULL);
  
  }
1e3914d4c   Christoph Hellwig   block, fs: move s...
403
  extern blk_qc_t submit_bio(struct bio *);
4246a0b63   Christoph Hellwig   block: add a bi_e...
404
405
406
407
  extern void bio_endio(struct bio *);
  
  static inline void bio_io_error(struct bio *bio)
  {
4e4cbee93   Christoph Hellwig   block: switch bio...
408
  	bio->bi_status = BLK_STS_IOERR;
4246a0b63   Christoph Hellwig   block: add a bi_e...
409
410
  	bio_endio(bio);
  }
03a07c92a   Goldwyn Rodrigues   block: return on ...
411
412
413
  static inline void bio_wouldblock_error(struct bio *bio)
  {
  	bio->bi_status = BLK_STS_AGAIN;
4246a0b63   Christoph Hellwig   block: add a bi_e...
414
415
  	bio_endio(bio);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
  struct request_queue;
  extern int bio_phys_segments(struct request_queue *, struct bio *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418

4e49ea4a3   Mike Christie   block/fs/drivers:...
419
  extern int submit_bio_wait(struct bio *bio);
054bdf646   Kent Overstreet   block: Add bio_ad...
420
  extern void bio_advance(struct bio *, unsigned);
3a83f4677   Ming Lei   block: bio: pass ...
421
422
  extern void bio_init(struct bio *bio, struct bio_vec *table,
  		     unsigned short max_vecs);
9ae3b3f52   Jens Axboe   block: provide bi...
423
  extern void bio_uninit(struct bio *);
f44b48c76   Kent Overstreet   block: Add bio_re...
424
  extern void bio_reset(struct bio *);
196d38bcc   Kent Overstreet   block: Generic bi...
425
  void bio_chain(struct bio *, struct bio *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
427
  
  extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int);
6e68af666   Mike Christie   [SCSI] Convert SC...
428
429
  extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
  			   unsigned int, unsigned int);
2cefe4dba   Kent Overstreet   block: add bio_io...
430
  int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter);
152e283fd   FUJITA Tomonori   block: introduce ...
431
  struct rq_map_data;
f1970baf6   James Bottomley   [PATCH] Add scatt...
432
  extern struct bio *bio_map_user_iov(struct request_queue *,
26e49cfc7   Kent Overstreet   block: pass iov_i...
433
  				    const struct iov_iter *, gfp_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
  extern void bio_unmap_user(struct bio *);
df46b9a44   Mike Christie   [PATCH] Add blk_r...
435
  extern struct bio *bio_map_kern(struct request_queue *, void *, unsigned int,
27496a8c6   Al Viro   [PATCH] gfp_t: fs/*
436
  				gfp_t);
68154e90c   FUJITA Tomonori   block: add dma al...
437
438
  extern struct bio *bio_copy_kern(struct request_queue *, void *, unsigned int,
  				 gfp_t, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
440
  extern void bio_set_pages_dirty(struct bio *bio);
  extern void bio_check_pages_dirty(struct bio *bio);
2d4dc890b   Ilya Loginov   block: add helper...
441

d62e26b3f   Jens Axboe   block: pass in qu...
442
443
444
445
446
  void generic_start_io_acct(struct request_queue *q, int rw,
  				unsigned long sectors, struct hd_struct *part);
  void generic_end_io_acct(struct request_queue *q, int rw,
  				struct hd_struct *part,
  				unsigned long start_time);
394ffa503   Gu Zheng   blk: introduce ge...
447

2d4dc890b   Ilya Loginov   block: add helper...
448
449
450
451
452
453
454
455
456
457
  #ifndef ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
  # error	"You should define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE for your platform"
  #endif
  #if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
  extern void bio_flush_dcache_pages(struct bio *bi);
  #else
  static inline void bio_flush_dcache_pages(struct bio *bi)
  {
  }
  #endif
16ac3d63e   Kent Overstreet   block: Add bio_co...
458
  extern void bio_copy_data(struct bio *dst, struct bio *src);
a07876064   Kent Overstreet   block: Add bio_al...
459
  extern int bio_alloc_pages(struct bio *bio, gfp_t gfp);
491221f88   Guoqing Jiang   block: export bio...
460
  extern void bio_free_pages(struct bio *bio);
16ac3d63e   Kent Overstreet   block: Add bio_co...
461

152e283fd   FUJITA Tomonori   block: introduce ...
462
  extern struct bio *bio_copy_user_iov(struct request_queue *,
86d564c84   Al Viro   constify blk_rq_m...
463
  				     struct rq_map_data *,
26e49cfc7   Kent Overstreet   block: pass iov_i...
464
465
  				     const struct iov_iter *,
  				     gfp_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
  extern int bio_uncopy_user(struct bio *);
  void zero_fill_bio(struct bio *bio);
9f060e223   Kent Overstreet   block: Convert in...
468
469
  extern struct bio_vec *bvec_alloc(gfp_t, int, unsigned long *, mempool_t *);
  extern void bvec_free(mempool_t *, struct bio_vec *, unsigned int);
7ba1ba12e   Martin K. Petersen   block: Block laye...
470
  extern unsigned int bvec_nr_vecs(unsigned short idx);
3c84b5aaf   Jiufei Xue   block: display th...
471
  extern const char *bio_devname(struct bio *bio, char *buffer);
51d654e1d   Martin K. Petersen   block: Globalize ...
472

74d46992e   Christoph Hellwig   block: replace bi...
473
474
  #define bio_set_dev(bio, bdev) 			\
  do {						\
3ef1c33f9   Shaohua Li   block-throttle: a...
475
476
  	if ((bio)->bi_disk != (bdev)->bd_disk)	\
  		bio_clear_flag(bio, BIO_THROTTLED);\
74d46992e   Christoph Hellwig   block: replace bi...
477
478
479
480
481
482
483
484
485
486
487
488
  	(bio)->bi_disk = (bdev)->bd_disk;	\
  	(bio)->bi_partno = (bdev)->bd_partno;	\
  } while (0)
  
  #define bio_copy_dev(dst, src)			\
  do {						\
  	(dst)->bi_disk = (src)->bi_disk;	\
  	(dst)->bi_partno = (src)->bi_partno;	\
  } while (0)
  
  #define bio_dev(bio) \
  	disk_devt((bio)->bi_disk)
852c788f8   Tejun Heo   block: implement ...
489
  #ifdef CONFIG_BLK_CGROUP
1d933cf09   Tejun Heo   blkcg: implement ...
490
  int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css);
852c788f8   Tejun Heo   block: implement ...
491
492
  int bio_associate_current(struct bio *bio);
  void bio_disassociate_task(struct bio *bio);
20bd723ec   Paolo Valente   block: add missin...
493
  void bio_clone_blkcg_association(struct bio *dst, struct bio *src);
852c788f8   Tejun Heo   block: implement ...
494
  #else	/* CONFIG_BLK_CGROUP */
1d933cf09   Tejun Heo   blkcg: implement ...
495
496
  static inline int bio_associate_blkcg(struct bio *bio,
  			struct cgroup_subsys_state *blkcg_css) { return 0; }
852c788f8   Tejun Heo   block: implement ...
497
498
  static inline int bio_associate_current(struct bio *bio) { return -ENOENT; }
  static inline void bio_disassociate_task(struct bio *bio) { }
20bd723ec   Paolo Valente   block: add missin...
499
500
  static inline void bio_clone_blkcg_association(struct bio *dst,
  			struct bio *src) { }
852c788f8   Tejun Heo   block: implement ...
501
  #endif	/* CONFIG_BLK_CGROUP */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
503
  #ifdef CONFIG_HIGHMEM
  /*
20b636bf7   Alberto Bertogli   Fix misleading co...
504
505
   * remember never ever reenable interrupts between a bvec_kmap_irq and
   * bvec_kunmap_irq!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
   */
4f570f995   Alberto Bertogli   Do not __always_i...
507
  static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
509
510
511
512
513
514
515
  {
  	unsigned long addr;
  
  	/*
  	 * might not be a highmem page, but the preempt/irq count
  	 * balancing is a lot nicer this way
  	 */
  	local_irq_save(*flags);
e8e3c3d66   Cong Wang   fs: remove the se...
516
  	addr = (unsigned long) kmap_atomic(bvec->bv_page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
517
518
519
520
521
  
  	BUG_ON(addr & ~PAGE_MASK);
  
  	return (char *) addr + bvec->bv_offset;
  }
4f570f995   Alberto Bertogli   Do not __always_i...
522
  static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
524
  {
  	unsigned long ptr = (unsigned long) buffer & PAGE_MASK;
e8e3c3d66   Cong Wang   fs: remove the se...
525
  	kunmap_atomic((void *) ptr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
527
528
529
  	local_irq_restore(*flags);
  }
  
  #else
11a691bea   Geert Uytterhoeven   block: Turn bvec_...
530
531
532
533
534
535
536
537
538
  static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
  {
  	return page_address(bvec->bv_page) + bvec->bv_offset;
  }
  
  static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
  {
  	*flags = 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
539
  #endif
f619d2546   Kent Overstreet   block: Kill bio_i...
540
  static inline char *__bio_kmap_irq(struct bio *bio, struct bvec_iter iter,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
542
  				   unsigned long *flags)
  {
f619d2546   Kent Overstreet   block: Kill bio_i...
543
  	return bvec_kmap_irq(&bio_iter_iovec(bio, iter), flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
544
545
546
547
  }
  #define __bio_kunmap_irq(buf, flags)	bvec_kunmap_irq(buf, flags)
  
  #define bio_kmap_irq(bio, flags) \
f619d2546   Kent Overstreet   block: Kill bio_i...
548
  	__bio_kmap_irq((bio), (bio)->bi_iter, (flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
  #define bio_kunmap_irq(buf,flags)	__bio_kunmap_irq(buf, flags)
7a67f63b3   Jens Axboe   block: add bio_ha...
550
  /*
e686307fd   Akinobu Mita   loop: use BIO lis...
551
   * BIO list management for use by remapping drivers (e.g. DM or MD) and loop.
8f3d8ba20   Christoph Hellwig   block: move bio l...
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
   *
   * A bio_list anchors a singly-linked list of bios chained through the bi_next
   * member of the bio.  The bio_list also caches the last list member to allow
   * fast access to the tail.
   */
  struct bio_list {
  	struct bio *head;
  	struct bio *tail;
  };
  
  static inline int bio_list_empty(const struct bio_list *bl)
  {
  	return bl->head == NULL;
  }
  
  static inline void bio_list_init(struct bio_list *bl)
  {
  	bl->head = bl->tail = NULL;
  }
320ae51fe   Jens Axboe   blk-mq: new multi...
571
  #define BIO_EMPTY_LIST	{ NULL, NULL }
8f3d8ba20   Christoph Hellwig   block: move bio l...
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
  #define bio_list_for_each(bio, bl) \
  	for (bio = (bl)->head; bio; bio = bio->bi_next)
  
  static inline unsigned bio_list_size(const struct bio_list *bl)
  {
  	unsigned sz = 0;
  	struct bio *bio;
  
  	bio_list_for_each(bio, bl)
  		sz++;
  
  	return sz;
  }
  
  static inline void bio_list_add(struct bio_list *bl, struct bio *bio)
  {
  	bio->bi_next = NULL;
  
  	if (bl->tail)
  		bl->tail->bi_next = bio;
  	else
  		bl->head = bio;
  
  	bl->tail = bio;
  }
  
  static inline void bio_list_add_head(struct bio_list *bl, struct bio *bio)
  {
  	bio->bi_next = bl->head;
  
  	bl->head = bio;
  
  	if (!bl->tail)
  		bl->tail = bio;
  }
  
  static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2)
  {
  	if (!bl2->head)
  		return;
  
  	if (bl->tail)
  		bl->tail->bi_next = bl2->head;
  	else
  		bl->head = bl2->head;
  
  	bl->tail = bl2->tail;
  }
  
  static inline void bio_list_merge_head(struct bio_list *bl,
  				       struct bio_list *bl2)
  {
  	if (!bl2->head)
  		return;
  
  	if (bl->head)
  		bl2->tail->bi_next = bl->head;
  	else
  		bl->tail = bl2->tail;
  
  	bl->head = bl2->head;
  }
13685a165   Geert Uytterhoeven   block: Add bio_li...
634
635
636
637
  static inline struct bio *bio_list_peek(struct bio_list *bl)
  {
  	return bl->head;
  }
8f3d8ba20   Christoph Hellwig   block: move bio l...
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
  static inline struct bio *bio_list_pop(struct bio_list *bl)
  {
  	struct bio *bio = bl->head;
  
  	if (bio) {
  		bl->head = bl->head->bi_next;
  		if (!bl->head)
  			bl->tail = NULL;
  
  		bio->bi_next = NULL;
  	}
  
  	return bio;
  }
  
  static inline struct bio *bio_list_get(struct bio_list *bl)
  {
  	struct bio *bio = bl->head;
  
  	bl->head = bl->tail = NULL;
  
  	return bio;
  }
57fb233f0   Kent Overstreet   block: Reorder st...
661
  /*
0ef5a50c1   Mike Snitzer   block: make bio_i...
662
663
664
665
666
667
668
669
670
671
672
   * Increment chain count for the bio. Make sure the CHAIN flag update
   * is visible before the raised count.
   */
  static inline void bio_inc_remaining(struct bio *bio)
  {
  	bio_set_flag(bio, BIO_CHAIN);
  	smp_mb__before_atomic();
  	atomic_inc(&bio->__bi_remaining);
  }
  
  /*
57fb233f0   Kent Overstreet   block: Reorder st...
673
674
675
676
677
678
   * bio_set is used to allow other portions of the IO system to
   * allocate their own private memory pools for bio and iovec structures.
   * These memory pools in turn all allocate from the bio_slab
   * and the bvec_slabs[].
   */
  #define BIO_POOL_SIZE 2
57fb233f0   Kent Overstreet   block: Reorder st...
679
680
681
682
683
684
  
  struct bio_set {
  	struct kmem_cache *bio_slab;
  	unsigned int front_pad;
  
  	mempool_t *bio_pool;
9f060e223   Kent Overstreet   block: Convert in...
685
  	mempool_t *bvec_pool;
57fb233f0   Kent Overstreet   block: Reorder st...
686
687
  #if defined(CONFIG_BLK_DEV_INTEGRITY)
  	mempool_t *bio_integrity_pool;
9f060e223   Kent Overstreet   block: Convert in...
688
  	mempool_t *bvec_integrity_pool;
57fb233f0   Kent Overstreet   block: Reorder st...
689
  #endif
df2cb6daa   Kent Overstreet   block: Avoid dead...
690
691
692
693
694
695
696
697
698
  
  	/*
  	 * Deadlock avoidance for stacking block drivers: see comments in
  	 * bio_alloc_bioset() for details
  	 */
  	spinlock_t		rescue_lock;
  	struct bio_list		rescue_list;
  	struct work_struct	rescue_work;
  	struct workqueue_struct	*rescue_workqueue;
57fb233f0   Kent Overstreet   block: Reorder st...
699
700
701
702
703
704
705
706
707
708
709
710
711
  };
  
  struct biovec_slab {
  	int nr_vecs;
  	char *name;
  	struct kmem_cache *slab;
  };
  
  /*
   * a small number of entries is fine, not going to be performance critical.
   * basically we just need to survive
   */
  #define BIO_SPLIT_ENTRIES 2
7ba1ba12e   Martin K. Petersen   block: Block laye...
712
  #if defined(CONFIG_BLK_DEV_INTEGRITY)
d57a5f7c6   Kent Overstreet   bio-integrity: Co...
713
714
  #define bip_for_each_vec(bvl, bip, iter)				\
  	for_each_bvec(bvl, (bip)->bip_vec, iter, (bip)->bip_iter)
7ba1ba12e   Martin K. Petersen   block: Block laye...
715

13f05c8d8   Martin K. Petersen   block/scsi: Provi...
716
717
718
  #define bio_for_each_integrity_vec(_bvl, _bio, _iter)			\
  	for_each_bio(_bio)						\
  		bip_for_each_vec(_bvl, _bio->bi_integrity, _iter)
7ba1ba12e   Martin K. Petersen   block: Block laye...
719
  extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int);
7ba1ba12e   Martin K. Petersen   block: Block laye...
720
  extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int);
e23947bd7   Dmitry Monakhov   bio-integrity: fo...
721
  extern bool bio_integrity_prep(struct bio *);
7ba1ba12e   Martin K. Petersen   block: Block laye...
722
  extern void bio_integrity_advance(struct bio *, unsigned int);
fbd08e767   Dmitry Monakhov   bio-integrity: fi...
723
  extern void bio_integrity_trim(struct bio *);
1e2a410ff   Kent Overstreet   block: Ues bi_poo...
724
  extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t);
7878cba9f   Martin K. Petersen   block: Create bip...
725
726
727
  extern int bioset_integrity_create(struct bio_set *, int);
  extern void bioset_integrity_free(struct bio_set *);
  extern void bio_integrity_init(void);
7ba1ba12e   Martin K. Petersen   block: Block laye...
728
729
  
  #else /* CONFIG_BLK_DEV_INTEGRITY */
c611529e7   Martin K. Petersen   sd: Honor block l...
730
  static inline void *bio_integrity(struct bio *bio)
6898e3bd1   Martin K. Petersen   block: Stop using...
731
  {
c611529e7   Martin K. Petersen   sd: Honor block l...
732
  	return NULL;
6898e3bd1   Martin K. Petersen   block: Stop using...
733
  }
6898e3bd1   Martin K. Petersen   block: Stop using...
734
735
736
737
738
739
740
741
742
  static inline int bioset_integrity_create(struct bio_set *bs, int pool_size)
  {
  	return 0;
  }
  
  static inline void bioset_integrity_free (struct bio_set *bs)
  {
  	return;
  }
e23947bd7   Dmitry Monakhov   bio-integrity: fo...
743
  static inline bool bio_integrity_prep(struct bio *bio)
6898e3bd1   Martin K. Petersen   block: Stop using...
744
  {
e23947bd7   Dmitry Monakhov   bio-integrity: fo...
745
  	return true;
6898e3bd1   Martin K. Petersen   block: Stop using...
746
  }
0c614e2d3   Stephen Rothwell   include/linux/bio...
747
  static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
1e2a410ff   Kent Overstreet   block: Ues bi_poo...
748
  				      gfp_t gfp_mask)
0c614e2d3   Stephen Rothwell   include/linux/bio...
749
750
751
  {
  	return 0;
  }
6898e3bd1   Martin K. Petersen   block: Stop using...
752

6898e3bd1   Martin K. Petersen   block: Stop using...
753
754
755
756
757
  static inline void bio_integrity_advance(struct bio *bio,
  					 unsigned int bytes_done)
  {
  	return;
  }
fbd08e767   Dmitry Monakhov   bio-integrity: fi...
758
  static inline void bio_integrity_trim(struct bio *bio)
6898e3bd1   Martin K. Petersen   block: Stop using...
759
760
761
762
763
764
765
766
  {
  	return;
  }
  
  static inline void bio_integrity_init(void)
  {
  	return;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
767

c611529e7   Martin K. Petersen   sd: Honor block l...
768
769
770
771
  static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
  {
  	return false;
  }
06c1e3902   Keith Busch   blk-integrity: em...
772
773
774
775
776
777
778
779
780
781
782
  static inline void *bio_integrity_alloc(struct bio * bio, gfp_t gfp,
  								unsigned int nr)
  {
  	return ERR_PTR(-EINVAL);
  }
  
  static inline int bio_integrity_add_page(struct bio *bio, struct page *page,
  					unsigned int len, unsigned int offset)
  {
  	return 0;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
783
  #endif /* CONFIG_BLK_DEV_INTEGRITY */
02a5e0acb   David Howells   BLOCK: Hide the c...
784
  #endif /* CONFIG_BLOCK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
  #endif /* __LINUX_BIO_H */