Blame view

include/linux/blkdev.h 46 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_BLKDEV_H
  #define _LINUX_BLKDEV_H
85fd0bc95   Russell King   Fix blkdev.h buil...
3
  #include <linux/sched.h>
f5ff8422b   Jens Axboe   Fix warnings with...
4
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
  #include <linux/major.h>
  #include <linux/genhd.h>
  #include <linux/list.h>
320ae51fe   Jens Axboe   blk-mq: new multi...
8
  #include <linux/llist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
  #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>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
  #include <linux/stringify.h>
3e6053d76   Hugh Dickins   block: adjust blk...
17
  #include <linux/gfp.h>
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
18
  #include <linux/bsg.h>
c7c22e4d5   Jens Axboe   block: add suppor...
19
  #include <linux/smp.h>
548bc8e1b   Tejun Heo   block: RCU free r...
20
  #include <linux/rcupdate.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  
  #include <asm/scatterlist.h>
de4772542   Paul Gortmaker   include: replace ...
23
  struct module;
21b2f0c80   Christoph Hellwig   [SCSI] unify SCSI...
24
  struct scsi_ioctl_command;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  struct request_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  struct elevator_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  struct request_pm_state;
2056a782f   Jens Axboe   [PATCH] Block que...
28
  struct blk_trace;
3d6392cfb   Jens Axboe   bsg: support for ...
29
30
  struct request;
  struct sg_io_hdr;
aa387cc89   Mike Christie   block: add bsg he...
31
  struct bsg_job;
3c798398e   Tejun Heo   blkcg: mass renam...
32
  struct blkcg_gq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
  
  #define BLKDEV_MIN_RQ	4
  #define BLKDEV_MAX_RQ	128	/* Default maximum */
8bd435b30   Tejun Heo   blkcg: remove sta...
36
37
38
39
40
  /*
   * Maximum number of blkcg policies allowed to be registered concurrently.
   * Defined here to simplify include dependency.
   */
  #define BLKCG_MAX_POLS		2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  struct request;
8ffdc6550   Tejun Heo   [BLOCK] add @upto...
42
  typedef void (rq_end_io_fn)(struct request *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43

5b788ce3e   Tejun Heo   block: prepare fo...
44
45
  #define BLK_RL_SYNCFULL		(1U << 0)
  #define BLK_RL_ASYNCFULL	(1U << 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  struct request_list {
5b788ce3e   Tejun Heo   block: prepare fo...
47
  	struct request_queue	*q;	/* the queue this rl belongs to */
a051661ca   Tejun Heo   blkcg: implement ...
48
49
50
  #ifdef CONFIG_BLK_CGROUP
  	struct blkcg_gq		*blkg;	/* blkg this request pool belongs to */
  #endif
1faa16d22   Jens Axboe   block: change the...
51
52
53
54
  	/*
  	 * count[], starved[], and wait[] are indexed by
  	 * BLK_RW_SYNC/BLK_RW_ASYNC
  	 */
8a5ecdd42   Tejun Heo   block: add q->nr_...
55
56
57
58
  	int			count[2];
  	int			starved[2];
  	mempool_t		*rq_pool;
  	wait_queue_head_t	wait[2];
5b788ce3e   Tejun Heo   block: prepare fo...
59
  	unsigned int		flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  };
4aff5e233   Jens Axboe   [PATCH] Split str...
61
62
63
64
65
66
67
68
69
70
  /*
   * 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 */
4aff5e233   Jens Axboe   [PATCH] Split str...
71
  	REQ_TYPE_SPECIAL,		/* driver defined type */
4aff5e233   Jens Axboe   [PATCH] Split str...
72
73
74
75
76
  	/*
  	 * 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...
77
  	REQ_TYPE_ATA_TASKFILE,
cea2885a2   Jens Axboe   [PATCH] ide-cd: f...
78
  	REQ_TYPE_ATA_PC,
4aff5e233   Jens Axboe   [PATCH] Split str...
79
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
  #define BLK_MAX_CDB	16
  
  /*
63a713867   Jens Axboe   block: fixup rq_i...
83
   * try to put the fields that are referenced together in the same cacheline.
4d0d98b60   Wanlong Gao   block:fix the com...
84
   * if you modify this structure, be sure to check block/blk-core.c:blk_rq_init()
63a713867   Jens Axboe   block: fixup rq_i...
85
   * as well!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
   */
  struct request {
6897fc22e   Christoph Hellwig   kernel: use lockl...
88
  	struct list_head queuelist;
320ae51fe   Jens Axboe   blk-mq: new multi...
89
90
  	union {
  		struct call_single_data csd;
18741986a   Christoph Hellwig   blk-mq: rework fl...
91
  		struct work_struct mq_flush_work;
8b4922d31   Jan Kara   block: Stop abusi...
92
  		unsigned long fifo_time;
320ae51fe   Jens Axboe   blk-mq: new multi...
93
  	};
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
94

165125e1e   Jens Axboe   [BLOCK] Get rid o...
95
  	struct request_queue *q;
320ae51fe   Jens Axboe   blk-mq: new multi...
96
  	struct blk_mq_ctx *mq_ctx;
e6a1c874a   Jens Axboe   [PATCH] struct re...
97

5953316db   Jens Axboe   block: make rq->c...
98
  	u64 cmd_flags;
4aff5e233   Jens Axboe   [PATCH] Split str...
99
  	enum rq_cmd_type_bits cmd_type;
242f9dcb8   Jens Axboe   block: unify requ...
100
  	unsigned long atomic_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101

181fdde3b   Richard Kennedy   block: remove 16 ...
102
  	int cpu;
a2dec7b36   Tejun Heo   block: hide reque...
103
  	/* the following two fields are internal, NEVER access directly */
a2dec7b36   Tejun Heo   block: hide reque...
104
  	unsigned int __data_len;	/* total data len */
181fdde3b   Richard Kennedy   block: remove 16 ...
105
  	sector_t __sector;		/* sector cursor */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
  
  	struct bio *bio;
  	struct bio *biotail;
360f92c24   Jens Axboe   block: fix regres...
109
110
111
112
113
114
115
116
117
118
119
  	/*
  	 * The hash is used inside the scheduler, and killed once the
  	 * request reaches the dispatch list. The ipi_list is only used
  	 * to queue the request for softirq completion, which is long
  	 * after the request has been unhashed (and even removed from
  	 * the dispatch list).
  	 */
  	union {
  		struct hlist_node hash;	/* merge hash */
  		struct list_head ipi_list;
  	};
e6a1c874a   Jens Axboe   [PATCH] struct re...
120
121
122
  	/*
  	 * The rb_node is only used inside the io scheduler, requests
  	 * are pruned when moved to the dispatch queue. So let the
c186794db   Mike Snitzer   block: share requ...
123
  	 * completion_data share space with the rb_node.
e6a1c874a   Jens Axboe   [PATCH] struct re...
124
125
126
  	 */
  	union {
  		struct rb_node rb_node;	/* sort/lookup */
c186794db   Mike Snitzer   block: share requ...
127
  		void *completion_data;
e6a1c874a   Jens Axboe   [PATCH] struct re...
128
  	};
9817064b6   Jens Axboe   [PATCH] elevator:...
129

ff7d145fd   Jens Axboe   [PATCH] Add one m...
130
  	/*
7f1dc8a2d   Vivek Goyal   blkio: Fix blkio ...
131
  	 * Three pointers are available for the IO schedulers, if they need
c186794db   Mike Snitzer   block: share requ...
132
133
  	 * more they have to dynamically allocate it.  Flush requests are
  	 * never put on the IO scheduler. So let the flush fields share
a612fddf0   Tejun Heo   block, cfq: move ...
134
  	 * space with the elevator data.
ff7d145fd   Jens Axboe   [PATCH] Add one m...
135
  	 */
c186794db   Mike Snitzer   block: share requ...
136
  	union {
a612fddf0   Tejun Heo   block, cfq: move ...
137
138
139
140
  		struct {
  			struct io_cq		*icq;
  			void			*priv[2];
  		} elv;
c186794db   Mike Snitzer   block: share requ...
141
142
143
  		struct {
  			unsigned int		seq;
  			struct list_head	list;
4853abaae   Jeff Moyer   block: fix flush ...
144
  			rq_end_io_fn		*saved_end_io;
c186794db   Mike Snitzer   block: share requ...
145
146
  		} flush;
  	};
ff7d145fd   Jens Axboe   [PATCH] Add one m...
147

8f34ee75d   Jens Axboe   [PATCH] Rearrange...
148
  	struct gendisk *rq_disk;
09e099d4b   Jerome Marchand   block: fix accoun...
149
  	struct hd_struct *part;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  	unsigned long start_time;
9195291e5   Divyesh Shah   blkio: Increment ...
151
  #ifdef CONFIG_BLK_CGROUP
a051661ca   Tejun Heo   blkcg: implement ...
152
  	struct request_list *rl;		/* rl this rq is alloced from */
9195291e5   Divyesh Shah   blkio: Increment ...
153
154
155
  	unsigned long long start_time_ns;
  	unsigned long long io_start_time_ns;    /* when passed to hardware */
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
158
159
  	/* Number of scatter-gather DMA addr+len pairs after
  	 * physical address coalescing is performed.
  	 */
  	unsigned short nr_phys_segments;
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
160
161
162
  #if defined(CONFIG_BLK_DEV_INTEGRITY)
  	unsigned short nr_integrity_segments;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163

8f34ee75d   Jens Axboe   [PATCH] Rearrange...
164
  	unsigned short ioprio;
731ec497e   Tejun Heo   block: kill rq->data
165
166
  	void *special;		/* opaque pointer available for LLD use */
  	char *buffer;		/* kaddr of the current segment if available */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167

cdd602621   Jens Axboe   [PATCH] Remove ->...
168
169
  	int tag;
  	int errors;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
172
  	/*
  	 * when request is used as a packet command carrier
  	 */
d7e3c3249   FUJITA Tomonori   block: add large ...
173
174
  	unsigned char __cmd[BLK_MAX_CDB];
  	unsigned char *cmd;
181fdde3b   Richard Kennedy   block: remove 16 ...
175
  	unsigned short cmd_len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176

7a85f8896   FUJITA Tomonori   block: restore th...
177
  	unsigned int extra_len;	/* length of alignment and padding */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  	unsigned int sense_len;
c3a4d78c5   Tejun Heo   block: add rq->re...
179
  	unsigned int resid_len;	/* residual count */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
  	void *sense;
242f9dcb8   Jens Axboe   block: unify requ...
181
182
  	unsigned long deadline;
  	struct list_head timeout_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  	unsigned int timeout;
17e01f216   Mike Christie   [SCSI] add retrie...
184
  	int retries;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
  
  	/*
c00895ab2   Jens Axboe   [PATCH] Remove ->...
187
  	 * completion callback.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
189
190
  	 */
  	rq_end_io_fn *end_io;
  	void *end_io_data;
abae1fde6   FUJITA Tomonori   add a struct requ...
191
192
193
  
  	/* for bidi */
  	struct request *next_rq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  };
