Blame view

include/linux/blkdev.h 25.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_BLKDEV_H
  #define _LINUX_BLKDEV_H
f5ff8422b   Jens Axboe   Fix warnings with...
3
  #ifdef CONFIG_BLOCK
bcfd8d361   Andrew Morton   [PATCH] CONFIG_BL...
4
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
14
15
16
  #include <linux/major.h>
  #include <linux/genhd.h>
  #include <linux/list.h>
  #include <linux/timer.h>
  #include <linux/workqueue.h>
  #include <linux/pagemap.h>
  #include <linux/backing-dev.h>
  #include <linux/wait.h>
  #include <linux/mempool.h>
  #include <linux/bio.h>
  #include <linux/module.h>
  #include <linux/stringify.h>
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
17
  #include <linux/bsg.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
  
  #include <asm/scatterlist.h>
21b2f0c80   Christoph Hellwig   [SCSI] unify SCSI...
20
  struct scsi_ioctl_command;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  struct request_queue;
71f65e6bd   Jens Axboe   [BLOCK] Add reque...
22
  typedef struct request_queue request_queue_t __deprecated;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
  struct elevator_queue;
  typedef struct elevator_queue elevator_t;
  struct request_pm_state;
2056a782f   Jens Axboe   [PATCH] Block que...
26
  struct blk_trace;
3d6392cfb   Jens Axboe   bsg: support for ...
27
28
  struct request;
  struct sg_io_hdr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
  
  #define BLKDEV_MIN_RQ	4
  #define BLKDEV_MAX_RQ	128	/* Default maximum */