766ca4428   Fernando Luis Vázquez Cao   virtio_blk: use a...
195
196
197
198
  static inline unsigned short req_get_ioprio(struct request *req)
  {
  	return req->ioprio;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  /*
4aff5e233   Jens Axboe   [PATCH] Split str...
200
   * State information carried for REQ_TYPE_PM_SUSPEND and REQ_TYPE_PM_RESUME
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
204
205
206
207
208
209
210
211
212
   * 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>
320ae51fe   Jens Axboe   blk-mq: new multi...
213
  struct blk_queue_ctx;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
214
  typedef void (request_fn_proc) (struct request_queue *q);
5a7bbad27   Christoph Hellwig   block: remove sup...
215
  typedef void (make_request_fn) (struct request_queue *q, struct bio *bio);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
216
  typedef int (prep_rq_fn) (struct request_queue *, struct request *);
28018c242   James Bottomley   block: implement ...
217
  typedef void (unprep_rq_fn) (struct request_queue *, struct request *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
  
  struct bio_vec;
cc371e66e   Alasdair G Kergon   Add bvec_merge_da...
220
221
222
223
224
225
226
227
  struct bvec_merge_data {
  	struct block_device *bi_bdev;
  	sector_t bi_sector;
  	unsigned bi_size;
  	unsigned long bi_rw;
  };
  typedef int (merge_bvec_fn) (struct request_queue *, struct bvec_merge_data *,
  			     struct bio_vec *);
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
228
  typedef void (softirq_done_fn)(struct request *);
2fb98e841   Tejun Heo   block: implement ...
229
  typedef int (dma_drain_needed_fn)(struct request *);
ef9e3facd   Kiyoshi Ueda   block: add lld bu...
230
  typedef int (lld_busy_fn) (struct request_queue *q);
aa387cc89   Mike Christie   block: add bsg he...
231
  typedef int (bsg_job_fn) (struct bsg_job *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232

242f9dcb8   Jens Axboe   block: unify requ...
233
234
235
236
237
238
239
  enum blk_eh_timer_return {
  	BLK_EH_NOT_HANDLED,
  	BLK_EH_HANDLED,
  	BLK_EH_RESET_TIMER,
  };
  
  typedef enum blk_eh_timer_return (rq_timed_out_fn)(struct request *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
241
242
243
  enum blk_queue_state {
  	Queue_down,
  	Queue_up,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
  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
247
248
  	int busy;			/* current depth */
  	int max_depth;			/* what we will send to device */
ba0250824   Tejun Heo   [PATCH] blk: fix ...
249
  	int real_max_depth;		/* what the array can hold */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
  	atomic_t refcnt;		/* map can be shared */
  };
abf543937   FUJITA Tomonori   block: move cmdfi...
252
253
  #define BLK_SCSI_MAX_CMDS	(256)
  #define BLK_SCSI_CMD_PER_LONG	(BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
025146e13   Martin K. Petersen   block: Move queue...
254
255
256
257
258
259
260
  struct queue_limits {
  	unsigned long		bounce_pfn;
  	unsigned long		seg_boundary_mask;
  
  	unsigned int		max_hw_sectors;
  	unsigned int		max_sectors;
  	unsigned int		max_segment_size;
c72758f33   Martin K. Petersen   block: Export I/O...
261
262
263
264
  	unsigned int		physical_block_size;
  	unsigned int		alignment_offset;
  	unsigned int		io_min;
  	unsigned int		io_opt;
67efc9258   Christoph Hellwig   block: allow larg...
265
  	unsigned int		max_discard_sectors;
4363ac7c1   Martin K. Petersen   block: Implement ...
266
  	unsigned int		max_write_same_sectors;
86b372814   Martin K. Petersen   block: Expose dis...
267
268
  	unsigned int		discard_granularity;
  	unsigned int		discard_alignment;
025146e13   Martin K. Petersen   block: Move queue...
269
270
  
  	unsigned short		logical_block_size;
8a78362c4   Martin K. Petersen   block: Consolidat...
271
  	unsigned short		max_segments;
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
272
  	unsigned short		max_integrity_segments;
025146e13   Martin K. Petersen   block: Move queue...
273

c72758f33   Martin K. Petersen   block: Export I/O...
274
  	unsigned char		misaligned;
86b372814   Martin K. Petersen   block: Expose dis...
275
  	unsigned char		discard_misaligned;
e692cb668   Martin K. Petersen   block: Deprecate ...
276
  	unsigned char		cluster;
a934a00a6   Martin K. Petersen   block: Fix discar...
277
  	unsigned char		discard_zeroes_data;
c78afc626   Kent Overstreet   bcache/md: Use ra...
278
  	unsigned char		raid_partial_stripes_expensive;
025146e13   Martin K. Petersen   block: Move queue...
279
  };
d7b763013   Richard Kennedy   block: reorder re...
280
  struct request_queue {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
283
284
285
  	/*
  	 * Together with queue_head for cacheline sharing
  	 */
  	struct list_head	queue_head;
  	struct request		*last_merge;
b374d18a4   Jens Axboe   block: get rid of...
286
  	struct elevator_queue	*elevator;
8a5ecdd42   Tejun Heo   block: add q->nr_...
287
288
  	int			nr_rqs[2];	/* # allocated [a]sync rqs */
  	int			nr_rqs_elvpriv;	/* # allocated rqs w/ elvpriv */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
290
  
  	/*
a051661ca   Tejun Heo   blkcg: implement ...
291
292
293
294
  	 * If blkcg is not used, @q->root_rl serves all requests.  If blkcg
  	 * is used, root blkg allocates from @q->root_rl and all other
  	 * blkgs from their own blkg->rl.  Which one to use should be
  	 * determined using bio_request_list().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
  	 */
a051661ca   Tejun Heo   blkcg: implement ...
296
  	struct request_list	root_rl;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
  
  	request_fn_proc		*request_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299
300
  	make_request_fn		*make_request_fn;
  	prep_rq_fn		*prep_rq_fn;
28018c242   James Bottomley   block: implement ...
301
  	unprep_rq_fn		*unprep_rq_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  	merge_bvec_fn		*merge_bvec_fn;
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
303
  	softirq_done_fn		*softirq_done_fn;
242f9dcb8   Jens Axboe   block: unify requ...
304
  	rq_timed_out_fn		*rq_timed_out_fn;
2fb98e841   Tejun Heo   block: implement ...
305
  	dma_drain_needed_fn	*dma_drain_needed;
ef9e3facd   Kiyoshi Ueda   block: add lld bu...
306
  	lld_busy_fn		*lld_busy_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307

320ae51fe   Jens Axboe   blk-mq: new multi...
308
309
310
311
312
313
314
315
316
317
318
  	struct blk_mq_ops	*mq_ops;
  
  	unsigned int		*mq_map;
  
  	/* sw queues */
  	struct blk_mq_ctx	*queue_ctx;
  	unsigned int		nr_queues;
  
  	/* hw dispatch queues */
  	struct blk_mq_hw_ctx	**queue_hw_ctx;
  	unsigned int		nr_hw_queues;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
  	/*
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
320
321
  	 * Dispatch queue sorting
  	 */
1b47f531e   Jens Axboe   [PATCH] generic d...
322
  	sector_t		end_sector;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
323
  	struct request		*boundary_rq;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
324
325
  
  	/*
3cca6dc1c   Jens Axboe   block: add API fo...
326
  	 * Delayed queue handling
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  	 */
3cca6dc1c   Jens Axboe   block: add API fo...
328
  	struct delayed_work	delay_work;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
331
332
333
334
335
336
  
  	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
337
  	/*
d7b763013   Richard Kennedy   block: reorder re...
338
  	 * various queue flags, see QUEUE_* below
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
  	 */
d7b763013   Richard Kennedy   block: reorder re...
340
  	unsigned long		queue_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
  
  	/*
a73f730d0   Tejun Heo   block, cfq: move ...
343
344
345
346
347
348
  	 * ida allocated id for this queue.  Used to index queues from
  	 * ioctx.
  	 */
  	int			id;
  
  	/*
d7b763013   Richard Kennedy   block: reorder re...
349
  	 * queue needs bounce pages for pages above this limit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
  	 */
d7b763013   Richard Kennedy   block: reorder re...
351
  	gfp_t			bounce_gfp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
  
  	/*
152587deb   Jens Axboe   [PATCH] fix NMI l...
354
355
356
  	 * 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
357
  	 */
152587deb   Jens Axboe   [PATCH] fix NMI l...
358
  	spinlock_t		__queue_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
360
361
362
363
364
  	spinlock_t		*queue_lock;
  
  	/*
  	 * queue kobject
  	 */
  	struct kobject kobj;
320ae51fe   Jens Axboe   blk-mq: new multi...
365
366
367
368
  	/*
  	 * mq queue kobject
  	 */
  	struct kobject mq_kobj;
6c9546675   Lin Ming   block: add runtim...
369
370
371
372
373
  #ifdef CONFIG_PM_RUNTIME
  	struct device		*dev;
  	int			rpm_status;
  	unsigned int		nr_pending;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
376
377
378
379
380
  	/*
  	 * queue settings
  	 */
  	unsigned long		nr_requests;	/* Max # of requests */
  	unsigned int		nr_congestion_on;
  	unsigned int		nr_congestion_off;
  	unsigned int		nr_batching;
fa0ccd837   James Bottomley   block: implement ...
381
  	unsigned int		dma_drain_size;
d7b763013   Richard Kennedy   block: reorder re...
382
  	void			*dma_drain_buffer;
e3790c7d4   Tejun Heo   block: separate o...
383
  	unsigned int		dma_pad_mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
385
386
  	unsigned int		dma_alignment;
  
  	struct blk_queue_tag	*queue_tags;
6eca9004d   Jens Axboe   [BLOCK] Fix bad s...
387
  	struct list_head	tag_busy_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388

15853af9f   Tejun Heo   [BLOCK] Implement...
389
  	unsigned int		nr_sorted;
0a7ae2ff0   Jens Axboe   block: change the...
390
  	unsigned int		in_flight[2];
24faf6f60   Bart Van Assche   block: Make blk_c...
391
392
393
394
395
396
  	/*
  	 * Number of active block driver functions for which blk_drain_queue()
  	 * must wait. Must be incremented around functions that unlock the
  	 * queue_lock internally, e.g. scsi_request_fn().
  	 */
  	unsigned int		request_fn_active;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397

242f9dcb8   Jens Axboe   block: unify requ...
398
399
400
  	unsigned int		rq_timeout;
  	struct timer_list	timeout;
  	struct list_head	timeout_list;
a612fddf0   Tejun Heo   block, cfq: move ...
401
  	struct list_head	icq_list;
4eef30499   Tejun Heo   blkcg: move per-q...
402
  #ifdef CONFIG_BLK_CGROUP
a2b1693ba   Tejun Heo   blkcg: implement ...
403
  	DECLARE_BITMAP		(blkcg_pols, BLKCG_MAX_POLS);
3c798398e   Tejun Heo   blkcg: mass renam...
404
  	struct blkcg_gq		*root_blkg;
03aa264ac   Tejun Heo   blkcg: let blkcg ...
405
  	struct list_head	blkg_list;
4eef30499   Tejun Heo   blkcg: move per-q...
406
  #endif
a612fddf0   Tejun Heo   block, cfq: move ...
407

025146e13   Martin K. Petersen   block: Move queue...
408
  	struct queue_limits	limits;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
412
413
  	/*
  	 * sg stuff
  	 */
  	unsigned int		sg_timeout;
  	unsigned int		sg_reserved_size;
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
414
  	int			node;
6c5c93415   Alexey Dobriyan   [PATCH] ifdef blk...
415
  #ifdef CONFIG_BLK_DEV_IO_TRACE
2056a782f   Jens Axboe   [PATCH] Block que...
416
  	struct blk_trace	*blk_trace;
6c5c93415   Alexey Dobriyan   [PATCH] ifdef blk...
417
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
  	/*
4913efe45   Tejun Heo   block: deprecate ...
419
  	 * for flush operations
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
  	 */
4913efe45   Tejun Heo   block: deprecate ...
421
  	unsigned int		flush_flags;
f38769309   shaohua.li@intel.com   block: add a non-...
422
  	unsigned int		flush_not_queueable:1;
3ac0cc450   shaohua.li@intel.com   block: hold queue...
423
  	unsigned int		flush_queue_delayed:1;
ae1b15396   Tejun Heo   block: reimplemen...
424
425
426
427
428
  	unsigned int		flush_pending_idx:1;
  	unsigned int		flush_running_idx:1;
  	unsigned long		flush_pending_since;
  	struct list_head	flush_queue[2];
  	struct list_head	flush_data_in_flight;
18741986a   Christoph Hellwig   blk-mq: rework fl...
429
430
  	struct request		*flush_rq;
  	spinlock_t		mq_flush_lock;
483f4afc4   Al Viro   [PATCH] fix sysfs...
431
432
  
  	struct mutex		sysfs_lock;
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
433

d732580b4   Tejun Heo   block: implement ...
434
  	int			bypass_depth;
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
435
  #if defined(CONFIG_BLK_DEV_BSG)
aa387cc89   Mike Christie   block: add bsg he...
436
437
  	bsg_job_fn		*bsg_job_fn;
  	int			bsg_job_size;
d351af01b   FUJITA Tomonori   bsg: bind bsg to ...
438
439
  	struct bsg_class_device bsg_dev;
  #endif
e43473b7f   Vivek Goyal   blkio: Core imple...
440
441
442
443
444
  
  #ifdef CONFIG_BLK_DEV_THROTTLING
  	/* Throttle data */
  	struct throtl_data *td;
  #endif
548bc8e1b   Tejun Heo   block: RCU free r...
445
  	struct rcu_head		rcu_head;
320ae51fe   Jens Axboe   blk-mq: new multi...
446
447
448
  	wait_queue_head_t	mq_freeze_wq;
  	struct percpu_counter	mq_usage_counter;
  	struct list_head	all_q_node;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
451
  #define QUEUE_FLAG_QUEUED	1	/* uses generic tag queueing */
  #define QUEUE_FLAG_STOPPED	2	/* queue is stopped */
1faa16d22   Jens Axboe   block: change the...
452
453
  #define	QUEUE_FLAG_SYNCFULL	3	/* read queue has been filled */
  #define QUEUE_FLAG_ASYNCFULL	4	/* write queue has been filled */
3f3299d5c   Bart Van Assche   block: Rename que...
454
  #define QUEUE_FLAG_DYING	5	/* queue being torn down */
d732580b4   Tejun Heo   block: implement ...
455
  #define QUEUE_FLAG_BYPASS	6	/* act as dumb FIFO queue */
c21e6beba   Jens Axboe   block: get rid of...
456
457
  #define QUEUE_FLAG_BIDI		7	/* queue supports bidi requests */
  #define QUEUE_FLAG_NOMERGES     8	/* disable merge attempts */
5757a6d76   Dan Williams   block: strict rq_...
458
  #define QUEUE_FLAG_SAME_COMP	9	/* complete on same CPU-group */
c21e6beba   Jens Axboe   block: get rid of...
459
460
461
  #define QUEUE_FLAG_FAIL_IO     10	/* fake timeout */
  #define QUEUE_FLAG_STACKABLE   11	/* supports request stacking */
  #define QUEUE_FLAG_NONROT      12	/* non-rotational device (SSD) */
88e740f16   Fernando Luis Vázquez Cao   block: add queue ...
462
  #define QUEUE_FLAG_VIRT        QUEUE_FLAG_NONROT /* paravirt device */
c21e6beba   Jens Axboe   block: get rid of...
463
464
465
466
467
  #define QUEUE_FLAG_IO_STAT     13	/* do IO stats */
  #define QUEUE_FLAG_DISCARD     14	/* supports DISCARD */
  #define QUEUE_FLAG_NOXMERGES   15	/* No extended merges */
  #define QUEUE_FLAG_ADD_RANDOM  16	/* Contributes to random pool */
  #define QUEUE_FLAG_SECDISCARD  17	/* supports SECDISCARD */
5757a6d76   Dan Williams   block: strict rq_...
468
  #define QUEUE_FLAG_SAME_FORCE  18	/* force complete on same CPU */
c246e80d8   Bart Van Assche   block: Avoid that...
469
  #define QUEUE_FLAG_DEAD        19	/* queue tear-down finished */
320ae51fe   Jens Axboe   blk-mq: new multi...
470
  #define QUEUE_FLAG_INIT_DONE   20	/* queue is initialized */
bc58ba946   Jens Axboe   block: add sysfs ...
471
472
  
  #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
01e97f6b8   Jens Axboe   block: enable rq ...
473
  				 (1 << QUEUE_FLAG_STACKABLE)	|	\
e2e1a148b   Jens Axboe   block: add sysfs ...
474
475
  				 (1 << QUEUE_FLAG_SAME_COMP)	|	\
  				 (1 << QUEUE_FLAG_ADD_RANDOM))
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
476

94eddfbea   Jens Axboe   blk-mq: ensure th...
477
478
  #define QUEUE_FLAG_MQ_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
  				 (1 << QUEUE_FLAG_SAME_COMP))
8bcb6c7d4   Andi Kleen   block: use lockde...
479
  static inline void queue_lockdep_assert_held(struct request_queue *q)
8f45c1a58   Linus Torvalds   block: fix queue ...
480
  {
8bcb6c7d4   Andi Kleen   block: use lockde...
481
482
  	if (q->queue_lock)
  		lockdep_assert_held(q->queue_lock);
8f45c1a58   Linus Torvalds   block: fix queue ...
483
  }
75ad23bc0   Nick Piggin   block: make queue...
484
485
486
487
488
  static inline void queue_flag_set_unlocked(unsigned int flag,
  					   struct request_queue *q)
  {
  	__set_bit(flag, &q->queue_flags);
  }
e48ec6900   Jens Axboe   block: extend que...
489
490
491
  static inline int queue_flag_test_and_clear(unsigned int flag,
  					    struct request_queue *q)
  {
8bcb6c7d4   Andi Kleen   block: use lockde...
492
  	queue_lockdep_assert_held(q);
e48ec6900   Jens Axboe   block: extend que...
493
494
495
496
497
498
499
500
501
502
503
504
  
  	if (test_bit(flag, &q->queue_flags)) {
  		__clear_bit(flag, &q->queue_flags);
  		return 1;
  	}
  
  	return 0;
  }
  
  static inline int queue_flag_test_and_set(unsigned int flag,
  					  struct request_queue *q)
  {
8bcb6c7d4   Andi Kleen   block: use lockde...
505
  	queue_lockdep_assert_held(q);
e48ec6900   Jens Axboe   block: extend que...
506
507
508
509
510
511
512
513
  
  	if (!test_bit(flag, &q->queue_flags)) {
  		__set_bit(flag, &q->queue_flags);
  		return 0;
  	}
  
  	return 1;
  }
75ad23bc0   Nick Piggin   block: make queue...
514
515
  static inline void queue_flag_set(unsigned int flag, struct request_queue *q)
  {
8bcb6c7d4   Andi Kleen   block: use lockde...
516
  	queue_lockdep_assert_held(q);
75ad23bc0   Nick Piggin   block: make queue...
517
518
519
520
521
522
523
524
  	__set_bit(flag, &q->queue_flags);
  }
  
  static inline void queue_flag_clear_unlocked(unsigned int flag,
  					     struct request_queue *q)
  {
  	__clear_bit(flag, &q->queue_flags);
  }
0a7ae2ff0   Jens Axboe   block: change the...
525
526
527
528
  static inline int queue_in_flight(struct request_queue *q)
  {
  	return q->in_flight[0] + q->in_flight[1];
  }
75ad23bc0   Nick Piggin   block: make queue...
529
530
  static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
  {
8bcb6c7d4   Andi Kleen   block: use lockde...
531
  	queue_lockdep_assert_held(q);
75ad23bc0   Nick Piggin   block: make queue...
532
533
  	__clear_bit(flag, &q->queue_flags);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
534
535
  #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)
3f3299d5c   Bart Van Assche   block: Rename que...
536
  #define blk_queue_dying(q)	test_bit(QUEUE_FLAG_DYING, &(q)->queue_flags)
c246e80d8   Bart Van Assche   block: Avoid that...
537
  #define blk_queue_dead(q)	test_bit(QUEUE_FLAG_DEAD, &(q)->queue_flags)
d732580b4   Tejun Heo   block: implement ...
538
  #define blk_queue_bypass(q)	test_bit(QUEUE_FLAG_BYPASS, &(q)->queue_flags)
320ae51fe   Jens Axboe   blk-mq: new multi...
539
  #define blk_queue_init_done(q)	test_bit(QUEUE_FLAG_INIT_DONE, &(q)->queue_flags)
ac9fafa12   Alan D. Brunelle   block: Skip I/O m...
540
  #define blk_queue_nomerges(q)	test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags)
488991e28   Alan D. Brunelle   block: Added in s...
541
542
  #define blk_queue_noxmerges(q)	\
  	test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags)
a68bbddba   Jens Axboe   block: add queue ...
543
  #define blk_queue_nonrot(q)	test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags)
bc58ba946   Jens Axboe   block: add sysfs ...
544
  #define blk_queue_io_stat(q)	test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags)
e2e1a148b   Jens Axboe   block: add sysfs ...
545
  #define blk_queue_add_random(q)	test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags)