d38ecf935   Jens Axboe   io context sharin...
32
  int put_io_context(struct io_context *ioc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  void exit_io_context(void);
b5deef901   Jens Axboe   [PATCH] Make sure...
34
  struct io_context *get_io_context(gfp_t gfp_flags, int node);
fd0928df9   Jens Axboe   ioprio: move io p...
35
  struct io_context *alloc_io_context(gfp_t gfp_flags, int node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  void copy_io_context(struct io_context **pdst, struct io_context **psrc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
  
  struct request;
8ffdc6550   Tejun Heo   [BLOCK] add @upto...
39
  typedef void (rq_end_io_fn)(struct request *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
  
  struct request_list {
  	int count[2];
  	int starved[2];
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
44
  	int elvpriv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  	mempool_t *rq_pool;
  	wait_queue_head_t wait[2];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  };
4aff5e233   Jens Axboe   [PATCH] Split str...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  /*
   * request command types
   */
  enum rq_cmd_type_bits {
  	REQ_TYPE_FS		= 1,	/* fs request */
  	REQ_TYPE_BLOCK_PC,		/* scsi command */
  	REQ_TYPE_SENSE,			/* sense request */
  	REQ_TYPE_PM_SUSPEND,		/* suspend request */
  	REQ_TYPE_PM_RESUME,		/* resume request */
  	REQ_TYPE_PM_SHUTDOWN,		/* shutdown request */
  	REQ_TYPE_FLUSH,			/* flush request */
  	REQ_TYPE_SPECIAL,		/* driver defined type */
  	REQ_TYPE_LINUX_BLOCK,		/* generic block layer message */
  	/*
  	 * for ATA/ATAPI devices. this really doesn't belong here, ide should
  	 * use REQ_TYPE_SPECIAL and use rq->cmd[0] with the range of driver
  	 * private REQ_LB opcodes to differentiate what type of request this is
  	 */
4aff5e233   Jens Axboe   [PATCH] Split str...
66
  	REQ_TYPE_ATA_TASKFILE,
cea2885a2   Jens Axboe   [PATCH] ide-cd: f...
67
  	REQ_TYPE_ATA_PC,
4aff5e233   Jens Axboe   [PATCH] Split str...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  };
  
  /*
   * For request of type REQ_TYPE_LINUX_BLOCK, rq->cmd[0] is the opcode being
   * sent down (similar to how REQ_TYPE_BLOCK_PC means that ->cmd[] holds a
   * SCSI cdb.
   *
   * 0x00 -> 0x3f are driver private, to be used for whatever purpose they need,
   * typically to differentiate REQ_TYPE_SPECIAL requests.
   *
   */
  enum {
  	/*
  	 * just examples for now
  	 */
  	REQ_LB_OP_EJECT	= 0x40,		/* eject request */
  	REQ_LB_OP_FLUSH = 0x41,		/* flush device */
  };
  
  /*
   * request type modified bits. first three bits match BIO_RW* bits, important
   */
  enum rq_flag_bits {
  	__REQ_RW,		/* not set, read. set, write */
  	__REQ_FAILFAST,		/* no low level driver retries */
  	__REQ_SORTED,		/* elevator knows about this request */
  	__REQ_SOFTBARRIER,	/* may not be passed by ioscheduler */
  	__REQ_HARDBARRIER,	/* may not be passed by drive either */
  	__REQ_FUA,		/* forced unit access */
  	__REQ_NOMERGE,		/* don't touch this for merging */
  	__REQ_STARTED,		/* drive already may have started this one */
  	__REQ_DONTPREP,		/* don't call prep for this one */
  	__REQ_QUEUED,		/* uses queueing */
  	__REQ_ELVPRIV,		/* elevator private data attached */
  	__REQ_FAILED,		/* set if the request failed */
  	__REQ_QUIET,		/* don't worry about errors */
  	__REQ_PREEMPT,		/* set for "ide_preempt" requests */
  	__REQ_ORDERED_COLOR,	/* is before or after barrier */
  	__REQ_RW_SYNC,		/* request is sync (O_DIRECT) */
49171e5c6   Jens Axboe   [PATCH] Remove st...
107
  	__REQ_ALLOCED,		/* request came from our alloc pool */
5404bc7a8   Jens Axboe   [PATCH] Allow fil...
108
  	__REQ_RW_META,		/* metadata io request */
4aff5e233   Jens Axboe   [PATCH] Split str...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  	__REQ_NR_BITS,		/* stops here */
  };
  
  #define REQ_RW		(1 << __REQ_RW)
  #define REQ_FAILFAST	(1 << __REQ_FAILFAST)
  #define REQ_SORTED	(1 << __REQ_SORTED)
  #define REQ_SOFTBARRIER	(1 << __REQ_SOFTBARRIER)
  #define REQ_HARDBARRIER	(1 << __REQ_HARDBARRIER)
  #define REQ_FUA		(1 << __REQ_FUA)
  #define REQ_NOMERGE	(1 << __REQ_NOMERGE)
  #define REQ_STARTED	(1 << __REQ_STARTED)
  #define REQ_DONTPREP	(1 << __REQ_DONTPREP)
  #define REQ_QUEUED	(1 << __REQ_QUEUED)
  #define REQ_ELVPRIV	(1 << __REQ_ELVPRIV)
  #define REQ_FAILED	(1 << __REQ_FAILED)
  #define REQ_QUIET	(1 << __REQ_QUIET)
  #define REQ_PREEMPT	(1 << __REQ_PREEMPT)
  #define REQ_ORDERED_COLOR	(1 << __REQ_ORDERED_COLOR)
  #define REQ_RW_SYNC	(1 << __REQ_RW_SYNC)
49171e5c6   Jens Axboe   [PATCH] Remove st...
128
  #define REQ_ALLOCED	(1 << __REQ_ALLOCED)
5404bc7a8   Jens Axboe   [PATCH] Allow fil...
129
  #define REQ_RW_META	(1 << __REQ_RW_META)
4aff5e233   Jens Axboe   [PATCH] Split str...
130

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
  #define BLK_MAX_CDB	16
  
  /*
63a713867   Jens Axboe   block: fixup rq_i...
134
135
136
   * try to put the fields that are referenced together in the same cacheline.
   * if you modify this structure, be sure to check block/blk-core.c:rq_init()
   * as well!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
   */
  struct request {
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
139
140
  	struct list_head queuelist;
  	struct list_head donelist;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
141
  	struct request_queue *q;
e6a1c874a   Jens Axboe   [PATCH] struct re...
142

4aff5e233   Jens Axboe   [PATCH] Split str...
143
144
  	unsigned int cmd_flags;
  	enum rq_cmd_type_bits cmd_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
148
149
150
  
  	/* Maintain bio traversal state for part by part I/O submission.
  	 * hard_* are block layer internals, no driver should touch them!
  	 */
  
  	sector_t sector;		/* next sector to submit */
e6a1c874a   Jens Axboe   [PATCH] struct re...
151
  	sector_t hard_sector;		/* next sector to complete */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
  	unsigned long nr_sectors;	/* no. of sectors left to submit */
e6a1c874a   Jens Axboe   [PATCH] struct re...
153
  	unsigned long hard_nr_sectors;	/* no. of sectors left to complete */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
  	/* no. of sectors left to submit in the current segment */
  	unsigned int current_nr_sectors;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
158
159
160
  	/* no. of sectors left to complete in the current segment */
  	unsigned int hard_cur_sectors;
  
  	struct bio *bio;
  	struct bio *biotail;
9817064b6   Jens Axboe   [PATCH] elevator:...
161
  	struct hlist_node hash;	/* merge hash */
e6a1c874a   Jens Axboe   [PATCH] struct re...
162
163
164
165
166
167
168
169
170
  	/*
  	 * The rb_node is only used inside the io scheduler, requests
  	 * are pruned when moved to the dispatch queue. So let the
  	 * completion_data share space with the rb_node.
  	 */
  	union {
  		struct rb_node rb_node;	/* sort/lookup */
  		void *completion_data;
  	};
9817064b6   Jens Axboe   [PATCH] elevator:...
171

ff7d145fd   Jens Axboe   [PATCH] Add one m...
172
173
174
175
  	/*
  	 * two pointers are available for the IO schedulers, if they need
  	 * more they have to dynamically allocate it.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  	void *elevator_private;
ff7d145fd   Jens Axboe   [PATCH] Add one m...
177
  	void *elevator_private2;
8f34ee75d   Jens Axboe   [PATCH] Rearrange...
178
  	struct gendisk *rq_disk;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
186
187
188
189
190
191
  	unsigned long start_time;
  
  	/* Number of scatter-gather DMA addr+len pairs after
  	 * physical address coalescing is performed.
  	 */
  	unsigned short nr_phys_segments;
  
  	/* Number of scatter-gather addr+len pairs after
  	 * physical and DMA remapping hardware coalescing is performed.
  	 * This is the number of scatter-gather entries the driver
  	 * will actually have to deal with after DMA mapping is done.
  	 */
  	unsigned short nr_hw_segments;
8f34ee75d   Jens Axboe   [PATCH] Rearrange...
192
  	unsigned short ioprio;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
  	void *special;
8f34ee75d   Jens Axboe   [PATCH] Rearrange...
194
  	char *buffer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195

cdd602621   Jens Axboe   [PATCH] Remove ->...
196
197
198
199
  	int tag;
  	int errors;
  
  	int ref_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
205
206
  	/*
  	 * when request is used as a packet command carrier
  	 */
  	unsigned int cmd_len;
  	unsigned char cmd[BLK_MAX_CDB];
  
  	unsigned int data_len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  	unsigned int sense_len;
8f34ee75d   Jens Axboe   [PATCH] Rearrange...
208
  	void *data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
211
  	void *sense;
  
  	unsigned int timeout;
17e01f216   Mike Christie   [SCSI] add retrie...
212
  	int retries;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
  
  	/*
c00895ab2   Jens Axboe   [PATCH] Remove ->...
215
  	 * completion callback.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
217
218
  	 */
  	rq_end_io_fn *end_io;
  	void *end_io_data;
abae1fde6   FUJITA Tomonori   add a struct requ...
219
220
221
  
  	/* for bidi */
  	struct request *next_rq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
  };
  
  /*
4aff5e233   Jens Axboe   [PATCH] Split str...
225
   * State information carried for REQ_TYPE_PM_SUSPEND and REQ_TYPE_PM_RESUME
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
232
233
234
235
236
237
   * requests. Some step values could eventually be made generic.
   */
  struct request_pm_state
  {
  	/* PM state machine step value, currently driver specific */
  	int	pm_step;
  	/* requested PM state value (S1, S2, S3, S4, ...) */
  	u32	pm_state;
  	void*	data;		/* for driver use */
  };
  
  #include <linux/elevator.h>
165125e1e   Jens Axboe   [BLOCK] Get rid o...
238
239
240
241
  typedef void (request_fn_proc) (struct request_queue *q);
  typedef int (make_request_fn) (struct request_queue *q, struct bio *bio);
  typedef int (prep_rq_fn) (struct request_queue *, struct request *);
  typedef void (unplug_fn) (struct request_queue *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
  
  struct bio_vec;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
244
  typedef int (merge_bvec_fn) (struct request_queue *, struct bio *, struct bio_vec *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
245
  typedef void (prepare_flush_fn) (struct request_queue *, struct request *);
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
246
  typedef void (softirq_done_fn)(struct request *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
248
249
250
251
  
  enum blk_queue_state {
  	Queue_down,
  	Queue_up,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
253
254
  struct blk_queue_tag {
  	struct request **tag_index;	/* map of busy tags */
  	unsigned long *tag_map;		/* bit map of free/busy tags */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
  	int busy;			/* current depth */
  	int max_depth;			/* what we will send to device */
ba0250824   Tejun Heo   [PATCH] blk: fix ...
257
  	int real_max_depth;		/* what the array can hold */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
  	atomic_t refcnt;		/* map can be shared */
  };
  
  struct request_queue
  {
  	/*
  	 * Together with queue_head for cacheline sharing
  	 */
  	struct list_head	queue_head;
  	struct request		*last_merge;
  	elevator_t		*elevator;
  
  	/*
  	 * the queue request freelist, one for reads and one for writes
  	 */
  	struct request_list	rq;
  
  	request_fn_proc		*request_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
279
  	make_request_fn		*make_request_fn;
  	prep_rq_fn		*prep_rq_fn;
  	unplug_fn		*unplug_fn;
  	merge_bvec_fn		*merge_bvec_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
  	prepare_flush_fn	*prepare_flush_fn;
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
281
  	softirq_done_fn		*softirq_done_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
  
  	/*
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
284
285
  	 * Dispatch queue sorting
  	 */
1b47f531e   Jens Axboe   [PATCH] generic d...
286
  	sector_t		end_sector;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
287
  	struct request		*boundary_rq;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
288
289
  
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
292
293
294
295
296
297
298
299
300
301
302
303
  	 * Auto-unplugging state
  	 */
  	struct timer_list	unplug_timer;
  	int			unplug_thresh;	/* After this many requests */
  	unsigned long		unplug_delay;	/* After this many jiffies */
  	struct work_struct	unplug_work;
  
  	struct backing_dev_info	backing_dev_info;
  
  	/*
  	 * The queue owner gets to use this for whatever they like.
  	 * ll_rw_blk doesn't touch it.
  	 */
  	void			*queuedata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
306
307
  	/*
  	 * queue needs bounce pages for pages above this limit
  	 */
  	unsigned long		bounce_pfn;
8267e268e   Al Viro   [PATCH] gfp_t: bl...
308
  	gfp_t			bounce_gfp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
311
312
313
314
315
  
  	/*
  	 * various queue flags, see QUEUE_* below
  	 */
  	unsigned long		queue_flags;
  
  	/*
152587deb   Jens Axboe   [PATCH] fix NMI l...
316
317
318
  	 * protects queue structures from reentrancy. ->__queue_lock should
  	 * _never_ be used directly, it is queue private. always use
  	 * ->queue_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
  	 */
152587deb   Jens Axboe   [PATCH] fix NMI l...
320
  	spinlock_t		__queue_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
322
323
324
325
326
327
328
329
330
331
332
333
334
  	spinlock_t		*queue_lock;
  
  	/*
  	 * queue kobject
  	 */
  	struct kobject kobj;
  
  	/*
  	 * queue settings
  	 */
  	unsigned long		nr_requests;	/* Max # of requests */
  	unsigned int		nr_congestion_on;
  	unsigned int		nr_congestion_off;
  	unsigned int		nr_batching;
2cb2e147a   Jens Axboe   [BLOCK] ll_rw_blk...
335
336
  	unsigned int		max_sectors;
  	unsigned int		max_hw_sectors;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
340
341
342
  	unsigned short		max_phys_segments;
  	unsigned short		max_hw_segments;
  	unsigned short		hardsect_size;
  	unsigned int		max_segment_size;
  
  	unsigned long		seg_boundary_mask;
fa0ccd837   James Bottomley   block: implement ...
343
344
  	void			*dma_drain_buffer;
  	unsigned int		dma_drain_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
345
346
347
  	unsigned int		dma_alignment;
  
  	struct blk_queue_tag	*queue_tags;
6eca9004d   Jens Axboe   [BLOCK] Fix bad s...
348
  	struct list_head	tag_busy_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349

15853af9f   Tejun Heo   [BLOCK] Implement...
350
  	unsigned int		nr_sorted;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
351
352
353
354
355
356
357
  	unsigned int		in_flight;
  
  	/*
  	 * sg stuff
  	 */
  	unsigned int		sg_timeout;
  	unsigned int		sg_reserved_size;
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
358
  	int			node;
6c5c93415   Alexey Dobriyan   [PATCH] ifdef blk...
359
  #ifdef CONFIG_BLK_DEV_IO_TRACE
2056a782f   Jens Axboe   [PATCH] Block que...
360
  	struct blk_trace	*blk_trace;
6c5c93415   Alexey Dobriyan   [PATCH] ifdef blk...
361
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
364
  	/*
  	 * reserved for flush operations
  	 */
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
365
366
367
368
  	unsigned int		ordered, next_ordered, ordseq;
  	int			orderr, ordcolor;
  	struct request		pre_flush_rq, bar_rq, post_flush_rq;
  	struct request		*orig_bar_rq;
483f4afc4   Al Viro   [PATCH] fix sysfs...
369
370
  
  	struct mutex		sysfs_lock;
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
371
372
373
374
  
  #if defined(CONFIG_BLK_DEV_BSG)
  	struct bsg_class_device bsg_dev;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
377
378
  #define QUEUE_FLAG_CLUSTER	0	/* cluster several segments into 1 */
  #define QUEUE_FLAG_QUEUED	1	/* uses generic tag queueing */
  #define QUEUE_FLAG_STOPPED	2	/* queue is stopped */
4e97182a2   Qi Yong   [patch] QUEUE_FLA...
379
380
  #define	QUEUE_FLAG_READFULL	3	/* read queue has been filled */
  #define QUEUE_FLAG_WRITEFULL	4	/* write queue has been filled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
382
383
  #define QUEUE_FLAG_DEAD		5	/* queue being torn down */
  #define QUEUE_FLAG_REENTER	6	/* Re-entrancy avoidance */
  #define QUEUE_FLAG_PLUGGED	7	/* queue is plugged */
64521d1a3   Jens Axboe   [BLOCK] elevator ...
384
  #define QUEUE_FLAG_ELVSWITCH	8	/* don't use elevator, just do FIFO */
abae1fde6   FUJITA Tomonori   add a struct requ...
385
  #define QUEUE_FLAG_BIDI		9	/* queue supports bidi requests */
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
  
  enum {
  	/*
  	 * Hardbarrier is supported with one of the following methods.
  	 *
  	 * NONE		: hardbarrier unsupported
  	 * DRAIN	: ordering by draining is enough
  	 * DRAIN_FLUSH	: ordering by draining w/ pre and post flushes
  	 * DRAIN_FUA	: ordering by draining w/ pre flush and FUA write
  	 * TAG		: ordering by tag is enough
  	 * TAG_FLUSH	: ordering by tag w/ pre and post flushes
  	 * TAG_FUA	: ordering by tag w/ pre flush and FUA write
  	 */
  	QUEUE_ORDERED_NONE	= 0x00,
  	QUEUE_ORDERED_DRAIN	= 0x01,
  	QUEUE_ORDERED_TAG	= 0x02,
  
  	QUEUE_ORDERED_PREFLUSH	= 0x10,
  	QUEUE_ORDERED_POSTFLUSH	= 0x20,
  	QUEUE_ORDERED_FUA	= 0x40,
  
  	QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN |
  			QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH,
  	QUEUE_ORDERED_DRAIN_FUA	= QUEUE_ORDERED_DRAIN |
  			QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA,
  	QUEUE_ORDERED_TAG_FLUSH	= QUEUE_ORDERED_TAG |
  			QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH,
  	QUEUE_ORDERED_TAG_FUA	= QUEUE_ORDERED_TAG |
  			QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA,
  
  	/*
  	 * Ordered operation sequence
  	 */
  	QUEUE_ORDSEQ_STARTED	= 0x01,	/* flushing in progress */
  	QUEUE_ORDSEQ_DRAIN	= 0x02,	/* waiting for the queue to be drained */
  	QUEUE_ORDSEQ_PREFLUSH	= 0x04,	/* pre-flushing in progress */
  	QUEUE_ORDSEQ_BAR	= 0x08,	/* original barrier req in progress */
  	QUEUE_ORDSEQ_POSTFLUSH	= 0x10,	/* post-flushing in progress */
  	QUEUE_ORDSEQ_DONE	= 0x20,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
427
428
429
  
  #define blk_queue_plugged(q)	test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
  #define blk_queue_tagged(q)	test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)
  #define blk_queue_stopped(q)	test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
430
  #define blk_queue_flushing(q)	((q)->ordseq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431

4aff5e233   Jens Axboe   [PATCH] Split str...
432
433
434
435
436
437
438
  #define blk_fs_request(rq)	((rq)->cmd_type == REQ_TYPE_FS)
  #define blk_pc_request(rq)	((rq)->cmd_type == REQ_TYPE_BLOCK_PC)
  #define blk_special_request(rq)	((rq)->cmd_type == REQ_TYPE_SPECIAL)
  #define blk_sense_request(rq)	((rq)->cmd_type == REQ_TYPE_SENSE)
  
  #define blk_noretry_request(rq)	((rq)->cmd_flags & REQ_FAILFAST)
  #define blk_rq_started(rq)	((rq)->cmd_flags & REQ_STARTED)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
440
  
  #define blk_account_rq(rq)	(blk_rq_started(rq) && blk_fs_request(rq))
4aff5e233   Jens Axboe   [PATCH] Split str...
441
442
  #define blk_pm_suspend_request(rq)	((rq)->cmd_type == REQ_TYPE_PM_SUSPEND)
  #define blk_pm_resume_request(rq)	((rq)->cmd_type == REQ_TYPE_PM_RESUME)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
  #define blk_pm_request(rq)	\
4aff5e233   Jens Axboe   [PATCH] Split str...
444
  	(blk_pm_suspend_request(rq) || blk_pm_resume_request(rq))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445

4aff5e233   Jens Axboe   [PATCH] Split str...
446
447
448
  #define blk_sorted_rq(rq)	((rq)->cmd_flags & REQ_SORTED)
  #define blk_barrier_rq(rq)	((rq)->cmd_flags & REQ_HARDBARRIER)
  #define blk_fua_rq(rq)		((rq)->cmd_flags & REQ_FUA)
abae1fde6   FUJITA Tomonori   add a struct requ...
449
  #define blk_bidi_rq(rq)		((rq)->next_rq != NULL)
bf2de6f5a   Jens Axboe   block: Initial su...
450
  #define blk_empty_barrier(rq)	(blk_barrier_rq(rq) && blk_fs_request(rq) && !(rq)->hard_nr_sectors)
336cdb400   Kiyoshi Ueda   blk_end_request: ...
451
452
  /* rq->queuelist of dequeued request must be list_empty() */
  #define blk_queued_rq(rq)	(!list_empty(&(rq)->queuelist))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
454
  
  #define list_entry_rq(ptr)	list_entry((ptr), struct request, queuelist)
4aff5e233   Jens Axboe   [PATCH] Split str...
455
  #define rq_data_dir(rq)		((rq)->cmd_flags & 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

9e2585a8a   Jens Axboe   [PATCH] as-iosche...
457
458
459
460
  /*
   * We regard a request as sync, if it's a READ or a SYNC write.
   */
  #define rq_is_sync(rq)		(rq_data_dir((rq)) == READ || (rq)->cmd_flags & REQ_RW_SYNC)
5404bc7a8   Jens Axboe   [PATCH] Allow fil...
461
  #define rq_is_meta(rq)		((rq)->cmd_flags & REQ_RW_META)
9e2585a8a   Jens Axboe   [PATCH] as-iosche...
462

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
  static inline int blk_queue_full(struct request_queue *q, int rw)
  {
  	if (rw == READ)
  		return test_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
  	return test_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
  }
  
  static inline void blk_set_queue_full(struct request_queue *q, int rw)
  {
  	if (rw == READ)
  		set_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
  	else
  		set_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
  }
  
  static inline void blk_clear_queue_full(struct request_queue *q, int rw)
  {
  	if (rw == READ)
  		clear_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
  	else
  		clear_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
  }
  
  
  /*
   * mergeable request must not have _NOMERGE or _BARRIER bit set, nor may
   * it already be started by driver.
   */
  #define RQ_NOMERGE_FLAGS	\
  	(REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER)
  #define rq_mergeable(rq)	\
4aff5e233   Jens Axboe   [PATCH] Split str...
494
  	(!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && blk_fs_request((rq)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
496
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
   * q->prep_rq_fn return values
   */
  #define BLKPREP_OK		0	/* serve it */
  #define BLKPREP_KILL		1	/* fatal error, kill */
  #define BLKPREP_DEFER		2	/* leave on queue */
  
  extern unsigned long blk_max_low_pfn, blk_max_pfn;
  
  /*
   * standard bounce addresses:
   *
   * BLK_BOUNCE_HIGH	: bounce all highmem pages
   * BLK_BOUNCE_ANY	: don't bounce anything
   * BLK_BOUNCE_ISA	: bounce pages above ISA DMA boundary
   */
  #define BLK_BOUNCE_HIGH		((u64)blk_max_low_pfn << PAGE_SHIFT)
  #define BLK_BOUNCE_ANY		((u64)blk_max_pfn << PAGE_SHIFT)
  #define BLK_BOUNCE_ISA		(ISA_DMA_THRESHOLD)
3d6392cfb   Jens Axboe   bsg: support for ...
515
516
517
518
  /*
   * default timeout for SG_IO if none specified
   */
  #define BLK_DEFAULT_SG_TIMEOUT	(60 * HZ)
2a7326b5b   Christoph Lameter   CONFIG_BOUNCE to ...
519
  #ifdef CONFIG_BOUNCE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
  extern int init_emergency_isa_pool(void);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
521
  extern void blk_queue_bounce(struct request_queue *q, struct bio **bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
524
525
526
  #else
  static inline int init_emergency_isa_pool(void)
  {
  	return 0;
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
527
  static inline void blk_queue_bounce(struct request_queue *q, struct bio **bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
529
530
  {
  }
  #endif /* CONFIG_MMU */
5705f7021   NeilBrown   Introduce rq_for_...
531
532
533
534
535
536
537
  struct req_iterator {
  	int i;
  	struct bio *bio;
  };
  
  /* This should not be used directly - use rq_for_each_segment */
  #define __rq_for_each_bio(_bio, rq)	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
538
539
  	if ((rq->bio))			\
  		for (_bio = (rq)->bio; _bio; _bio = _bio->bi_next)
5705f7021   NeilBrown   Introduce rq_for_...
540
541
542
543
544
545
  #define rq_for_each_segment(bvl, _rq, _iter)			\
  	__rq_for_each_bio(_iter.bio, _rq)			\
  		bio_for_each_segment(bvl, _iter.bio, _iter.i)
  
  #define rq_iter_last(rq, _iter)					\
  		(_iter.bio->bi_next == NULL && _iter.i == _iter.bio->bi_vcnt-1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
547
548
549
550
  extern int blk_register_queue(struct gendisk *disk);
  extern void blk_unregister_queue(struct gendisk *disk);
  extern void register_disk(struct gendisk *dev);
  extern void generic_make_request(struct bio *bio);
  extern void blk_put_request(struct request *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
551
  extern void __blk_put_request(struct request_queue *, struct request *);
8ffdc6550   Tejun Heo   [BLOCK] add @upto...
552
  extern void blk_end_sync_rq(struct request *rq, int error);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
553
554
555
556
557
558
  extern struct request *blk_get_request(struct request_queue *, int, gfp_t);
  extern void blk_insert_request(struct request_queue *, struct request *, int, void *);
  extern void blk_requeue_request(struct request_queue *, struct request *);
  extern void blk_plug_device(struct request_queue *);
  extern int blk_remove_plug(struct request_queue *);
  extern void blk_recount_segments(struct request_queue *, struct bio *);
45e79a3ac   FUJITA Tomonori   bsg: add a reques...
559
560
  extern int scsi_cmd_ioctl(struct file *, struct request_queue *,
  			  struct gendisk *, unsigned int, void __user *);
21b2f0c80   Christoph Hellwig   [SCSI] unify SCSI...
561
562
  extern int sg_scsi_ioctl(struct file *, struct request_queue *,
  		struct gendisk *, struct scsi_ioctl_command __user *);
3fcfab16c   Andrew Morton   [PATCH] separate ...
563
564
  
  /*
1aa4f24fe   Jens Axboe   [PATCH] Remove qu...
565
566
   * Temporary export, until SCSI gets fixed up.
   */
3001ca771   NeilBrown   New function blk_...
567
568
  extern int blk_rq_append_bio(struct request_queue *q, struct request *rq,
  			     struct bio *bio);
1aa4f24fe   Jens Axboe   [PATCH] Remove qu...
569
570
  
  /*
3fcfab16c   Andrew Morton   [PATCH] separate ...
571
572
573
574
   * A queue has just exitted congestion.  Note this in the global counter of
   * congested queues, and wake up anyone who was waiting for requests to be
   * put back.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
575
  static inline void blk_clear_queue_congested(struct request_queue *q, int rw)
3fcfab16c   Andrew Morton   [PATCH] separate ...
576
577
578
579
580
581
582
583
  {
  	clear_bdi_congested(&q->backing_dev_info, rw);
  }
  
  /*
   * A queue has just entered congestion.  Flag that in the queue's VM-visible
   * state flags and increment the global gounter of congested queues.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
584
  static inline void blk_set_queue_congested(struct request_queue *q, int rw)
3fcfab16c   Andrew Morton   [PATCH] separate ...
585
586
587
  {
  	set_bdi_congested(&q->backing_dev_info, rw);
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
588
589
  extern void blk_start_queue(struct request_queue *q);
  extern void blk_stop_queue(struct request_queue *q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
  extern void blk_sync_queue(struct request_queue *q);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
591
592
593
594
  extern void __blk_stop_queue(struct request_queue *q);
  extern void blk_run_queue(struct request_queue *);
  extern void blk_start_queueing(struct request_queue *);
  extern int blk_rq_map_user(struct request_queue *, struct request *, void __user *, unsigned long);
8e5cfc45e   Jens Axboe   [PATCH] Fixup blk...
595
  extern int blk_rq_unmap_user(struct bio *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
596
597
  extern int blk_rq_map_kern(struct request_queue *, struct request *, void *, unsigned int, gfp_t);
  extern int blk_rq_map_user_iov(struct request_queue *, struct request *,
0e75f9063   Mike Christie   [PATCH] block: su...
598
  			       struct sg_iovec *, int, unsigned int);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
599
  extern int blk_execute_rq(struct request_queue *, struct gendisk *,
994ca9a19   James Bottomley   [PATCH] update bl...
600
  			  struct request *, int);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
601
  extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
15fc858a0   Jens Axboe   [BLOCK] Correct b...
602
  				  struct request *, int, rq_end_io_fn *);
337ad41de   FUJITA Tomonori   block: export blk...
603
  extern int blk_verify_command(unsigned char *, int);
2ad8b1ef1   Alan D. Brunelle   Add UNPLUG traces...
604
  extern void blk_unplug(struct request_queue *q);
6e39b69e7   Mike Christie   [SCSI] export blk...
605

165125e1e   Jens Axboe   [BLOCK] Get rid o...
606
  static inline struct request_queue *bdev_get_queue(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
  {
  	return bdev->bd_disk->queue;
  }
  
  static inline void blk_run_backing_dev(struct backing_dev_info *bdi,
  				       struct page *page)
  {
  	if (bdi && bdi->unplug_io_fn)
  		bdi->unplug_io_fn(bdi, page);
  }
  
  static inline void blk_run_address_space(struct address_space *mapping)
  {
  	if (mapping)
  		blk_run_backing_dev(mapping->backing_dev_info, NULL);
  }
  
  /*
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
625
626
627
   * blk_end_request() and friends.
   * __blk_end_request() and end_request() must be called with
   * the request queue spinlock acquired.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
628
629
   *
   * Several drivers define their own end_request and call
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
630
631
   * blk_end_request() for parts of the original function.
   * This prevents code duplication in drivers.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632
   */
22b132102   Jens Axboe   block: new end re...
633
634
635
636
637
638
  extern int blk_end_request(struct request *rq, int error,
  				unsigned int nr_bytes);
  extern int __blk_end_request(struct request *rq, int error,
  				unsigned int nr_bytes);
  extern int blk_end_bidi_request(struct request *rq, int error,
  				unsigned int nr_bytes, unsigned int bidi_bytes);
a0cd12854   Jens Axboe   block: add end_qu...
639
640
641
  extern void end_request(struct request *, int);
  extern void end_queued_request(struct request *, int);
  extern void end_dequeued_request(struct request *, int);
22b132102   Jens Axboe   block: new end re...
642
643
644
  extern int blk_end_request_callback(struct request *rq, int error,
  				unsigned int nr_bytes,
  				int (drv_callback)(struct request *));
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
645
  extern void blk_complete_request(struct request *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
646
  /*
3b11313a6   Kiyoshi Ueda   blk_end_request: ...
647
648
649
   * blk_end_request() takes bytes instead of sectors as a complete size.
   * blk_rq_bytes() returns bytes left to complete in the entire request.
   * blk_rq_cur_bytes() returns bytes left to complete in the current segment.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
   */
3b11313a6   Kiyoshi Ueda   blk_end_request: ...
651
652
  extern unsigned int blk_rq_bytes(struct request *rq);
  extern unsigned int blk_rq_cur_bytes(struct request *rq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
655
  
  static inline void blkdev_dequeue_request(struct request *req)
  {
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
656
  	elv_dequeue_request(req->q, req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
660
661
  /*
   * Access functions for manipulating queue properties
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
662
  extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn,
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
663
  					spinlock_t *lock, int node_id);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
664
665
666
667
668
669
670
671
672
673
  extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *);
  extern void blk_cleanup_queue(struct request_queue *);
  extern void blk_queue_make_request(struct request_queue *, make_request_fn *);
  extern void blk_queue_bounce_limit(struct request_queue *, u64);
  extern void blk_queue_max_sectors(struct request_queue *, unsigned int);
  extern void blk_queue_max_phys_segments(struct request_queue *, unsigned short);
  extern void blk_queue_max_hw_segments(struct request_queue *, unsigned short);
  extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);
  extern void blk_queue_hardsect_size(struct request_queue *, unsigned short);
  extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b);
fa0ccd837   James Bottomley   block: implement ...
674
675
  extern int blk_queue_dma_drain(struct request_queue *q, void *buf,
  			       unsigned int size);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
676
677
678
679
  extern void blk_queue_segment_boundary(struct request_queue *, unsigned long);
  extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);
  extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *);
  extern void blk_queue_dma_alignment(struct request_queue *, int);
11c3e689f   James Bottomley   [SCSI] block: Int...
680
  extern void blk_queue_update_dma_alignment(struct request_queue *, int);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
681
  extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
682
  extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
683
  extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
684
685
  extern int blk_do_ordered(struct request_queue *, struct request **);
  extern unsigned blk_ordered_cur_seq(struct request_queue *);
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
686
  extern unsigned blk_ordered_req_seq(struct request *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
687
  extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688

165125e1e   Jens Axboe   [BLOCK] Get rid o...
689
  extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690
  extern void blk_dump_rq_flags(struct request *, char *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
691
692
  extern void generic_unplug_device(struct request_queue *);
  extern void __generic_unplug_device(struct request_queue *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
  extern long nr_blockdev_pages(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694

165125e1e   Jens Axboe   [BLOCK] Get rid o...
695
696
697
698
  int blk_get_queue(struct request_queue *);
  struct request_queue *blk_alloc_queue(gfp_t);
  struct request_queue *blk_alloc_queue_node(gfp_t, int);
  extern void blk_put_queue(struct request_queue *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
699
700
701
702
703
704
  
  /*
   * tag stuff
   */
  #define blk_queue_tag_depth(q)		((q)->queue_tags->busy)
  #define blk_queue_tag_queue(q)		((q)->queue_tags->busy < (q)->queue_tags->max_depth)
4aff5e233   Jens Axboe   [PATCH] Split str...
705
  #define blk_rq_tagged(rq)		((rq)->cmd_flags & REQ_QUEUED)
165125e1e   Jens Axboe   [BLOCK] Get rid o...
706
707
708
709
710
711
712
  extern int blk_queue_start_tag(struct request_queue *, struct request *);
  extern struct request *blk_queue_find_tag(struct request_queue *, int);
  extern void blk_queue_end_tag(struct request_queue *, struct request *);
  extern int blk_queue_init_tags(struct request_queue *, int, struct blk_queue_tag *);
  extern void blk_queue_free_tags(struct request_queue *);
  extern int blk_queue_resize_tags(struct request_queue *, int);
  extern void blk_queue_invalidate_tags(struct request_queue *);
492dfb489   James Bottomley   [SCSI] block: add...
713
714
  extern struct blk_queue_tag *blk_init_tags(int);
  extern void blk_free_tags(struct blk_queue_tag *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
715

f583f4924   David C Somayajulu   [PATCH] helper fu...
716
717
718
719
720
721
722
  static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt,
  						int tag)
  {
  	if (unlikely(bqt == NULL || tag >= bqt->real_max_depth))
  		return NULL;
  	return bqt->tag_index[tag];
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
723
724
725
726
  extern int blkdev_issue_flush(struct block_device *, sector_t *);
  
  #define MAX_PHYS_SEGMENTS 128
  #define MAX_HW_SEGMENTS 128
defd94b75   Mike Christie   [SCSI] seperate m...
727
728
  #define SAFE_MAX_SECTORS 255
  #define BLK_DEF_MAX_SECTORS 1024
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
730
731
732
  
  #define MAX_SEGMENT_SIZE	65536
  
  #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist)
165125e1e   Jens Axboe   [BLOCK] Get rid o...
733
  static inline int queue_hardsect_size(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
735
736
737
738
739
740
741
742
743
744
745
746
  {
  	int retval = 512;
  
  	if (q && q->hardsect_size)
  		retval = q->hardsect_size;
  
  	return retval;
  }
  
  static inline int bdev_hardsect_size(struct block_device *bdev)
  {
  	return queue_hardsect_size(bdev_get_queue(bdev));
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
747
  static inline int queue_dma_alignment(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
  {
482eb6891   Pete Wyckoff   block: allow queu...
749
  	return q ? q->dma_alignment : 511;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751
752
753
754
755
756
757
758
759
760
  /* assumes size > 256 */
  static inline unsigned int blksize_bits(unsigned int size)
  {
  	unsigned int bits = 8;
  	do {
  		bits++;
  		size >>= 1;
  	} while (size > 256);
  	return bits;
  }
2befb9e36   Adrian Bunk   [PATCH] include/l...
761
  static inline unsigned int block_size(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
  {
  	return bdev->bd_block_size;
  }
  
  typedef struct {struct page *v;} Sector;
  
  unsigned char *read_dev_sector(struct block_device *, sector_t, Sector *);
  
  static inline void put_dev_sector(Sector p)
  {
  	page_cache_release(p.v);
  }
  
  struct work_struct;
  int kblockd_schedule_work(struct work_struct *work);
19a75d83f   Andrew Morton   kblockd: use flus...
777
  void kblockd_flush_work(struct work_struct *work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
778

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779
780
781
782
  #define MODULE_ALIAS_BLOCKDEV(major,minor) \
  	MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))
  #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \
  	MODULE_ALIAS("block-major-" __stringify(major) "-*")
9361401eb   David Howells   [PATCH] BLOCK: Ma...
783
784
785
786
787
  #else /* CONFIG_BLOCK */
  /*
   * stubs for when the block layer is configured out
   */
  #define buffer_heads_over_limit 0
9361401eb   David Howells   [PATCH] BLOCK: Ma...
788
789
790
791
  static inline long nr_blockdev_pages(void)
  {
  	return 0;
  }
bcfd8d361   Andrew Morton   [PATCH] CONFIG_BL...
792
793
794
  static inline void exit_io_context(void)
  {
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
795

023ccde10   Jens Axboe   block: fix warnin...
796
  struct io_context;
fd0928df9   Jens Axboe   ioprio: move io p...
797
798
799
800
  static inline int put_io_context(struct io_context *ioc)
  {
  	return 1;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
801
  #endif /* CONFIG_BLOCK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
  #endif