4ee5eaf45   Kiyoshi Ueda   block: add a queu...
546
547
  #define blk_queue_stackable(q)	\
  	test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags)
c15227de1   Christoph Hellwig   block: use normal...
548
  #define blk_queue_discard(q)	test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags)
8d57a98cc   Adrian Hunter   block: add secure...
549
550
  #define blk_queue_secdiscard(q)	(blk_queue_discard(q) && \
  	test_bit(QUEUE_FLAG_SECDISCARD, &(q)->queue_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551

33659ebba   Christoph Hellwig   block: remove wra...
552
553
554
555
556
557
  #define blk_noretry_request(rq) \
  	((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \
  			     REQ_FAILFAST_DRIVER))
  
  #define blk_account_rq(rq) \
  	(((rq)->cmd_flags & REQ_STARTED) && \
e2a60da74   Martin K. Petersen   block: Clean up s...
558
  	 ((rq)->cmd_type == REQ_TYPE_FS))
33659ebba   Christoph Hellwig   block: remove wra...
559

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
560
  #define blk_pm_request(rq)	\
33659ebba   Christoph Hellwig   block: remove wra...
561
562
  	((rq)->cmd_type == REQ_TYPE_PM_SUSPEND || \
  	 (rq)->cmd_type == REQ_TYPE_PM_RESUME)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563

ab780f1ec   Jens Axboe   block: inherit CP...
564
  #define blk_rq_cpu_valid(rq)	((rq)->cpu != -1)
abae1fde6   FUJITA Tomonori   add a struct requ...
565
  #define blk_bidi_rq(rq)		((rq)->next_rq != NULL)
336cdb400   Kiyoshi Ueda   blk_end_request: ...
566
567
  /* 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
568
569
  
  #define list_entry_rq(ptr)	list_entry((ptr), struct request, queuelist)
5953316db   Jens Axboe   block: make rq->c...
570
  #define rq_data_dir(rq)		(((rq)->cmd_flags & 1) != 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571

e692cb668   Martin K. Petersen   block: Deprecate ...
572
573
574
575
  static inline unsigned int blk_queue_cluster(struct request_queue *q)
  {
  	return q->limits.cluster;
  }
9e2585a8a   Jens Axboe   [PATCH] as-iosche...
576
  /*
1faa16d22   Jens Axboe   block: change the...
577
   * We regard a request as sync, if either a read or a sync write
9e2585a8a   Jens Axboe   [PATCH] as-iosche...
578
   */
1faa16d22   Jens Axboe   block: change the...
579
580
  static inline bool rw_is_sync(unsigned int rw_flags)
  {
7b6d91dae   Christoph Hellwig   block: unify flag...
581
  	return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC);
1faa16d22   Jens Axboe   block: change the...
582
583
584
585
586
587
  }
  
  static inline bool rq_is_sync(struct request *rq)
  {
  	return rw_is_sync(rq->cmd_flags);
  }
5b788ce3e   Tejun Heo   block: prepare fo...
588
  static inline bool blk_rl_full(struct request_list *rl, bool sync)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
  {
5b788ce3e   Tejun Heo   block: prepare fo...
590
591
592
  	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL;
  
  	return rl->flags & flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
  }
5b788ce3e   Tejun Heo   block: prepare fo...
594
  static inline void blk_set_rl_full(struct request_list *rl, bool sync)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595
  {
5b788ce3e   Tejun Heo   block: prepare fo...
596
597
598
  	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL;
  
  	rl->flags |= flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
  }
5b788ce3e   Tejun Heo   block: prepare fo...
600
  static inline void blk_clear_rl_full(struct request_list *rl, bool sync)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
  {
5b788ce3e   Tejun Heo   block: prepare fo...
602
603
604
  	unsigned int flag = sync ? BLK_RL_SYNCFULL : BLK_RL_ASYNCFULL;
  
  	rl->flags &= ~flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
  }
e2a60da74   Martin K. Petersen   block: Clean up s...
606
607
608
609
  static inline bool rq_mergeable(struct request *rq)
  {
  	if (rq->cmd_type != REQ_TYPE_FS)
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
610

e2a60da74   Martin K. Petersen   block: Clean up s...
611
612
613
614
615
  	if (rq->cmd_flags & REQ_NOMERGE_FLAGS)
  		return false;
  
  	return true;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616

f31dc1cd4   Martin K. Petersen   block: Consolidat...
617
618
619
620
621
622
623
624
  static inline bool blk_check_merge_flags(unsigned int flags1,
  					 unsigned int flags2)
  {
  	if ((flags1 & REQ_DISCARD) != (flags2 & REQ_DISCARD))
  		return false;
  
  	if ((flags1 & REQ_SECURE) != (flags2 & REQ_SECURE))
  		return false;
4363ac7c1   Martin K. Petersen   block: Implement ...
625
626
  	if ((flags1 & REQ_WRITE_SAME) != (flags2 & REQ_WRITE_SAME))
  		return false;
f31dc1cd4   Martin K. Petersen   block: Consolidat...
627
628
  	return true;
  }
4363ac7c1   Martin K. Petersen   block: Implement ...
629
630
631
632
633
634
635
  static inline bool blk_write_same_mergeable(struct bio *a, struct bio *b)
  {
  	if (bio_data(a) == bio_data(b))
  		return true;
  
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
   * 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
   */
2472892a3   Andi Kleen   block: fix memory...
652
653
  
  #if BITS_PER_LONG == 32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654
  #define BLK_BOUNCE_HIGH		((u64)blk_max_low_pfn << PAGE_SHIFT)
2472892a3   Andi Kleen   block: fix memory...
655
656
657
658
  #else
  #define BLK_BOUNCE_HIGH		-1ULL
  #endif
  #define BLK_BOUNCE_ANY		(-1ULL)
bfe172310   FUJITA Tomonori   block: kill ISA_D...
659
  #define BLK_BOUNCE_ISA		(DMA_BIT_MASK(24))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660

3d6392cfb   Jens Axboe   bsg: support for ...
661
662
663
664
  /*
   * default timeout for SG_IO if none specified
   */
  #define BLK_DEFAULT_SG_TIMEOUT	(60 * HZ)
f2f1fa78a   Linus Torvalds   Enforce a minimum...
665
  #define BLK_MIN_SG_TIMEOUT	(7 * HZ)
3d6392cfb   Jens Axboe   bsg: support for ...
666

2a7326b5b   Christoph Lameter   CONFIG_BOUNCE to ...
667
  #ifdef CONFIG_BOUNCE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  extern int init_emergency_isa_pool(void);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
669
  extern void blk_queue_bounce(struct request_queue *q, struct bio **bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
670
671
672
673
674
  #else
  static inline int init_emergency_isa_pool(void)
  {
  	return 0;
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
675
  static inline void blk_queue_bounce(struct request_queue *q, struct bio **bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
677
678
  {
  }
  #endif /* CONFIG_MMU */
152e283fd   FUJITA Tomonori   block: introduce ...
679
680
681
682
  struct rq_map_data {
  	struct page **pages;
  	int page_order;
  	int nr_entries;
56c451f4b   FUJITA Tomonori   [SCSI] block: fix...
683
  	unsigned long offset;
97ae77a1c   FUJITA Tomonori   [SCSI] block: mak...
684
  	int null_mapped;
ecb554a84   FUJITA Tomonori   block: fix sg SG_...
685
  	int from_user;
152e283fd   FUJITA Tomonori   block: introduce ...
686
  };
5705f7021   NeilBrown   Introduce rq_for_...
687
  struct req_iterator {
7988613b0   Kent Overstreet   block: Convert bi...
688
  	struct bvec_iter iter;
5705f7021   NeilBrown   Introduce rq_for_...
689
690
691
692
  	struct bio *bio;
  };
  
  /* This should not be used directly - use rq_for_each_segment */
1e4280791   Jens Axboe   block: reduce sta...
693
694
  #define for_each_bio(_bio)		\
  	for (; _bio; _bio = _bio->bi_next)
5705f7021   NeilBrown   Introduce rq_for_...
695
  #define __rq_for_each_bio(_bio, rq)	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696
697
  	if ((rq->bio))			\
  		for (_bio = (rq)->bio; _bio; _bio = _bio->bi_next)
5705f7021   NeilBrown   Introduce rq_for_...
698
699
  #define rq_for_each_segment(bvl, _rq, _iter)			\
  	__rq_for_each_bio(_iter.bio, _rq)			\
7988613b0   Kent Overstreet   block: Convert bi...
700
  		bio_for_each_segment(bvl, _iter.bio, _iter.iter)
5705f7021   NeilBrown   Introduce rq_for_...
701

4550dd6c6   Kent Overstreet   block: Immutable ...
702
  #define rq_iter_last(bvec, _iter)				\
7988613b0   Kent Overstreet   block: Convert bi...
703
  		(_iter.bio->bi_next == NULL &&			\
4550dd6c6   Kent Overstreet   block: Immutable ...
704
  		 bio_iter_last(bvec, _iter.iter))
5705f7021   NeilBrown   Introduce rq_for_...
705

2d4dc890b   Ilya Loginov   block: add helper...
706
707
708
709
710
711
712
713
714
715
  #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 rq_flush_dcache_pages(struct request *rq);
  #else
  static inline void rq_flush_dcache_pages(struct request *rq)
  {
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
716
717
  extern int blk_register_queue(struct gendisk *disk);
  extern void blk_unregister_queue(struct gendisk *disk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
718
  extern void generic_make_request(struct bio *bio);
2a4aa30c5   FUJITA Tomonori   block: rename and...
719
  extern void blk_rq_init(struct request_queue *q, struct request *rq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
  extern void blk_put_request(struct request *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
721
  extern void __blk_put_request(struct request_queue *, struct request *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
722
  extern struct request *blk_get_request(struct request_queue *, int, gfp_t);
79eb63e9e   Boaz Harrosh   block: Add blk_ma...
723
724
  extern struct request *blk_make_request(struct request_queue *, struct bio *,
  					gfp_t);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
725
  extern void blk_requeue_request(struct request_queue *, struct request *);
66ac02801   Christoph Hellwig   block: don't allo...
726
727
  extern void blk_add_request_payload(struct request *rq, struct page *page,
  		unsigned int len);
82124d603   Kiyoshi Ueda   block: add reques...
728
  extern int blk_rq_check_limits(struct request_queue *q, struct request *rq);
ef9e3facd   Kiyoshi Ueda   block: add lld bu...
729
  extern int blk_lld_busy(struct request_queue *q);
b0fd271d5   Kiyoshi Ueda   block: add reques...
730
731
732
733
734
  extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
  			     struct bio_set *bs, gfp_t gfp_mask,
  			     int (*bio_ctr)(struct bio *, struct bio *, void *),
  			     void *data);
  extern void blk_rq_unprep_clone(struct request *rq);
82124d603   Kiyoshi Ueda   block: add reques...
735
736
  extern int blk_insert_cloned_request(struct request_queue *q,
  				     struct request *rq);
3cca6dc1c   Jens Axboe   block: add API fo...
737
  extern void blk_delay_queue(struct request_queue *, unsigned long);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
738
  extern void blk_recount_segments(struct request_queue *, struct bio *);
0bfc96cb7   Paolo Bonzini   block: fail SCSI ...
739
  extern int scsi_verify_blk_ioctl(struct block_device *, unsigned int);
577ebb374   Paolo Bonzini   block: add and us...
740
741
  extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t,
  			      unsigned int, void __user *);
74f3c8aff   Al Viro   [PATCH] switch sc...
742
743
  extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,
  			  unsigned int, void __user *);
e915e872e   Al Viro   [PATCH] switch sg...
744
745
  extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,
  			 struct scsi_ioctl_command __user *);
3fcfab16c   Andrew Morton   [PATCH] separate ...
746

5a7bbad27   Christoph Hellwig   block: remove sup...
747
  extern void blk_queue_bio(struct request_queue *q, struct bio *bio);
166e1f901   Christoph Hellwig   block: export __m...
748

3fcfab16c   Andrew Morton   [PATCH] separate ...
749
750
751
752
753
  /*
   * 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.
   */
8aa7e847d   Jens Axboe   Fix congestion_wa...
754
  static inline void blk_clear_queue_congested(struct request_queue *q, int sync)
3fcfab16c   Andrew Morton   [PATCH] separate ...
755
  {
8aa7e847d   Jens Axboe   Fix congestion_wa...
756
  	clear_bdi_congested(&q->backing_dev_info, sync);
3fcfab16c   Andrew Morton   [PATCH] separate ...
757
758
759
760
761
762
  }
  
  /*
   * A queue has just entered congestion.  Flag that in the queue's VM-visible
   * state flags and increment the global gounter of congested queues.
   */
8aa7e847d   Jens Axboe   Fix congestion_wa...
763
  static inline void blk_set_queue_congested(struct request_queue *q, int sync)
3fcfab16c   Andrew Morton   [PATCH] separate ...
764
  {
8aa7e847d   Jens Axboe   Fix congestion_wa...
765
  	set_bdi_congested(&q->backing_dev_info, sync);
3fcfab16c   Andrew Morton   [PATCH] separate ...
766
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
767
768
  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
769
  extern void blk_sync_queue(struct request_queue *q);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
770
  extern void __blk_stop_queue(struct request_queue *q);
24ecfbe27   Christoph Hellwig   block: add blk_ru...
771
  extern void __blk_run_queue(struct request_queue *q);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
772
  extern void blk_run_queue(struct request_queue *);
c21e6beba   Jens Axboe   block: get rid of...
773
  extern void blk_run_queue_async(struct request_queue *q);
a3bce90ed   FUJITA Tomonori   block: add gfp_ma...
774
  extern int blk_rq_map_user(struct request_queue *, struct request *,
152e283fd   FUJITA Tomonori   block: introduce ...
775
776
  			   struct rq_map_data *, void __user *, unsigned long,
  			   gfp_t);
8e5cfc45e   Jens Axboe   [PATCH] Fixup blk...
777
  extern int blk_rq_unmap_user(struct bio *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
778
779
  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 *,
86d564c84   Al Viro   constify blk_rq_m...
780
781
  			       struct rq_map_data *, const struct sg_iovec *,
  			       int, unsigned int, gfp_t);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
782
  extern int blk_execute_rq(struct request_queue *, struct gendisk *,
994ca9a19   James Bottomley   [PATCH] update bl...
783
  			  struct request *, int);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
784
  extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
15fc858a0   Jens Axboe   [BLOCK] Correct b...
785
  				  struct request *, int, rq_end_io_fn *);
6e39b69e7   Mike Christie   [SCSI] export blk...
786

165125e1e   Jens Axboe   [BLOCK] Get rid o...
787
  static inline struct request_queue *bdev_get_queue(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788
789
790
  {
  	return bdev->bd_disk->queue;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
791
  /*
80a761fd3   Tejun Heo   block: implement ...
792
793
794
795
796
797
   * blk_rq_pos()			: the current sector
   * blk_rq_bytes()		: bytes left in the entire request
   * blk_rq_cur_bytes()		: bytes left in the current segment
   * blk_rq_err_bytes()		: bytes left till the next error boundary
   * blk_rq_sectors()		: sectors left in the entire request
   * blk_rq_cur_sectors()		: sectors left in the current segment
5efccd17c   Tejun Heo   block: reorder re...
798
   */
5b93629b4   Tejun Heo   block: implement ...
799
800
  static inline sector_t blk_rq_pos(const struct request *rq)
  {
a2dec7b36   Tejun Heo   block: hide reque...
801
  	return rq->__sector;
2e46e8b27   Tejun Heo   block: drop reque...
802
803
804
805
  }
  
  static inline unsigned int blk_rq_bytes(const struct request *rq)
  {
a2dec7b36   Tejun Heo   block: hide reque...
806
  	return rq->__data_len;
5b93629b4   Tejun Heo   block: implement ...
807
  }
2e46e8b27   Tejun Heo   block: drop reque...
808
809
810
811
  static inline int blk_rq_cur_bytes(const struct request *rq)
  {
  	return rq->bio ? bio_cur_bytes(rq->bio) : 0;
  }
5efccd17c   Tejun Heo   block: reorder re...
812

80a761fd3   Tejun Heo   block: implement ...
813
  extern unsigned int blk_rq_err_bytes(const struct request *rq);
5b93629b4   Tejun Heo   block: implement ...
814
815
  static inline unsigned int blk_rq_sectors(const struct request *rq)
  {
2e46e8b27   Tejun Heo   block: drop reque...
816
  	return blk_rq_bytes(rq) >> 9;
5b93629b4   Tejun Heo   block: implement ...
817
818
819
820
  }
  
  static inline unsigned int blk_rq_cur_sectors(const struct request *rq)
  {
2e46e8b27   Tejun Heo   block: drop reque...
821
  	return blk_rq_cur_bytes(rq) >> 9;
5b93629b4   Tejun Heo   block: implement ...
822
  }
f31dc1cd4   Martin K. Petersen   block: Consolidat...
823
824
825
826
  static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q,
  						     unsigned int cmd_flags)
  {
  	if (unlikely(cmd_flags & REQ_DISCARD))
871dd9286   James Bottomley   block: fix max di...
827
  		return min(q->limits.max_discard_sectors, UINT_MAX >> 9);
f31dc1cd4   Martin K. Petersen   block: Consolidat...
828

4363ac7c1   Martin K. Petersen   block: Implement ...
829
830
  	if (unlikely(cmd_flags & REQ_WRITE_SAME))
  		return q->limits.max_write_same_sectors;
f31dc1cd4   Martin K. Petersen   block: Consolidat...
831
832
833
834
835
836
837
838
839
840
841
842
  	return q->limits.max_sectors;
  }
  
  static inline unsigned int blk_rq_get_max_sectors(struct request *rq)
  {
  	struct request_queue *q = rq->q;
  
  	if (unlikely(rq->cmd_type == REQ_TYPE_BLOCK_PC))
  		return q->limits.max_hw_sectors;
  
  	return blk_queue_get_max_sectors(q, rq->cmd_flags);
  }
75afb3529   Jun'ichi Nomura   block: Add nr_bio...
843
844
845
846
847
848
849
850
851
852
  static inline unsigned int blk_rq_count_bios(struct request *rq)
  {
  	unsigned int nr_bios = 0;
  	struct bio *bio;
  
  	__rq_for_each_bio(bio, rq)
  		nr_bios++;
  
  	return nr_bios;
  }
5efccd17c   Tejun Heo   block: reorder re...
853
  /*
9934c8c04   Tejun Heo   block: implement ...
854
855
856
857
858
859
860
   * Request issue related functions.
   */
  extern struct request *blk_peek_request(struct request_queue *q);
  extern void blk_start_request(struct request *rq);
  extern struct request *blk_fetch_request(struct request_queue *q);
  
  /*
2e60e0229   Tejun Heo   block: clean up r...
861
862
863
864
865
   * Request completion related functions.
   *
   * blk_update_request() completes given number of bytes and updates
   * the request without completing it.
   *
f06d9a2b5   Tejun Heo   block: replace en...
866
867
   * blk_end_request() and friends.  __blk_end_request() must be called
   * with the request queue spinlock acquired.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
868
869
   *
   * Several drivers define their own end_request and call
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
870
871
   * blk_end_request() for parts of the original function.
   * This prevents code duplication in drivers.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872
   */
2e60e0229   Tejun Heo   block: clean up r...
873
874
  extern bool blk_update_request(struct request *rq, int error,
  			       unsigned int nr_bytes);
b1f744937   FUJITA Tomonori   block: move compl...
875
876
877
878
  extern bool blk_end_request(struct request *rq, int error,
  			    unsigned int nr_bytes);
  extern void blk_end_request_all(struct request *rq, int error);
  extern bool blk_end_request_cur(struct request *rq, int error);
80a761fd3   Tejun Heo   block: implement ...
879
  extern bool blk_end_request_err(struct request *rq, int error);
b1f744937   FUJITA Tomonori   block: move compl...
880
881
882
883
  extern bool __blk_end_request(struct request *rq, int error,
  			      unsigned int nr_bytes);
  extern void __blk_end_request_all(struct request *rq, int error);
  extern bool __blk_end_request_cur(struct request *rq, int error);
80a761fd3   Tejun Heo   block: implement ...
884
  extern bool __blk_end_request_err(struct request *rq, int error);
2e60e0229   Tejun Heo   block: clean up r...
885

ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
886
  extern void blk_complete_request(struct request *);
242f9dcb8   Jens Axboe   block: unify requ...
887
888
  extern void __blk_complete_request(struct request *);
  extern void blk_abort_request(struct request *);
28018c242   James Bottomley   block: implement ...
889
  extern void blk_unprep_request(struct request *);
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
890

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
891
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
893
   * Access functions for manipulating queue properties
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
894
  extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn,
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
895
  					spinlock_t *lock, int node_id);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
896
  extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *);
01effb0dc   Mike Snitzer   block: allow init...
897
898
  extern struct request_queue *blk_init_allocated_queue(struct request_queue *,
  						      request_fn_proc *, spinlock_t *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
899
900
901
  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);
72d4cd9f3   Mike Snitzer   block: max hardwa...
902
  extern void blk_limits_max_hw_sectors(struct queue_limits *, unsigned int);
086fa5ff0   Martin K. Petersen   block: Rename blk...
903
  extern void blk_queue_max_hw_sectors(struct request_queue *, unsigned int);
8a78362c4   Martin K. Petersen   block: Consolidat...
904
  extern void blk_queue_max_segments(struct request_queue *, unsigned short);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
905
  extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);
67efc9258   Christoph Hellwig   block: allow larg...
906
907
  extern void blk_queue_max_discard_sectors(struct request_queue *q,
  		unsigned int max_discard_sectors);
4363ac7c1   Martin K. Petersen   block: Implement ...
908
909
  extern void blk_queue_max_write_same_sectors(struct request_queue *q,
  		unsigned int max_write_same_sectors);
e1defc4ff   Martin K. Petersen   block: Do away wi...
910
  extern void blk_queue_logical_block_size(struct request_queue *, unsigned short);
892b6f90d   Martin K. Petersen   block: Ensure phy...
911
  extern void blk_queue_physical_block_size(struct request_queue *, unsigned int);
c72758f33   Martin K. Petersen   block: Export I/O...
912
913
  extern void blk_queue_alignment_offset(struct request_queue *q,
  				       unsigned int alignment);
7c958e326   Martin K. Petersen   block: Add a wrap...
914
  extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min);
c72758f33   Martin K. Petersen   block: Export I/O...
915
  extern void blk_queue_io_min(struct request_queue *q, unsigned int min);
3c5820c74   Martin K. Petersen   block: Optimal I/...
916
  extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt);
c72758f33   Martin K. Petersen   block: Export I/O...
917
  extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);
e475bba2f   Martin K. Petersen   block: Introduce ...
918
  extern void blk_set_default_limits(struct queue_limits *lim);
b1bd055d3   Martin K. Petersen   block: Introduce ...
919
  extern void blk_set_stacking_limits(struct queue_limits *lim);
c72758f33   Martin K. Petersen   block: Export I/O...
920
921
  extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
  			    sector_t offset);
17be8c245   Martin K. Petersen   block: bdev_stack...
922
923
  extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev,
  			    sector_t offset);
c72758f33   Martin K. Petersen   block: Export I/O...
924
925
  extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev,
  			      sector_t offset);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
926
  extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b);
e3790c7d4   Tejun Heo   block: separate o...
927
  extern void blk_queue_dma_pad(struct request_queue *, unsigned int);
27f8221af   FUJITA Tomonori   block: add blk_qu...
928
  extern void blk_queue_update_dma_pad(struct request_queue *, unsigned int);
2fb98e841   Tejun Heo   block: implement ...
929
930
931
  extern int blk_queue_dma_drain(struct request_queue *q,
  			       dma_drain_needed_fn *dma_drain_needed,
  			       void *buf, unsigned int size);
ef9e3facd   Kiyoshi Ueda   block: add lld bu...
932
  extern void blk_queue_lld_busy(struct request_queue *q, lld_busy_fn *fn);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
933
934
  extern void blk_queue_segment_boundary(struct request_queue *, unsigned long);
  extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);
28018c242   James Bottomley   block: implement ...
935
  extern void blk_queue_unprep_rq(struct request_queue *, unprep_rq_fn *ufn);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
936
937
  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...
938
  extern void blk_queue_update_dma_alignment(struct request_queue *, int);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
939
  extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *);
242f9dcb8   Jens Axboe   block: unify requ...
940
941
  extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *);
  extern void blk_queue_rq_timeout(struct request_queue *, unsigned int);
4913efe45   Tejun Heo   block: deprecate ...
942
  extern void blk_queue_flush(struct request_queue *q, unsigned int flush);
f38769309   shaohua.li@intel.com   block: add a non-...
943
  extern void blk_queue_flush_queueable(struct request_queue *q, bool queueable);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
  extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945

165125e1e   Jens Axboe   [BLOCK] Get rid o...
946
  extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
85b9f66a4   Asias He   block: Add blk_bi...
947
948
  extern int blk_bio_map_sg(struct request_queue *q, struct bio *bio,
  			  struct scatterlist *sglist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  extern void blk_dump_rq_flags(struct request *, char *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
  extern long nr_blockdev_pages(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
951

09ac46c42   Tejun Heo   block: misc updat...
952
  bool __must_check blk_get_queue(struct request_queue *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
953
954
955
  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
956

316cc67d5   Shaohua Li   block: document b...
957
  /*
6c9546675   Lin Ming   block: add runtim...
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
   * block layer runtime pm functions
   */
  #ifdef CONFIG_PM_RUNTIME
  extern void blk_pm_runtime_init(struct request_queue *q, struct device *dev);
  extern int blk_pre_runtime_suspend(struct request_queue *q);
  extern void blk_post_runtime_suspend(struct request_queue *q, int err);
  extern void blk_pre_runtime_resume(struct request_queue *q);
  extern void blk_post_runtime_resume(struct request_queue *q, int err);
  #else
  static inline void blk_pm_runtime_init(struct request_queue *q,
  	struct device *dev) {}
  static inline int blk_pre_runtime_suspend(struct request_queue *q)
  {
  	return -ENOSYS;
  }
  static inline void blk_post_runtime_suspend(struct request_queue *q, int err) {}
  static inline void blk_pre_runtime_resume(struct request_queue *q) {}
  static inline void blk_post_runtime_resume(struct request_queue *q, int err) {}
  #endif
  
  /*
75df71362   Suresh Jayaraman   block: document b...
979
980
981
982
983
984
985
986
987
988
   * blk_plug permits building a queue of related requests by holding the I/O
   * fragments for a short period. This allows merging of sequential requests
   * into single larger request. As the requests are moved from a per-task list to
   * the device's request_queue in a batch, this results in improved scalability
   * as the lock contention for request_queue lock is reduced.
   *
   * It is ok not to disable preemption when adding the request to the plug list
   * or when attempting a merge, because blk_schedule_flush_list() will only flush
   * the plug list when the task sleeps by itself. For details, please see
   * schedule() where blk_schedule_flush_plug() is called.
316cc67d5   Shaohua Li   block: document b...
989
   */
73c101011   Jens Axboe   block: initial pa...
990
  struct blk_plug {
75df71362   Suresh Jayaraman   block: document b...
991
992
  	unsigned long magic; /* detect uninitialized use-cases */
  	struct list_head list; /* requests */
320ae51fe   Jens Axboe   blk-mq: new multi...
993
  	struct list_head mq_list; /* blk-mq requests */
75df71362   Suresh Jayaraman   block: document b...
994
  	struct list_head cb_list; /* md requires an unplug callback */
73c101011   Jens Axboe   block: initial pa...
995
  };
55c022bbd   Shaohua Li   block: avoid buil...
996
  #define BLK_MAX_REQUEST_COUNT 16
9cbb17508   NeilBrown   blk: centralize n...
997
  struct blk_plug_cb;
74018dc30   NeilBrown   blk: pass from_sc...
998
  typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool);
048c9374a   NeilBrown   block: Enhance ne...
999
1000
  struct blk_plug_cb {
  	struct list_head list;
9cbb17508   NeilBrown   blk: centralize n...
1001
1002
  	blk_plug_cb_fn callback;
  	void *data;
048c9374a   NeilBrown   block: Enhance ne...
1003
  };
9cbb17508   NeilBrown   blk: centralize n...
1004
1005
  extern struct blk_plug_cb *blk_check_plugged(blk_plug_cb_fn unplug,
  					     void *data, int size);
73c101011   Jens Axboe   block: initial pa...
1006
1007
  extern void blk_start_plug(struct blk_plug *);
  extern void blk_finish_plug(struct blk_plug *);
f6603783f   Jens Axboe   block: only force...
1008
  extern void blk_flush_plug_list(struct blk_plug *, bool);
73c101011   Jens Axboe   block: initial pa...
1009
1010
1011
1012
  
  static inline void blk_flush_plug(struct task_struct *tsk)
  {
  	struct blk_plug *plug = tsk->plug;
88b996cd0   Christoph Hellwig   block: cleanup th...
1013
  	if (plug)
a237c1c5b   Jens Axboe   block: let io_sch...
1014
1015
1016
1017
1018
1019
1020
1021
  		blk_flush_plug_list(plug, false);
  }
  
  static inline void blk_schedule_flush_plug(struct task_struct *tsk)
  {
  	struct blk_plug *plug = tsk->plug;
  
  	if (plug)
f6603783f   Jens Axboe   block: only force...
1022
  		blk_flush_plug_list(plug, true);
73c101011   Jens Axboe   block: initial pa...
1023
1024
1025
1026
1027
  }
  
  static inline bool blk_needs_flush_plug(struct task_struct *tsk)
  {
  	struct blk_plug *plug = tsk->plug;
320ae51fe   Jens Axboe   blk-mq: new multi...
1028
1029
1030
1031
  	return plug &&
  		(!list_empty(&plug->list) ||
  		 !list_empty(&plug->mq_list) ||
  		 !list_empty(&plug->cb_list));
73c101011   Jens Axboe   block: initial pa...
1032
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
1034
1035
  /*
   * tag stuff
   */
4aff5e233   Jens Axboe   [PATCH] Split str...
1036
  #define blk_rq_tagged(rq)		((rq)->cmd_flags & REQ_QUEUED)
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1037
1038
1039
1040
1041
1042
1043
  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...
1044
1045
  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
1046

f583f4924   David C Somayajulu   [PATCH] helper fu...
1047
1048
1049
1050
1051
1052
1053
  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];
  }
dd3932edd   Christoph Hellwig   block: remove BLK...
1054
1055
1056
1057
  
  #define BLKDEV_DISCARD_SECURE  0x01    /* secure discard */
  
  extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *);
fbd9b09a1   Dmitry Monakhov   blkdev: generaliz...
1058
1059
  extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
  		sector_t nr_sects, gfp_t gfp_mask, unsigned long flags);
4363ac7c1   Martin K. Petersen   block: Implement ...
1060
1061
  extern int blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
  		sector_t nr_sects, gfp_t gfp_mask, struct page *page);
3f14d792f   Dmitry Monakhov   blkdev: add blkde...
1062
  extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
dd3932edd   Christoph Hellwig   block: remove BLK...
1063
  			sector_t nr_sects, gfp_t gfp_mask);
2cf6d26a3   Christoph Hellwig   block: pass gfp_m...
1064
1065
  static inline int sb_issue_discard(struct super_block *sb, sector_t block,
  		sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags)
fb2dce862   David Woodhouse   Add 'discard' req...
1066
  {
2cf6d26a3   Christoph Hellwig   block: pass gfp_m...
1067
1068
1069
  	return blkdev_issue_discard(sb->s_bdev, block << (sb->s_blocksize_bits - 9),
  				    nr_blocks << (sb->s_blocksize_bits - 9),
  				    gfp_mask, flags);
fb2dce862   David Woodhouse   Add 'discard' req...
1070
  }
e6fa0be69   Lukas Czerner   Add helper functi...
1071
  static inline int sb_issue_zeroout(struct super_block *sb, sector_t block,
a107e5a3a   Theodore Ts'o   Merge branch 'nex...
1072
  		sector_t nr_blocks, gfp_t gfp_mask)
e6fa0be69   Lukas Czerner   Add helper functi...
1073
1074
1075
1076
  {
  	return blkdev_issue_zeroout(sb->s_bdev,
  				    block << (sb->s_blocksize_bits - 9),
  				    nr_blocks << (sb->s_blocksize_bits - 9),
a107e5a3a   Theodore Ts'o   Merge branch 'nex...
1077
  				    gfp_mask);
e6fa0be69   Lukas Czerner   Add helper functi...
1078
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079

018e04468   Jens Axboe   block: get rid of...
1080
  extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm);
0b07de85a   Adel Gadllah   allow userspace t...
1081

eb28d31bc   Martin K. Petersen   block: Add BLK_ p...
1082
1083
1084
1085
1086
1087
1088
  enum blk_default_limits {
  	BLK_MAX_SEGMENTS	= 128,
  	BLK_SAFE_MAX_SECTORS	= 255,
  	BLK_DEF_MAX_SECTORS	= 1024,
  	BLK_MAX_SEGMENT_SIZE	= 65536,
  	BLK_SEG_BOUNDARY_MASK	= 0xFFFFFFFFUL,
  };
0e435ac26   Milan Broz   block: fix settin...
1089

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1090
  #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist)
ae03bf639   Martin K. Petersen   block: Use access...
1091
1092
  static inline unsigned long queue_bounce_pfn(struct request_queue *q)
  {
025146e13   Martin K. Petersen   block: Move queue...
1093
  	return q->limits.bounce_pfn;
ae03bf639   Martin K. Petersen   block: Use access...
1094
1095
1096
1097
  }
  
  static inline unsigned long queue_segment_boundary(struct request_queue *q)
  {
025146e13   Martin K. Petersen   block: Move queue...
1098
  	return q->limits.seg_boundary_mask;
ae03bf639   Martin K. Petersen   block: Use access...
1099
1100
1101
1102
  }
  
  static inline unsigned int queue_max_sectors(struct request_queue *q)
  {
025146e13   Martin K. Petersen   block: Move queue...
1103
  	return q->limits.max_sectors;
ae03bf639   Martin K. Petersen   block: Use access...
1104
1105
1106
1107
  }
  
  static inline unsigned int queue_max_hw_sectors(struct request_queue *q)
  {
025146e13   Martin K. Petersen   block: Move queue...
1108
  	return q->limits.max_hw_sectors;
ae03bf639   Martin K. Petersen   block: Use access...
1109
  }
8a78362c4   Martin K. Petersen   block: Consolidat...
1110
  static inline unsigned short queue_max_segments(struct request_queue *q)
ae03bf639   Martin K. Petersen   block: Use access...
1111
  {
8a78362c4   Martin K. Petersen   block: Consolidat...
1112
  	return q->limits.max_segments;
ae03bf639   Martin K. Petersen   block: Use access...
1113
1114
1115
1116
  }
  
  static inline unsigned int queue_max_segment_size(struct request_queue *q)
  {
025146e13   Martin K. Petersen   block: Move queue...
1117
  	return q->limits.max_segment_size;
ae03bf639   Martin K. Petersen   block: Use access...
1118
  }
e1defc4ff   Martin K. Petersen   block: Do away wi...
1119
  static inline unsigned short queue_logical_block_size(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1120
1121
  {
  	int retval = 512;
025146e13   Martin K. Petersen   block: Move queue...
1122
1123
  	if (q && q->limits.logical_block_size)
  		retval = q->limits.logical_block_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1124
1125
1126
  
  	return retval;
  }
e1defc4ff   Martin K. Petersen   block: Do away wi...
1127
  static inline unsigned short bdev_logical_block_size(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1128
  {
e1defc4ff   Martin K. Petersen   block: Do away wi...
1129
  	return queue_logical_block_size(bdev_get_queue(bdev));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1130
  }
c72758f33   Martin K. Petersen   block: Export I/O...
1131
1132
1133
1134
  static inline unsigned int queue_physical_block_size(struct request_queue *q)
  {
  	return q->limits.physical_block_size;
  }
892b6f90d   Martin K. Petersen   block: Ensure phy...
1135
  static inline unsigned int bdev_physical_block_size(struct block_device *bdev)
ac481c20e   Martin K. Petersen   block: Topology i...
1136
1137
1138
  {
  	return queue_physical_block_size(bdev_get_queue(bdev));
  }
c72758f33   Martin K. Petersen   block: Export I/O...
1139
1140
1141
1142
  static inline unsigned int queue_io_min(struct request_queue *q)
  {
  	return q->limits.io_min;
  }
ac481c20e   Martin K. Petersen   block: Topology i...
1143
1144
1145
1146
  static inline int bdev_io_min(struct block_device *bdev)
  {
  	return queue_io_min(bdev_get_queue(bdev));
  }
c72758f33   Martin K. Petersen   block: Export I/O...
1147
1148
1149
1150
  static inline unsigned int queue_io_opt(struct request_queue *q)
  {
  	return q->limits.io_opt;
  }
ac481c20e   Martin K. Petersen   block: Topology i...
1151
1152
1153
1154
  static inline int bdev_io_opt(struct block_device *bdev)
  {
  	return queue_io_opt(bdev_get_queue(bdev));
  }
c72758f33   Martin K. Petersen   block: Export I/O...
1155
1156
  static inline int queue_alignment_offset(struct request_queue *q)
  {
ac481c20e   Martin K. Petersen   block: Topology i...
1157
  	if (q->limits.misaligned)
c72758f33   Martin K. Petersen   block: Export I/O...
1158
  		return -1;
ac481c20e   Martin K. Petersen   block: Topology i...
1159
  	return q->limits.alignment_offset;
c72758f33   Martin K. Petersen   block: Export I/O...
1160
  }
e03a72e13   Martin K. Petersen   block: Stop using...
1161
  static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector)
81744ee44   Martin K. Petersen   block: Fix incorr...
1162
1163
  {
  	unsigned int granularity = max(lim->physical_block_size, lim->io_min);
e03a72e13   Martin K. Petersen   block: Stop using...
1164
  	unsigned int alignment = (sector << 9) & (granularity - 1);
81744ee44   Martin K. Petersen   block: Fix incorr...
1165

e03a72e13   Martin K. Petersen   block: Stop using...
1166
1167
  	return (granularity + lim->alignment_offset - alignment)
  		& (granularity - 1);
c72758f33   Martin K. Petersen   block: Export I/O...
1168
  }
ac481c20e   Martin K. Petersen   block: Topology i...
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
  static inline int bdev_alignment_offset(struct block_device *bdev)
  {
  	struct request_queue *q = bdev_get_queue(bdev);
  
  	if (q->limits.misaligned)
  		return -1;
  
  	if (bdev != bdev->bd_contains)
  		return bdev->bd_part->alignment_offset;
  
  	return q->limits.alignment_offset;
  }
86b372814   Martin K. Petersen   block: Expose dis...
1181
1182
1183
1184
1185
1186
1187
  static inline int queue_discard_alignment(struct request_queue *q)
  {
  	if (q->limits.discard_misaligned)
  		return -1;
  
  	return q->limits.discard_alignment;
  }
e03a72e13   Martin K. Petersen   block: Stop using...
1188
  static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector_t sector)
86b372814   Martin K. Petersen   block: Expose dis...
1189
  {
59771079c   Linus Torvalds   blk: avoid divide...
1190
  	unsigned int alignment, granularity, offset;
dd3d145d4   Martin K. Petersen   block: Fix discar...
1191

a934a00a6   Martin K. Petersen   block: Fix discar...
1192
1193
  	if (!lim->max_discard_sectors)
  		return 0;
59771079c   Linus Torvalds   blk: avoid divide...
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
  	/* Why are these in bytes, not sectors? */
  	alignment = lim->discard_alignment >> 9;
  	granularity = lim->discard_granularity >> 9;
  	if (!granularity)
  		return 0;
  
  	/* Offset of the partition start in 'granularity' sectors */
  	offset = sector_div(sector, granularity);
  
  	/* And why do we do this modulus *again* in blkdev_issue_discard()? */
  	offset = (granularity + alignment - offset) % granularity;
  
  	/* Turn it back into bytes, gaah */
  	return offset << 9;
86b372814   Martin K. Petersen   block: Expose dis...
1208
  }
c6e666345   Paolo Bonzini   block: split disc...
1209
1210
1211
1212
1213
1214
1215
1216
1217
  static inline int bdev_discard_alignment(struct block_device *bdev)
  {
  	struct request_queue *q = bdev_get_queue(bdev);
  
  	if (bdev != bdev->bd_contains)
  		return bdev->bd_part->discard_alignment;
  
  	return q->limits.discard_alignment;
  }
98262f276   Martin K. Petersen   block: Allow devi...
1218
1219
  static inline unsigned int queue_discard_zeroes_data(struct request_queue *q)
  {
a934a00a6   Martin K. Petersen   block: Fix discar...
1220
  	if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1)
98262f276   Martin K. Petersen   block: Allow devi...
1221
1222
1223
1224
1225
1226
1227
1228
1229
  		return 1;
  
  	return 0;
  }
  
  static inline unsigned int bdev_discard_zeroes_data(struct block_device *bdev)
  {
  	return queue_discard_zeroes_data(bdev_get_queue(bdev));
  }
4363ac7c1   Martin K. Petersen   block: Implement ...
1230
1231
1232
1233
1234
1235
1236
1237
1238
  static inline unsigned int bdev_write_same(struct block_device *bdev)
  {
  	struct request_queue *q = bdev_get_queue(bdev);
  
  	if (q)
  		return q->limits.max_write_same_sectors;
  
  	return 0;
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1239
  static inline int queue_dma_alignment(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1240
  {
482eb6891   Pete Wyckoff   block: allow queu...
1241
  	return q ? q->dma_alignment : 511;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1242
  }
144177991   Namhyung Kim   block: fix an add...
1243
  static inline int blk_rq_aligned(struct request_queue *q, unsigned long addr,
879040742   FUJITA Tomonori   block: add blk_rq...
1244
1245
1246
  				 unsigned int len)
  {
  	unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask;
144177991   Namhyung Kim   block: fix an add...
1247
  	return !(addr & alignment) && !(len & alignment);
879040742   FUJITA Tomonori   block: add blk_rq...
1248
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
  /* 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...
1259
  static inline unsigned int block_size(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260
1261
1262
  {
  	return bdev->bd_block_size;
  }
f38769309   shaohua.li@intel.com   block: add a non-...
1263
1264
1265
1266
  static inline bool queue_flush_queueable(struct request_queue *q)
  {
  	return !q->flush_not_queueable;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
  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;
18887ad91   Jens Axboe   block: make kbloc...
1277
  int kblockd_schedule_work(struct request_queue *q, struct work_struct *work);
320ae51fe   Jens Axboe   blk-mq: new multi...
1278
  int kblockd_schedule_delayed_work(struct request_queue *q, struct delayed_work *dwork, unsigned long delay);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1279

9195291e5   Divyesh Shah   blkio: Increment ...
1280
  #ifdef CONFIG_BLK_CGROUP
28f4197e5   Jens Axboe   block: disable pr...
1281
1282
1283
1284
1285
  /*
   * This should not be using sched_clock(). A real patch is in progress
   * to fix this up, until that is in place we need to disable preemption
   * around sched_clock() in this function and set_io_start_time_ns().
   */
9195291e5   Divyesh Shah   blkio: Increment ...
1286
1287
  static inline void set_start_time_ns(struct request *req)
  {
28f4197e5   Jens Axboe   block: disable pr...
1288
  	preempt_disable();
9195291e5   Divyesh Shah   blkio: Increment ...
1289
  	req->start_time_ns = sched_clock();
28f4197e5   Jens Axboe   block: disable pr...
1290
  	preempt_enable();
9195291e5   Divyesh Shah   blkio: Increment ...
1291
1292
1293
1294
  }
  
  static inline void set_io_start_time_ns(struct request *req)
  {
28f4197e5   Jens Axboe   block: disable pr...
1295
  	preempt_disable();
9195291e5   Divyesh Shah   blkio: Increment ...
1296
  	req->io_start_time_ns = sched_clock();
28f4197e5   Jens Axboe   block: disable pr...
1297
  	preempt_enable();
9195291e5   Divyesh Shah   blkio: Increment ...
1298
  }
84c124da9   Divyesh Shah   blkio: Changes to...
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
  
  static inline uint64_t rq_start_time_ns(struct request *req)
  {
          return req->start_time_ns;
  }
  
  static inline uint64_t rq_io_start_time_ns(struct request *req)
  {
          return req->io_start_time_ns;
  }
9195291e5   Divyesh Shah   blkio: Increment ...
1309
1310
1311
  #else
  static inline void set_start_time_ns(struct request *req) {}
  static inline void set_io_start_time_ns(struct request *req) {}
84c124da9   Divyesh Shah   blkio: Changes to...
1312
1313
1314
1315
1316
1317
1318
1319
  static inline uint64_t rq_start_time_ns(struct request *req)
  {
  	return 0;
  }
  static inline uint64_t rq_io_start_time_ns(struct request *req)
  {
  	return 0;
  }
9195291e5   Divyesh Shah   blkio: Increment ...
1320
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1321
1322
1323
1324
  #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) "-*")
7ba1ba12e   Martin K. Petersen   block: Block laye...
1325
  #if defined(CONFIG_BLK_DEV_INTEGRITY)
b24498d47   Jens Axboe   block: integrity ...
1326
1327
  #define INTEGRITY_FLAG_READ	2	/* verify data integrity on read */
  #define INTEGRITY_FLAG_WRITE	4	/* generate data integrity on write */
7ba1ba12e   Martin K. Petersen   block: Block laye...
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
  
  struct blk_integrity_exchg {
  	void			*prot_buf;
  	void			*data_buf;
  	sector_t		sector;
  	unsigned int		data_size;
  	unsigned short		sector_size;
  	const char		*disk_name;
  };
  
  typedef void (integrity_gen_fn) (struct blk_integrity_exchg *);
  typedef int (integrity_vrfy_fn) (struct blk_integrity_exchg *);
  typedef void (integrity_set_tag_fn) (void *, void *, unsigned int);
  typedef void (integrity_get_tag_fn) (void *, void *, unsigned int);
  
  struct blk_integrity {
  	integrity_gen_fn	*generate_fn;
  	integrity_vrfy_fn	*verify_fn;
  	integrity_set_tag_fn	*set_tag_fn;
  	integrity_get_tag_fn	*get_tag_fn;
  
  	unsigned short		flags;
  	unsigned short		tuple_size;
  	unsigned short		sector_size;
  	unsigned short		tag_size;
  
  	const char		*name;
  
  	struct kobject		kobj;
  };
a63a5cf84   Mike Snitzer   dm: improve block...
1358
  extern bool blk_integrity_is_initialized(struct gendisk *);
7ba1ba12e   Martin K. Petersen   block: Block laye...
1359
1360
  extern int blk_integrity_register(struct gendisk *, struct blk_integrity *);
  extern void blk_integrity_unregister(struct gendisk *);
ad7fce931   Martin K. Petersen   block: Switch blk...
1361
  extern int blk_integrity_compare(struct gendisk *, struct gendisk *);
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1362
1363
1364
1365
1366
1367
1368
  extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
  				   struct scatterlist *);
  extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
  extern int blk_integrity_merge_rq(struct request_queue *, struct request *,
  				  struct request *);
  extern int blk_integrity_merge_bio(struct request_queue *, struct request *,
  				   struct bio *);
7ba1ba12e   Martin K. Petersen   block: Block laye...
1369

b04accc42   Jens Axboe   block: revert par...
1370
1371
1372
1373
1374
  static inline
  struct blk_integrity *bdev_get_integrity(struct block_device *bdev)
  {
  	return bdev->bd_disk->integrity;
  }
b02739b01   Martin K. Petersen   block: gendisk in...
1375
1376
1377
1378
  static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
  {
  	return disk->integrity;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
1379
1380
  static inline int blk_integrity_rq(struct request *rq)
  {
d442cc44c   Martin K. Petersen   block: Trivial fi...
1381
1382
  	if (rq->bio == NULL)
  		return 0;
7ba1ba12e   Martin K. Petersen   block: Block laye...
1383
1384
  	return bio_integrity(rq->bio);
  }
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
  static inline void blk_queue_max_integrity_segments(struct request_queue *q,
  						    unsigned int segs)
  {
  	q->limits.max_integrity_segments = segs;
  }
  
  static inline unsigned short
  queue_max_integrity_segments(struct request_queue *q)
  {
  	return q->limits.max_integrity_segments;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
1396
  #else /* CONFIG_BLK_DEV_INTEGRITY */
fd83240a6   Stephen Rothwell   blockdev: convert...
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
  struct bio;
  struct block_device;
  struct gendisk;
  struct blk_integrity;
  
  static inline int blk_integrity_rq(struct request *rq)
  {
  	return 0;
  }
  static inline int blk_rq_count_integrity_sg(struct request_queue *q,
  					    struct bio *b)
  {
  	return 0;
  }
  static inline int blk_rq_map_integrity_sg(struct request_queue *q,
  					  struct bio *b,
  					  struct scatterlist *s)
  {
  	return 0;
  }
  static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
  {
  	return 0;
  }
  static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
  {
  	return NULL;
  }
  static inline int blk_integrity_compare(struct gendisk *a, struct gendisk *b)
  {
  	return 0;
  }
  static inline int blk_integrity_register(struct gendisk *d,
  					 struct blk_integrity *b)
  {
  	return 0;
  }
  static inline void blk_integrity_unregister(struct gendisk *d)
  {
  }
  static inline void blk_queue_max_integrity_segments(struct request_queue *q,
  						    unsigned int segs)
  {
  }
  static inline unsigned short queue_max_integrity_segments(struct request_queue *q)
  {
  	return 0;
  }
  static inline int blk_integrity_merge_rq(struct request_queue *rq,
  					 struct request *r1,
  					 struct request *r2)
  {
  	return 0;
  }
  static inline int blk_integrity_merge_bio(struct request_queue *rq,
  					  struct request *r,
  					  struct bio *b)
  {
  	return 0;
  }
  static inline bool blk_integrity_is_initialized(struct gendisk *g)
  {
  	return 0;
  }
7ba1ba12e   Martin K. Petersen   block: Block laye...
1461
1462
  
  #endif /* CONFIG_BLK_DEV_INTEGRITY */
08f858512   Al Viro   [PATCH] move bloc...
1463
  struct block_device_operations {
d4430d62f   Al Viro   [PATCH] beginning...
1464
  	int (*open) (struct block_device *, fmode_t);
db2a144be   Al Viro   block_device_oper...
1465
  	void (*release) (struct gendisk *, fmode_t);
d4430d62f   Al Viro   [PATCH] beginning...
1466
1467
  	int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
  	int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
08f858512   Al Viro   [PATCH] move bloc...
1468
1469
  	int (*direct_access) (struct block_device *, sector_t,
  						void **, unsigned long *);
77ea887e4   Tejun Heo   implement in-kern...
1470
1471
1472
  	unsigned int (*check_events) (struct gendisk *disk,
  				      unsigned int clearing);
  	/* ->media_changed() is DEPRECATED, use ->check_events() instead */
08f858512   Al Viro   [PATCH] move bloc...
1473
  	int (*media_changed) (struct gendisk *);
c3e33e043   Tejun Heo   block,ide: simpli...
1474
  	void (*unlock_native_capacity) (struct gendisk *);
08f858512   Al Viro   [PATCH] move bloc...
1475
1476
  	int (*revalidate_disk) (struct gendisk *);
  	int (*getgeo)(struct block_device *, struct hd_geometry *);
b3a27d052   Nitin Gupta   swap: Add swap sl...
1477
1478
  	/* this callback is with swap_lock and sometimes page table lock held */
  	void (*swap_slot_free_notify) (struct block_device *, unsigned long);
08f858512   Al Viro   [PATCH] move bloc...
1479
1480
  	struct module *owner;
  };
633a08b81   Al Viro   [PATCH] introduce...
1481
1482
  extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
  				 unsigned long);
9361401eb   David Howells   [PATCH] BLOCK: Ma...
1483
1484
1485
1486
1487
  #else /* CONFIG_BLOCK */
  /*
   * stubs for when the block layer is configured out
   */
  #define buffer_heads_over_limit 0
9361401eb   David Howells   [PATCH] BLOCK: Ma...
1488
1489
1490
1491
  static inline long nr_blockdev_pages(void)
  {
  	return 0;
  }
1f940bdfc   Jens Axboe   block: fixup plug...
1492
1493
1494
1495
  struct blk_plug {
  };
  
  static inline void blk_start_plug(struct blk_plug *plug)
73c101011   Jens Axboe   block: initial pa...
1496
1497
  {
  }
1f940bdfc   Jens Axboe   block: fixup plug...
1498
  static inline void blk_finish_plug(struct blk_plug *plug)
73c101011   Jens Axboe   block: initial pa...
1499
1500
  {
  }
1f940bdfc   Jens Axboe   block: fixup plug...
1501
  static inline void blk_flush_plug(struct task_struct *task)
73c101011   Jens Axboe   block: initial pa...
1502
1503
  {
  }
a237c1c5b   Jens Axboe   block: let io_sch...
1504
1505
1506
  static inline void blk_schedule_flush_plug(struct task_struct *task)
  {
  }
73c101011   Jens Axboe   block: initial pa...
1507
1508
1509
1510
  static inline bool blk_needs_flush_plug(struct task_struct *tsk)
  {
  	return false;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
1511
  #endif /* CONFIG_BLOCK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1512
  #endif