Blame view

block/blk-core.c 59.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
   * Copyright (C) 1991, 1992 Linus Torvalds
   * Copyright (C) 1994,      Karl Keyte: Added support for disk statistics
   * Elevator latency, (C) 2000  Andrea Arcangeli <andrea@suse.de> SuSE
   * Queue request tables / lock, selectable elevator, Jens Axboe <axboe@suse.de>
6728cb0e6   Jens Axboe   block: make core ...
6
7
   * kernel-doc documentation started by NeilBrown <neilb@cse.unsw.edu.au>
   *	-  July2000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
13
   * bio rewrite, highmem i/o, etc, Jens Axboe <axboe@suse.de> - may 2001
   */
  
  /*
   * This handles all read/write requests to block devices
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
21
22
23
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/backing-dev.h>
  #include <linux/bio.h>
  #include <linux/blkdev.h>
  #include <linux/highmem.h>
  #include <linux/mm.h>
  #include <linux/kernel_stat.h>
  #include <linux/string.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
  #include <linux/completion.h>
  #include <linux/slab.h>
  #include <linux/swap.h>
  #include <linux/writeback.h>
faccbd4b2   Andrew Morton   [PATCH] io-accoun...
28
  #include <linux/task_io_accounting_ops.h>
2056a782f   Jens Axboe   [PATCH] Block que...
29
  #include <linux/blktrace_api.h>
c17bb4951   Akinobu Mita   [PATCH] fault-inj...
30
  #include <linux/fault-inject.h>
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
31
  #include <trace/block.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

8324aa91d   Jens Axboe   block: split tag ...
33
  #include "blk.h"
0bfc24559   Ingo Molnar   blktrace: port to...
34
35
36
37
38
39
40
41
42
43
44
45
  DEFINE_TRACE(block_plug);
  DEFINE_TRACE(block_unplug_io);
  DEFINE_TRACE(block_unplug_timer);
  DEFINE_TRACE(block_getrq);
  DEFINE_TRACE(block_sleeprq);
  DEFINE_TRACE(block_rq_requeue);
  DEFINE_TRACE(block_bio_backmerge);
  DEFINE_TRACE(block_bio_frontmerge);
  DEFINE_TRACE(block_bio_queue);
  DEFINE_TRACE(block_rq_complete);
  DEFINE_TRACE(block_remap);	/* Also used in drivers/md/dm.c */
  EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
46
  static int __make_request(struct request_queue *q, struct bio *bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
50
  
  /*
   * For the allocated request tables
   */
5ece6c52e   Adrian Bunk   make blk-core.c:r...
51
  static struct kmem_cache *request_cachep;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
  
  /*
   * For queue allocation
   */
6728cb0e6   Jens Axboe   block: make core ...
56
  struct kmem_cache *blk_requestq_cachep;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
   * Controlling structure to kblockd
   */
ff856bad6   Jens Axboe   [BLOCK] ll_rw_blk...
61
  static struct workqueue_struct *kblockd_workqueue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62

26b8256e2   Jens Axboe   block: get rid of...
63
64
  static void drive_stat_acct(struct request *rq, int new_io)
  {
28f13702f   Jens Axboe   block: avoid dupl...
65
  	struct hd_struct *part;
26b8256e2   Jens Axboe   block: get rid of...
66
  	int rw = rq_data_dir(rq);
c99590591   Tejun Heo   block: fix diskst...
67
  	int cpu;
26b8256e2   Jens Axboe   block: get rid of...
68

26308eab6   Jerome Marchand   block: fix incons...
69
  	if (!blk_fs_request(rq) || !blk_do_io_stat(rq))
26b8256e2   Jens Axboe   block: get rid of...
70
  		return;
074a7aca7   Tejun Heo   block: move stats...
71
  	cpu = part_stat_lock();
e71bf0d0e   Tejun Heo   block: fix disk->...
72
  	part = disk_map_sector_rcu(rq->rq_disk, rq->sector);
c99590591   Tejun Heo   block: fix diskst...
73

28f13702f   Jens Axboe   block: avoid dupl...
74
  	if (!new_io)
074a7aca7   Tejun Heo   block: move stats...
75
  		part_stat_inc(cpu, part, merges[rw]);
28f13702f   Jens Axboe   block: avoid dupl...
76
  	else {
074a7aca7   Tejun Heo   block: move stats...
77
78
  		part_round_stats(cpu, part);
  		part_inc_in_flight(part);
26b8256e2   Jens Axboe   block: get rid of...
79
  	}
e71bf0d0e   Tejun Heo   block: fix disk->...
80

074a7aca7   Tejun Heo   block: move stats...
81
  	part_stat_unlock();
26b8256e2   Jens Axboe   block: get rid of...
82
  }
8324aa91d   Jens Axboe   block: split tag ...
83
  void blk_queue_congestion_threshold(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
87
88
89
90
91
92
93
94
95
96
  {
  	int nr;
  
  	nr = q->nr_requests - (q->nr_requests / 8) + 1;
  	if (nr > q->nr_requests)
  		nr = q->nr_requests;
  	q->nr_congestion_on = nr;
  
  	nr = q->nr_requests - (q->nr_requests / 8) - (q->nr_requests / 16) - 1;
  	if (nr < 1)
  		nr = 1;
  	q->nr_congestion_off = nr;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
100
101
102
103
104
105
106
107
108
  /**
   * blk_get_backing_dev_info - get the address of a queue's backing_dev_info
   * @bdev:	device
   *
   * Locates the passed device's request queue and returns the address of its
   * backing_dev_info
   *
   * Will return NULL if the request queue cannot be located.
   */
  struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev)
  {
  	struct backing_dev_info *ret = NULL;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
109
  	struct request_queue *q = bdev_get_queue(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
  
  	if (q)
  		ret = &q->backing_dev_info;
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  EXPORT_SYMBOL(blk_get_backing_dev_info);
2a4aa30c5   FUJITA Tomonori   block: rename and...
116
  void blk_rq_init(struct request_queue *q, struct request *rq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
  {
1afb20f30   FUJITA Tomonori   block: make rq_in...
118
  	memset(rq, 0, sizeof(*rq));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  	INIT_LIST_HEAD(&rq->queuelist);
242f9dcb8   Jens Axboe   block: unify requ...
120
  	INIT_LIST_HEAD(&rq->timeout_list);
c7c22e4d5   Jens Axboe   block: add suppor...
121
  	rq->cpu = -1;
63a713867   Jens Axboe   block: fixup rq_i...
122
123
  	rq->q = q;
  	rq->sector = rq->hard_sector = (sector_t) -1;
2e662b65f   Jens Axboe   [PATCH] elevator:...
124
125
  	INIT_HLIST_NODE(&rq->hash);
  	RB_CLEAR_NODE(&rq->rb_node);
d7e3c3249   FUJITA Tomonori   block: add large ...
126
  	rq->cmd = rq->__cmd;
e2494e1b4   Li Zefan   blktrace: fix pdu...
127
  	rq->cmd_len = BLK_MAX_CDB;
63a713867   Jens Axboe   block: fixup rq_i...
128
  	rq->tag = -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  	rq->ref_count = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  }
2a4aa30c5   FUJITA Tomonori   block: rename and...
131
  EXPORT_SYMBOL(blk_rq_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132

5bb23a688   NeilBrown   Don't decrement b...
133
134
  static void req_bio_endio(struct request *rq, struct bio *bio,
  			  unsigned int nbytes, int error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
136
  	struct request_queue *q = rq->q;
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
137

5bb23a688   NeilBrown   Don't decrement b...
138
139
140
141
142
  	if (&q->bar_rq != rq) {
  		if (error)
  			clear_bit(BIO_UPTODATE, &bio->bi_flags);
  		else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
  			error = -EIO;
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
143

5bb23a688   NeilBrown   Don't decrement b...
144
  		if (unlikely(nbytes > bio->bi_size)) {
6728cb0e6   Jens Axboe   block: make core ...
145
146
  			printk(KERN_ERR "%s: want %u bytes done, %u left
  ",
24c03d47d   Harvey Harrison   block: remove rem...
147
  			       __func__, nbytes, bio->bi_size);
5bb23a688   NeilBrown   Don't decrement b...
148
149
  			nbytes = bio->bi_size;
  		}
797e7dbbe   Tejun Heo   [BLOCK] reimpleme...
150

08bafc034   Keith Mannthey   block: Supress Bu...
151
152
  		if (unlikely(rq->cmd_flags & REQ_QUIET))
  			set_bit(BIO_QUIET, &bio->bi_flags);
5bb23a688   NeilBrown   Don't decrement b...
153
154
  		bio->bi_size -= nbytes;
  		bio->bi_sector += (nbytes >> 9);
7ba1ba12e   Martin K. Petersen   block: Block laye...
155
156
157
  
  		if (bio_integrity(bio))
  			bio_integrity_advance(bio, nbytes);
5bb23a688   NeilBrown   Don't decrement b...
158
  		if (bio->bi_size == 0)
6712ecf8f   NeilBrown   Drop 'size' argum...
159
  			bio_endio(bio, error);
5bb23a688   NeilBrown   Don't decrement b...
160
161
162
163
164
165
166
167
168
  	} else {
  
  		/*
  		 * Okay, this is the barrier request in progress, just
  		 * record the error;
  		 */
  		if (error && !q->orderr)
  			q->orderr = error;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
172
173
  void blk_dump_rq_flags(struct request *rq, char *msg)
  {
  	int bit;
6728cb0e6   Jens Axboe   block: make core ...
174
175
  	printk(KERN_INFO "%s: dev %s: type=%x, flags=%x
  ", msg,
4aff5e233   Jens Axboe   [PATCH] Split str...
176
177
  		rq->rq_disk ? rq->rq_disk->disk_name : "?", rq->cmd_type,
  		rq->cmd_flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178

6728cb0e6   Jens Axboe   block: make core ...
179
180
181
182
183
184
185
186
187
188
  	printk(KERN_INFO "  sector %llu, nr/cnr %lu/%u
  ",
  						(unsigned long long)rq->sector,
  						rq->nr_sectors,
  						rq->current_nr_sectors);
  	printk(KERN_INFO "  bio %p, biotail %p, buffer %p, data %p, len %u
  ",
  						rq->bio, rq->biotail,
  						rq->buffer, rq->data,
  						rq->data_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189

4aff5e233   Jens Axboe   [PATCH] Split str...
190
  	if (blk_pc_request(rq)) {
6728cb0e6   Jens Axboe   block: make core ...
191
  		printk(KERN_INFO "  cdb: ");
d34c87e4b   FUJITA Tomonori   block: replace si...
192
  		for (bit = 0; bit < BLK_MAX_CDB; bit++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
197
  			printk("%02x ", rq->cmd[bit]);
  		printk("
  ");
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
  EXPORT_SYMBOL(blk_dump_rq_flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
200
201
202
203
204
205
206
  /*
   * "plug" the device if there are no outstanding requests: this will
   * force the transfer to start only after we have put all the requests
   * on the list.
   *
   * This is called with interrupts off and no requests on the queue and
   * with the queue lock held.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
207
  void blk_plug_device(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
212
213
214
  {
  	WARN_ON(!irqs_disabled());
  
  	/*
  	 * don't plug a stopped queue, it must be paired with blk_start_queue()
  	 * which will restart the queueing
  	 */
7daac4902   Coywolf Qi Hunt   [patch] cleanup: ...
215
  	if (blk_queue_stopped(q))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
  		return;
e48ec6900   Jens Axboe   block: extend que...
217
  	if (!queue_flag_test_and_set(QUEUE_FLAG_PLUGGED, q)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  		mod_timer(&q->unplug_timer, jiffies + q->unplug_delay);
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
219
  		trace_block_plug(q);
2056a782f   Jens Axboe   [PATCH] Block que...
220
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
  EXPORT_SYMBOL(blk_plug_device);
6c5e0c4d5   Jens Axboe   block: add a blk_...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
  /**
   * blk_plug_device_unlocked - plug a device without queue lock held
   * @q:    The &struct request_queue to plug
   *
   * Description:
   *   Like @blk_plug_device(), but grabs the queue lock and disables
   *   interrupts.
   **/
  void blk_plug_device_unlocked(struct request_queue *q)
  {
  	unsigned long flags;
  
  	spin_lock_irqsave(q->queue_lock, flags);
  	blk_plug_device(q);
  	spin_unlock_irqrestore(q->queue_lock, flags);
  }
  EXPORT_SYMBOL(blk_plug_device_unlocked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
241
242
243
  /*
   * remove the queue from the plugged list, if present. called with
   * queue lock held and interrupts disabled.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
244
  int blk_remove_plug(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
  {
  	WARN_ON(!irqs_disabled());
e48ec6900   Jens Axboe   block: extend que...
247
  	if (!queue_flag_test_and_clear(QUEUE_FLAG_PLUGGED, q))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
249
250
251
252
  		return 0;
  
  	del_timer(&q->unplug_timer);
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
254
255
256
257
  EXPORT_SYMBOL(blk_remove_plug);
  
  /*
   * remove the plug and let it rip..
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
258
  void __generic_unplug_device(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
  {
7daac4902   Coywolf Qi Hunt   [patch] cleanup: ...
260
  	if (unlikely(blk_queue_stopped(q)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
  		return;
a31a97381   Jens Axboe   block: don't use ...
262
  	if (!blk_remove_plug(q) && !blk_queue_nonrot(q))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
  		return;
22e2c507c   Jens Axboe   [PATCH] Update cf...
264
  	q->request_fn(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
267
268
  
  /**
   * generic_unplug_device - fire a request queue
165125e1e   Jens Axboe   [BLOCK] Get rid o...
269
   * @q:    The &struct request_queue in question
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
271
272
273
274
275
276
277
   *
   * Description:
   *   Linux uses plugging to build bigger requests queues before letting
   *   the device have at them. If a queue is plugged, the I/O scheduler
   *   is still adding and merging requests on the queue. Once the queue
   *   gets unplugged, the request_fn defined for the queue is invoked and
   *   transfers started.
   **/
165125e1e   Jens Axboe   [BLOCK] Get rid o...
278
  void generic_unplug_device(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
  {
dbaf2c003   Jens Axboe   block: optimize g...
280
281
282
283
284
  	if (blk_queue_plugged(q)) {
  		spin_lock_irq(q->queue_lock);
  		__generic_unplug_device(q);
  		spin_unlock_irq(q->queue_lock);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
287
288
289
290
  }
  EXPORT_SYMBOL(generic_unplug_device);
  
  static void blk_backing_dev_unplug(struct backing_dev_info *bdi,
  				   struct page *page)
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
291
  	struct request_queue *q = bdi->unplug_io_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292

2ad8b1ef1   Alan D. Brunelle   Add UNPLUG traces...
293
  	blk_unplug(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
  }
86db1e297   Jens Axboe   block: continue l...
295
  void blk_unplug_work(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
297
298
  	struct request_queue *q =
  		container_of(work, struct request_queue, unplug_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
300
  	trace_block_unplug_io(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
  	q->unplug_fn(q);
  }
86db1e297   Jens Axboe   block: continue l...
303
  void blk_unplug_timeout(unsigned long data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
305
  	struct request_queue *q = (struct request_queue *)data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
307
  	trace_block_unplug_timer(q);
18887ad91   Jens Axboe   block: make kbloc...
308
  	kblockd_schedule_work(q, &q->unplug_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
  }
2ad8b1ef1   Alan D. Brunelle   Add UNPLUG traces...
310
311
312
313
314
315
  void blk_unplug(struct request_queue *q)
  {
  	/*
  	 * devices don't necessarily have an ->unplug_fn defined
  	 */
  	if (q->unplug_fn) {
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
316
  		trace_block_unplug_io(q);
2ad8b1ef1   Alan D. Brunelle   Add UNPLUG traces...
317
318
319
320
  		q->unplug_fn(q);
  	}
  }
  EXPORT_SYMBOL(blk_unplug);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
322
  /**
   * blk_start_queue - restart a previously stopped queue
165125e1e   Jens Axboe   [BLOCK] Get rid o...
323
   * @q:    The &struct request_queue in question
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
326
327
328
329
   *
   * Description:
   *   blk_start_queue() will clear the stop flag on the queue, and call
   *   the request_fn for the queue if it was in a stopped state when
   *   entered. Also see blk_stop_queue(). Queue lock must be held.
   **/
165125e1e   Jens Axboe   [BLOCK] Get rid o...
330
  void blk_start_queue(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
  {
a038e2536   Paolo 'Blaisorblade' Giarrusso   [PATCH] blk_start...
332
  	WARN_ON(!irqs_disabled());
75ad23bc0   Nick Piggin   block: make queue...
333
  	queue_flag_clear(QUEUE_FLAG_STOPPED, q);
a538cd03b   Tejun Heo   block: merge blk_...
334
  	__blk_run_queue(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
337
338
339
  EXPORT_SYMBOL(blk_start_queue);
  
  /**
   * blk_stop_queue - stop a queue
165125e1e   Jens Axboe   [BLOCK] Get rid o...
340
   * @q:    The &struct request_queue in question
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
343
344
345
346
347
348
349
350
351
   *
   * Description:
   *   The Linux block layer assumes that a block driver will consume all
   *   entries on the request queue when the request_fn strategy is called.
   *   Often this will not happen, because of hardware limitations (queue
   *   depth settings). If a device driver gets a 'queue full' response,
   *   or if it simply chooses not to queue more I/O at one point, it can
   *   call this function to prevent the request_fn from being called until
   *   the driver has signalled it's ready to go again. This happens by calling
   *   blk_start_queue() to restart queue operations. Queue lock must be held.
   **/
165125e1e   Jens Axboe   [BLOCK] Get rid o...
352
  void blk_stop_queue(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
  {
  	blk_remove_plug(q);
75ad23bc0   Nick Piggin   block: make queue...
355
  	queue_flag_set(QUEUE_FLAG_STOPPED, q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
358
359
360
361
362
363
364
365
366
367
  }
  EXPORT_SYMBOL(blk_stop_queue);
  
  /**
   * blk_sync_queue - cancel any pending callbacks on a queue
   * @q: the queue
   *
   * Description:
   *     The block layer may perform asynchronous callback activity
   *     on a queue, such as calling the unplug function after a timeout.
   *     A block device may call blk_sync_queue to ensure that any
   *     such activity is cancelled, thus allowing it to release resources
59c51591a   Michael Opdenacker   Fix occurrences o...
368
   *     that the callbacks might use. The caller must already have made sure
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
370
371
372
373
374
375
   *     that its ->make_request_fn will not re-add plugging prior to calling
   *     this function.
   *
   */
  void blk_sync_queue(struct request_queue *q)
  {
  	del_timer_sync(&q->unplug_timer);
70ed28b92   Jens Axboe   block: leave the ...
376
  	del_timer_sync(&q->timeout);
64d01dc9e   Cheng Renquan   block: use cancel...
377
  	cancel_work_sync(&q->unplug_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
378
379
380
381
  }
  EXPORT_SYMBOL(blk_sync_queue);
  
  /**
80a4b58e3   Jens Axboe   block: only call ...
382
   * __blk_run_queue - run a single device queue
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
   * @q:	The queue to run
80a4b58e3   Jens Axboe   block: only call ...
384
385
386
387
388
   *
   * Description:
   *    See @blk_run_queue. This variant must be called with the queue lock
   *    held and interrupts disabled.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
   */
75ad23bc0   Nick Piggin   block: make queue...
390
  void __blk_run_queue(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
  	blk_remove_plug(q);
dac07ec12   Jens Axboe   [BLOCK] limit req...
393

a538cd03b   Tejun Heo   block: merge blk_...
394
395
396
397
398
  	if (unlikely(blk_queue_stopped(q)))
  		return;
  
  	if (elv_queue_empty(q))
  		return;
dac07ec12   Jens Axboe   [BLOCK] limit req...
399
400
401
402
  	/*
  	 * Only recurse once to avoid overrunning the stack, let the unplug
  	 * handling reinvoke the handler shortly if we already got there.
  	 */
a538cd03b   Tejun Heo   block: merge blk_...
403
404
405
406
407
408
409
  	if (!queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) {
  		q->request_fn(q);
  		queue_flag_clear(QUEUE_FLAG_REENTER, q);
  	} else {
  		queue_flag_set(QUEUE_FLAG_PLUGGED, q);
  		kblockd_schedule_work(q, &q->unplug_work);
  	}
75ad23bc0   Nick Piggin   block: make queue...
410
411
  }
  EXPORT_SYMBOL(__blk_run_queue);
dac07ec12   Jens Axboe   [BLOCK] limit req...
412

75ad23bc0   Nick Piggin   block: make queue...
413
414
415
  /**
   * blk_run_queue - run a single device queue
   * @q: The queue to run
80a4b58e3   Jens Axboe   block: only call ...
416
417
418
   *
   * Description:
   *    Invoke request handling on this queue, if it has pending work to do.
a7f557923   Tejun Heo   block: kill blk_s...
419
   *    May be used to restart queueing when a request has completed.
75ad23bc0   Nick Piggin   block: make queue...
420
421
422
423
424
425
426
   */
  void blk_run_queue(struct request_queue *q)
  {
  	unsigned long flags;
  
  	spin_lock_irqsave(q->queue_lock, flags);
  	__blk_run_queue(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
427
428
429
  	spin_unlock_irqrestore(q->queue_lock, flags);
  }
  EXPORT_SYMBOL(blk_run_queue);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
430
  void blk_put_queue(struct request_queue *q)
483f4afc4   Al Viro   [PATCH] fix sysfs...
431
432
433
  {
  	kobject_put(&q->kobj);
  }
483f4afc4   Al Viro   [PATCH] fix sysfs...
434

6728cb0e6   Jens Axboe   block: make core ...
435
  void blk_cleanup_queue(struct request_queue *q)
483f4afc4   Al Viro   [PATCH] fix sysfs...
436
  {
e3335de94   Jens Axboe   block: blk_cleanu...
437
438
439
440
441
442
443
  	/*
  	 * We know we have process context here, so we can be a little
  	 * cautious and ensure that pending block actions on this device
  	 * are done before moving on. Going into this function, we should
  	 * not have processes doing IO to this device.
  	 */
  	blk_sync_queue(q);
483f4afc4   Al Viro   [PATCH] fix sysfs...
444
  	mutex_lock(&q->sysfs_lock);
75ad23bc0   Nick Piggin   block: make queue...
445
  	queue_flag_set_unlocked(QUEUE_FLAG_DEAD, q);
483f4afc4   Al Viro   [PATCH] fix sysfs...
446
447
448
449
450
451
452
  	mutex_unlock(&q->sysfs_lock);
  
  	if (q->elevator)
  		elevator_exit(q->elevator);
  
  	blk_put_queue(q);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
  EXPORT_SYMBOL(blk_cleanup_queue);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
454
  static int blk_init_free_list(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
455
456
  {
  	struct request_list *rl = &q->rq;
1faa16d22   Jens Axboe   block: change the...
457
458
  	rl->count[BLK_RW_SYNC] = rl->count[BLK_RW_ASYNC] = 0;
  	rl->starved[BLK_RW_SYNC] = rl->starved[BLK_RW_ASYNC] = 0;
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
459
  	rl->elvpriv = 0;
1faa16d22   Jens Axboe   block: change the...
460
461
  	init_waitqueue_head(&rl->wait[BLK_RW_SYNC]);
  	init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462

1946089a1   Christoph Lameter   [PATCH] NUMA awar...
463
464
  	rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, mempool_alloc_slab,
  				mempool_free_slab, request_cachep, q->node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465
466
467
468
469
470
  
  	if (!rl->rq_pool)
  		return -ENOMEM;
  
  	return 0;
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
471
  struct request_queue *blk_alloc_queue(gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
472
  {
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
473
474
475
  	return blk_alloc_queue_node(gfp_mask, -1);
  }
  EXPORT_SYMBOL(blk_alloc_queue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
476

165125e1e   Jens Axboe   [BLOCK] Get rid o...
477
  struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
478
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
479
  	struct request_queue *q;
e0bf68dde   Peter Zijlstra   mm: bdi init hooks
480
  	int err;
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
481

8324aa91d   Jens Axboe   block: split tag ...
482
  	q = kmem_cache_alloc_node(blk_requestq_cachep,
94f6030ca   Christoph Lameter   Slab allocators: ...
483
  				gfp_mask | __GFP_ZERO, node_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
485
  	if (!q)
  		return NULL;
e0bf68dde   Peter Zijlstra   mm: bdi init hooks
486
487
488
489
  	q->backing_dev_info.unplug_io_fn = blk_backing_dev_unplug;
  	q->backing_dev_info.unplug_io_data = q;
  	err = bdi_init(&q->backing_dev_info);
  	if (err) {
8324aa91d   Jens Axboe   block: split tag ...
490
  		kmem_cache_free(blk_requestq_cachep, q);
e0bf68dde   Peter Zijlstra   mm: bdi init hooks
491
492
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
  	init_timer(&q->unplug_timer);
242f9dcb8   Jens Axboe   block: unify requ...
494
495
  	setup_timer(&q->timeout, blk_rq_timed_out_timer, (unsigned long) q);
  	INIT_LIST_HEAD(&q->timeout_list);
713ada9ba   Peter Zijlstra   block: move q->un...
496
  	INIT_WORK(&q->unplug_work, blk_unplug_work);
483f4afc4   Al Viro   [PATCH] fix sysfs...
497

8324aa91d   Jens Axboe   block: split tag ...
498
  	kobject_init(&q->kobj, &blk_queue_ktype);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499

483f4afc4   Al Viro   [PATCH] fix sysfs...
500
  	mutex_init(&q->sysfs_lock);
e7e72bf64   Neil Brown   Remove blkdev war...
501
  	spin_lock_init(&q->__queue_lock);
483f4afc4   Al Viro   [PATCH] fix sysfs...
502

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
  	return q;
  }
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
505
  EXPORT_SYMBOL(blk_alloc_queue_node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
  
  /**
   * blk_init_queue  - prepare a request queue for use with a block device
   * @rfn:  The function to be called to process requests that have been
   *        placed on the queue.
   * @lock: Request queue spin lock
   *
   * Description:
   *    If a block device wishes to use the standard request handling procedures,
   *    which sorts requests and coalesces adjacent requests, then it must
   *    call blk_init_queue().  The function @rfn will be called when there
   *    are requests on the queue that need to be processed.  If the device
   *    supports plugging, then @rfn may not be called immediately when requests
   *    are available on the queue, but may be called at some time later instead.
   *    Plugged queues are generally unplugged when a buffer belonging to one
   *    of the requests on the queue is needed, or due to memory pressure.
   *
   *    @rfn is not required, or even expected, to remove all requests off the
   *    queue, but only as many as it can handle at a time.  If it does leave
   *    requests on the queue, it is responsible for arranging that the requests
   *    get dealt with eventually.
   *
   *    The queue spin lock must be held while manipulating the requests on the
a038e2536   Paolo 'Blaisorblade' Giarrusso   [PATCH] blk_start...
529
530
   *    request queue; this lock will be taken also from interrupt context, so irq
   *    disabling is needed for it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
   *
710027a48   Randy Dunlap   Add some block/ s...
532
   *    Function returns a pointer to the initialized request queue, or %NULL if
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
536
537
538
   *    it didn't succeed.
   *
   * Note:
   *    blk_init_queue() must be paired with a blk_cleanup_queue() call
   *    when the block device is deactivated (such as at module unload).
   **/
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
539

165125e1e   Jens Axboe   [BLOCK] Get rid o...
540
  struct request_queue *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
  {
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
542
543
544
  	return blk_init_queue_node(rfn, lock, -1);
  }
  EXPORT_SYMBOL(blk_init_queue);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
545
  struct request_queue *
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
546
547
  blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
548
  	struct request_queue *q = blk_alloc_queue_node(GFP_KERNEL, node_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
550
551
  
  	if (!q)
  		return NULL;
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
552
  	q->node = node_id;
8669aafdb   Al Viro   [PATCH] fix doubl...
553
  	if (blk_init_free_list(q)) {
8324aa91d   Jens Axboe   block: split tag ...
554
  		kmem_cache_free(blk_requestq_cachep, q);
8669aafdb   Al Viro   [PATCH] fix doubl...
555
556
  		return NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557

152587deb   Jens Axboe   [PATCH] fix NMI l...
558
559
560
561
  	/*
  	 * if caller didn't supply a lock, they get per-queue locking with
  	 * our embedded lock
  	 */
e7e72bf64   Neil Brown   Remove blkdev war...
562
  	if (!lock)
152587deb   Jens Axboe   [PATCH] fix NMI l...
563
  		lock = &q->__queue_lock;
152587deb   Jens Axboe   [PATCH] fix NMI l...
564

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565
  	q->request_fn		= rfn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
567
  	q->prep_rq_fn		= NULL;
  	q->unplug_fn		= generic_unplug_device;
bc58ba946   Jens Axboe   block: add sysfs ...
568
  	q->queue_flags		= QUEUE_FLAG_DEFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
  	q->queue_lock		= lock;
f3b144aa7   Jens Axboe   block: remove var...
570
571
572
  	/*
  	 * This also sets hw/phys segments, boundary and size
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
  	blk_queue_make_request(q, __make_request);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574

44ec95425   Alan Stern   [SCSI] sg: cap re...
575
  	q->sg_reserved_size = INT_MAX;
abf543937   FUJITA Tomonori   block: move cmdfi...
576
  	blk_set_cmd_filter_defaults(&q->cmd_filter);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
578
579
580
581
582
583
  	/*
  	 * all done
  	 */
  	if (!elevator_init(q, NULL)) {
  		blk_queue_congestion_threshold(q);
  		return q;
  	}
8669aafdb   Al Viro   [PATCH] fix doubl...
584
  	blk_put_queue(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
585
586
  	return NULL;
  }
1946089a1   Christoph Lameter   [PATCH] NUMA awar...
587
  EXPORT_SYMBOL(blk_init_queue_node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588

165125e1e   Jens Axboe   [BLOCK] Get rid o...
589
  int blk_get_queue(struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
  {
fde6ad224   Nick Piggin   [PATCH] blk: bran...
591
  	if (likely(!test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) {
483f4afc4   Al Viro   [PATCH] fix sysfs...
592
  		kobject_get(&q->kobj);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
594
595
596
597
  		return 0;
  	}
  
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
598

165125e1e   Jens Axboe   [BLOCK] Get rid o...
599
  static inline void blk_free_request(struct request_queue *q, struct request *rq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
600
  {
4aff5e233   Jens Axboe   [PATCH] Split str...
601
  	if (rq->cmd_flags & REQ_ELVPRIV)
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
602
  		elv_put_request(q, rq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
604
  	mempool_free(rq, q->rq.rq_pool);
  }
1ea25ecb7   Jens Axboe   [PATCH] Audit blo...
605
  static struct request *
42dad7647   Jerome Marchand   block: simplify I...
606
  blk_alloc_request(struct request_queue *q, int flags, int priv, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
608
609
610
611
  {
  	struct request *rq = mempool_alloc(q->rq.rq_pool, gfp_mask);
  
  	if (!rq)
  		return NULL;
2a4aa30c5   FUJITA Tomonori   block: rename and...
612
  	blk_rq_init(q, rq);
1afb20f30   FUJITA Tomonori   block: make rq_in...
613

42dad7647   Jerome Marchand   block: simplify I...
614
  	rq->cmd_flags = flags | REQ_ALLOCED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615

cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
616
  	if (priv) {
cb78b285c   Jens Axboe   [PATCH] Drop usel...
617
  		if (unlikely(elv_set_request(q, rq, gfp_mask))) {
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
618
619
620
  			mempool_free(rq, q->rq.rq_pool);
  			return NULL;
  		}
4aff5e233   Jens Axboe   [PATCH] Split str...
621
  		rq->cmd_flags |= REQ_ELVPRIV;
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
622
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
623

cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
624
  	return rq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
625
626
627
628
629
630
  }
  
  /*
   * ioc_batching returns true if the ioc is a valid batching request and
   * should be given priority access to a request.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
631
  static inline int ioc_batching(struct request_queue *q, struct io_context *ioc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
  {
  	if (!ioc)
  		return 0;
  
  	/*
  	 * Make sure the process is able to allocate at least 1 request
  	 * even if the batch times out, otherwise we could theoretically
  	 * lose wakeups.
  	 */
  	return ioc->nr_batch_requests == q->nr_batching ||
  		(ioc->nr_batch_requests > 0
  		&& time_before(jiffies, ioc->last_waited + BLK_BATCH_TIME));
  }
  
  /*
   * ioc_set_batching sets ioc to be a new "batcher" if it is not one. This
   * will cause the process to be a "batcher" on all queues in the system. This
   * is the behaviour we want though - once it gets a wakeup it should be given
   * a nice run.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
652
  static void ioc_set_batching(struct request_queue *q, struct io_context *ioc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
655
656
657
658
659
  {
  	if (!ioc || ioc_batching(q, ioc))
  		return;
  
  	ioc->nr_batch_requests = q->nr_batching;
  	ioc->last_waited = jiffies;
  }
1faa16d22   Jens Axboe   block: change the...
660
  static void __freed_request(struct request_queue *q, int sync)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
661
662
  {
  	struct request_list *rl = &q->rq;
1faa16d22   Jens Axboe   block: change the...
663
664
  	if (rl->count[sync] < queue_congestion_off_threshold(q))
  		blk_clear_queue_congested(q, sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665

1faa16d22   Jens Axboe   block: change the...
666
667
668
  	if (rl->count[sync] + 1 <= q->nr_requests) {
  		if (waitqueue_active(&rl->wait[sync]))
  			wake_up(&rl->wait[sync]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669

1faa16d22   Jens Axboe   block: change the...
670
  		blk_clear_queue_full(q, sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
672
673
674
675
676
677
  	}
  }
  
  /*
   * A request has just been released.  Account for it, update the full and
   * congestion status, wake up any waiters.   Called under q->queue_lock.
   */
1faa16d22   Jens Axboe   block: change the...
678
  static void freed_request(struct request_queue *q, int sync, int priv)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679
680
  {
  	struct request_list *rl = &q->rq;
1faa16d22   Jens Axboe   block: change the...
681
  	rl->count[sync]--;
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
682
683
  	if (priv)
  		rl->elvpriv--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684

1faa16d22   Jens Axboe   block: change the...
685
  	__freed_request(q, sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
686

1faa16d22   Jens Axboe   block: change the...
687
688
  	if (unlikely(rl->starved[sync ^ 1]))
  		__freed_request(q, sync ^ 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690
  /*
d6344532a   Nick Piggin   [PATCH] blk: redu...
691
692
693
   * Get a free request, queue_lock must be held.
   * Returns NULL on failure, with queue_lock held.
   * Returns !NULL on success, with queue_lock *not held*.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
695
  static struct request *get_request(struct request_queue *q, int rw_flags,
7749a8d42   Jens Axboe   [PATCH] Propagate...
696
  				   struct bio *bio, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
698
699
  {
  	struct request *rq = NULL;
  	struct request_list *rl = &q->rq;
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
700
  	struct io_context *ioc = NULL;
1faa16d22   Jens Axboe   block: change the...
701
  	const bool is_sync = rw_is_sync(rw_flags) != 0;
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
702
  	int may_queue, priv;
7749a8d42   Jens Axboe   [PATCH] Propagate...
703
  	may_queue = elv_may_queue(q, rw_flags);
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
704
705
  	if (may_queue == ELV_MQUEUE_NO)
  		goto rq_starved;
1faa16d22   Jens Axboe   block: change the...
706
707
  	if (rl->count[is_sync]+1 >= queue_congestion_on_threshold(q)) {
  		if (rl->count[is_sync]+1 >= q->nr_requests) {
b5deef901   Jens Axboe   [PATCH] Make sure...
708
  			ioc = current_io_context(GFP_ATOMIC, q->node);
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
709
710
711
712
713
714
  			/*
  			 * The queue will fill after this allocation, so set
  			 * it as full, and mark this process as "batching".
  			 * This process will be allowed to complete a batch of
  			 * requests, others will be blocked.
  			 */
1faa16d22   Jens Axboe   block: change the...
715
  			if (!blk_queue_full(q, is_sync)) {
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
716
  				ioc_set_batching(q, ioc);
1faa16d22   Jens Axboe   block: change the...
717
  				blk_set_queue_full(q, is_sync);
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
718
719
720
721
722
723
724
725
726
727
728
  			} else {
  				if (may_queue != ELV_MQUEUE_MUST
  						&& !ioc_batching(q, ioc)) {
  					/*
  					 * The queue is full and the allocating
  					 * process is not a "batcher", and not
  					 * exempted by the IO scheduler
  					 */
  					goto out;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
  		}
1faa16d22   Jens Axboe   block: change the...
730
  		blk_set_queue_congested(q, is_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
731
  	}
082cf69eb   Jens Axboe   [PATCH] ll_rw_blk...
732
733
734
735
736
  	/*
  	 * Only allow batching queuers to allocate up to 50% over the defined
  	 * limit of requests, otherwise we could have thousands of requests
  	 * allocated with any setting of ->nr_requests
  	 */
1faa16d22   Jens Axboe   block: change the...
737
  	if (rl->count[is_sync] >= (3 * q->nr_requests / 2))
082cf69eb   Jens Axboe   [PATCH] ll_rw_blk...
738
  		goto out;
fd782a4a9   Hugh Dickins   [PATCH] Fix get_r...
739

1faa16d22   Jens Axboe   block: change the...
740
741
  	rl->count[is_sync]++;
  	rl->starved[is_sync] = 0;
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
742

64521d1a3   Jens Axboe   [BLOCK] elevator ...
743
  	priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
cb98fc8bb   Tejun Heo   [BLOCK] Reimpleme...
744
745
  	if (priv)
  		rl->elvpriv++;
42dad7647   Jerome Marchand   block: simplify I...
746
747
  	if (blk_queue_io_stat(q))
  		rw_flags |= REQ_IO_STAT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
  	spin_unlock_irq(q->queue_lock);
7749a8d42   Jens Axboe   [PATCH] Propagate...
749
  	rq = blk_alloc_request(q, rw_flags, priv, gfp_mask);
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
750
  	if (unlikely(!rq)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751
752
753
754
755
756
757
758
  		/*
  		 * Allocation failed presumably due to memory. Undo anything
  		 * we might have messed up.
  		 *
  		 * Allocating task should really be put onto the front of the
  		 * wait queue, but this is pretty rare.
  		 */
  		spin_lock_irq(q->queue_lock);
1faa16d22   Jens Axboe   block: change the...
759
  		freed_request(q, is_sync, priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
760
761
762
763
764
765
766
767
768
  
  		/*
  		 * in the very unlikely event that allocation failed and no
  		 * requests for this direction was pending, mark us starved
  		 * so that freeing of a request in the other direction will
  		 * notice us. another possible fix would be to split the
  		 * rq mempool into READ and WRITE
  		 */
  rq_starved:
1faa16d22   Jens Axboe   block: change the...
769
770
  		if (unlikely(rl->count[is_sync] == 0))
  			rl->starved[is_sync] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
771

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
  		goto out;
  	}
88ee5ef15   Jens Axboe   [BLOCK] ll_rw_blk...
774
775
776
777
778
779
  	/*
  	 * ioc may be NULL here, and ioc_batching will be false. That's
  	 * OK, if the queue is under the request limit then requests need
  	 * not count toward the nr_batch_requests limit. There will always
  	 * be some limit enforced by BLK_BATCH_TIME.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
  	if (ioc_batching(q, ioc))
  		ioc->nr_batch_requests--;
6728cb0e6   Jens Axboe   block: make core ...
782

1faa16d22   Jens Axboe   block: change the...
783
  	trace_block_getrq(q, bio, rw_flags & 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
786
787
788
789
790
  	return rq;
  }
  
  /*
   * No available requests for this queue, unplug the device and wait for some
   * requests to become available.
d6344532a   Nick Piggin   [PATCH] blk: redu...
791
792
   *
   * Called with q->queue_lock held, and returns with it unlocked.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
794
  static struct request *get_request_wait(struct request_queue *q, int rw_flags,
22e2c507c   Jens Axboe   [PATCH] Update cf...
795
  					struct bio *bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
  {
1faa16d22   Jens Axboe   block: change the...
797
  	const bool is_sync = rw_is_sync(rw_flags) != 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  	struct request *rq;
7749a8d42   Jens Axboe   [PATCH] Propagate...
799
  	rq = get_request(q, rw_flags, bio, GFP_NOIO);
450991bc1   Nick Piggin   [PATCH] blk: __ma...
800
801
  	while (!rq) {
  		DEFINE_WAIT(wait);
05caf8dbc   Zhang, Yanmin   block: Move the s...
802
  		struct io_context *ioc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
803
  		struct request_list *rl = &q->rq;
1faa16d22   Jens Axboe   block: change the...
804
  		prepare_to_wait_exclusive(&rl->wait[is_sync], &wait,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805
  				TASK_UNINTERRUPTIBLE);
1faa16d22   Jens Axboe   block: change the...
806
  		trace_block_sleeprq(q, bio, rw_flags & 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807

05caf8dbc   Zhang, Yanmin   block: Move the s...
808
809
810
  		__generic_unplug_device(q);
  		spin_unlock_irq(q->queue_lock);
  		io_schedule();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811

05caf8dbc   Zhang, Yanmin   block: Move the s...
812
813
814
815
816
817
818
819
  		/*
  		 * After sleeping, we become a "batching" process and
  		 * will be able to allocate at least one request, and
  		 * up to a big batch of them for a small period time.
  		 * See ioc_batching, ioc_set_batching
  		 */
  		ioc = current_io_context(GFP_NOIO, q->node);
  		ioc_set_batching(q, ioc);
d6344532a   Nick Piggin   [PATCH] blk: redu...
820

05caf8dbc   Zhang, Yanmin   block: Move the s...
821
  		spin_lock_irq(q->queue_lock);
1faa16d22   Jens Axboe   block: change the...
822
  		finish_wait(&rl->wait[is_sync], &wait);
05caf8dbc   Zhang, Yanmin   block: Move the s...
823
824
825
  
  		rq = get_request(q, rw_flags, bio, GFP_NOIO);
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
826
827
828
  
  	return rq;
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
829
  struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830
831
832
833
  {
  	struct request *rq;
  
  	BUG_ON(rw != READ && rw != WRITE);
d6344532a   Nick Piggin   [PATCH] blk: redu...
834
835
  	spin_lock_irq(q->queue_lock);
  	if (gfp_mask & __GFP_WAIT) {
22e2c507c   Jens Axboe   [PATCH] Update cf...
836
  		rq = get_request_wait(q, rw, NULL);
d6344532a   Nick Piggin   [PATCH] blk: redu...
837
  	} else {
22e2c507c   Jens Axboe   [PATCH] Update cf...
838
  		rq = get_request(q, rw, NULL, gfp_mask);
d6344532a   Nick Piggin   [PATCH] blk: redu...
839
840
841
842
  		if (!rq)
  			spin_unlock_irq(q->queue_lock);
  	}
  	/* q->queue_lock is unlocked at this point */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
844
845
  
  	return rq;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
846
847
848
849
850
851
852
853
854
855
856
857
  EXPORT_SYMBOL(blk_get_request);
  
  /**
   * blk_requeue_request - put a request back on queue
   * @q:		request queue where request should be inserted
   * @rq:		request to be inserted
   *
   * Description:
   *    Drivers often keep queueing requests until the hardware cannot accept
   *    more, when that condition happens we need to put the request back
   *    on the queue. Must be called with queue lock held.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
858
  void blk_requeue_request(struct request_queue *q, struct request *rq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
859
  {
242f9dcb8   Jens Axboe   block: unify requ...
860
861
  	blk_delete_timer(rq);
  	blk_clear_rq_complete(rq);
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
862
  	trace_block_rq_requeue(q, rq);
2056a782f   Jens Axboe   [PATCH] Block que...
863

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864
865
866
867
868
  	if (blk_rq_tagged(rq))
  		blk_queue_end_tag(q, rq);
  
  	elv_requeue_request(q, rq);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
870
871
  EXPORT_SYMBOL(blk_requeue_request);
  
  /**
710027a48   Randy Dunlap   Add some block/ s...
872
   * blk_insert_request - insert a special request into a request queue
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
873
874
875
876
   * @q:		request queue where request should be inserted
   * @rq:		request to be inserted
   * @at_head:	insert request at head or tail of queue
   * @data:	private data
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
877
878
879
880
881
   *
   * Description:
   *    Many block devices need to execute commands asynchronously, so they don't
   *    block the whole kernel from preemption during request execution.  This is
   *    accomplished normally by inserting aritficial requests tagged as
710027a48   Randy Dunlap   Add some block/ s...
882
883
   *    REQ_TYPE_SPECIAL in to the corresponding request queue, and letting them
   *    be scheduled for actual execution by the request queue.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
885
886
887
888
889
   *
   *    We have the option of inserting the head or the tail of the queue.
   *    Typically we use the tail for new ioctls and so forth.  We use the head
   *    of the queue for things like a QUEUE_FULL message from a device, or a
   *    host that is unable to accept a particular command.
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
890
  void blk_insert_request(struct request_queue *q, struct request *rq,
867d1191f   Tejun Heo   [SCSI] remove req...
891
  			int at_head, void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
  {
867d1191f   Tejun Heo   [SCSI] remove req...
893
  	int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
894
895
896
897
898
899
900
  	unsigned long flags;
  
  	/*
  	 * tell I/O scheduler that this isn't a regular read/write (ie it
  	 * must not attempt merges on this) and that it acts as a soft
  	 * barrier
  	 */
4aff5e233   Jens Axboe   [PATCH] Split str...
901
  	rq->cmd_type = REQ_TYPE_SPECIAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
903
904
905
906
907
908
909
  
  	rq->special = data;
  
  	spin_lock_irqsave(q->queue_lock, flags);
  
  	/*
  	 * If command is tagged, release the tag
  	 */
867d1191f   Tejun Heo   [SCSI] remove req...
910
911
  	if (blk_rq_tagged(rq))
  		blk_queue_end_tag(q, rq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912

b238b3d4b   Jerome Marchand   block layer: remo...
913
  	drive_stat_acct(rq, 1);
867d1191f   Tejun Heo   [SCSI] remove req...
914
  	__elv_add_request(q, rq, where, 0);
a7f557923   Tejun Heo   block: kill blk_s...
915
  	__blk_run_queue(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916
917
  	spin_unlock_irqrestore(q->queue_lock, flags);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  EXPORT_SYMBOL(blk_insert_request);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
923
  /*
   * add-request adds a request to the linked list.
   * queue lock is held and interrupts disabled, as we muck with the
   * request queue list.
   */
6728cb0e6   Jens Axboe   block: make core ...
924
  static inline void add_request(struct request_queue *q, struct request *req)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
  {
b238b3d4b   Jerome Marchand   block layer: remo...
926
  	drive_stat_acct(req, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
929
930
931
932
933
  	/*
  	 * elevator indicated where it wants this request to be
  	 * inserted at elevator_merge time
  	 */
  	__elv_add_request(q, req, ELEVATOR_INSERT_SORT, 0);
  }
6728cb0e6   Jens Axboe   block: make core ...
934

074a7aca7   Tejun Heo   block: move stats...
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
  static void part_round_stats_single(int cpu, struct hd_struct *part,
  				    unsigned long now)
  {
  	if (now == part->stamp)
  		return;
  
  	if (part->in_flight) {
  		__part_stat_add(cpu, part, time_in_queue,
  				part->in_flight * (now - part->stamp));
  		__part_stat_add(cpu, part, io_ticks, (now - part->stamp));
  	}
  	part->stamp = now;
  }
  
  /**
496aa8a98   Randy Dunlap   block: fix curren...
950
951
952
   * part_round_stats() - Round off the performance stats on a struct disk_stats.
   * @cpu: cpu number for stats access
   * @part: target partition
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
955
956
957
958
959
960
961
962
963
964
   *
   * The average IO queue length and utilisation statistics are maintained
   * by observing the current state of the queue length and the amount of
   * time it has been in this state for.
   *
   * Normally, that accounting is done on IO completion, but that can result
   * in more than a second's worth of IO being accounted for within any one
   * second, leading to >100% utilisation.  To deal with that, we call this
   * function to do a round-off before returning the results when reading
   * /proc/diskstats.  This accounts immediately for all queue usage up to
   * the current jiffies and restarts the counters again.
   */
c99590591   Tejun Heo   block: fix diskst...
965
  void part_round_stats(int cpu, struct hd_struct *part)
6f2576af5   Jerome Marchand   Enhanced partitio...
966
967
  {
  	unsigned long now = jiffies;
074a7aca7   Tejun Heo   block: move stats...
968
969
970
  	if (part->partno)
  		part_round_stats_single(cpu, &part_to_disk(part)->part0, now);
  	part_round_stats_single(cpu, part, now);
6f2576af5   Jerome Marchand   Enhanced partitio...
971
  }
074a7aca7   Tejun Heo   block: move stats...
972
  EXPORT_SYMBOL_GPL(part_round_stats);
6f2576af5   Jerome Marchand   Enhanced partitio...
973

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
974
975
976
  /*
   * queue lock must be held
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
977
  void __blk_put_request(struct request_queue *q, struct request *req)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
978
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
980
981
982
  	if (unlikely(!q))
  		return;
  	if (unlikely(--req->ref_count))
  		return;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
983
  	elv_completed_request(q, req);
1cd96c242   Boaz Harrosh   block: WARN in __...
984
985
  	/* this is a bio leak */
  	WARN_ON(req->bio != NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
987
988
989
  	/*
  	 * Request may not have originated from ll_rw_blk. if not,
  	 * it didn't come out of our reserved rq pools
  	 */
49171e5c6   Jens Axboe   [PATCH] Remove st...
990
  	if (req->cmd_flags & REQ_ALLOCED) {
1faa16d22   Jens Axboe   block: change the...
991
  		int is_sync = rq_is_sync(req) != 0;
4aff5e233   Jens Axboe   [PATCH] Split str...
992
  		int priv = req->cmd_flags & REQ_ELVPRIV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
994
  		BUG_ON(!list_empty(&req->queuelist));
9817064b6   Jens Axboe   [PATCH] elevator:...
995
  		BUG_ON(!hlist_unhashed(&req->hash));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
997
  
  		blk_free_request(q, req);
1faa16d22   Jens Axboe   block: change the...
998
  		freed_request(q, is_sync, priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
1000
  	}
  }
6e39b69e7   Mike Christie   [SCSI] export blk...
1001
  EXPORT_SYMBOL_GPL(__blk_put_request);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
  void blk_put_request(struct request *req)
  {
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
1004
  	unsigned long flags;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1005
  	struct request_queue *q = req->q;
8922e16cf   Tejun Heo   [PATCH] 01/05 Imp...
1006

52a93ba81   FUJITA Tomonori   block: remove the...
1007
1008
1009
  	spin_lock_irqsave(q->queue_lock, flags);
  	__blk_put_request(q, req);
  	spin_unlock_irqrestore(q->queue_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
  EXPORT_SYMBOL(blk_put_request);
86db1e297   Jens Axboe   block: continue l...
1012
  void init_request_from_bio(struct request *req, struct bio *bio)
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1013
  {
c7c22e4d5   Jens Axboe   block: add suppor...
1014
  	req->cpu = bio->bi_comp_cpu;
4aff5e233   Jens Axboe   [PATCH] Split str...
1015
  	req->cmd_type = REQ_TYPE_FS;
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1016
1017
1018
1019
  
  	/*
  	 * inherit FAILFAST from bio (for read-ahead, and explicit FAILFAST)
  	 */
6000a368c   Mike Christie   [SCSI] block: sep...
1020
1021
1022
1023
1024
1025
1026
1027
1028
  	if (bio_rw_ahead(bio))
  		req->cmd_flags |= (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
  				   REQ_FAILFAST_DRIVER);
  	if (bio_failfast_dev(bio))
  		req->cmd_flags |= REQ_FAILFAST_DEV;
  	if (bio_failfast_transport(bio))
  		req->cmd_flags |= REQ_FAILFAST_TRANSPORT;
  	if (bio_failfast_driver(bio))
  		req->cmd_flags |= REQ_FAILFAST_DRIVER;
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1029

fb2dce862   David Woodhouse   Add 'discard' req...
1030
  	if (unlikely(bio_discard(bio))) {
e17fc0a1c   David Woodhouse   Allow elevators t...
1031
1032
1033
  		req->cmd_flags |= REQ_DISCARD;
  		if (bio_barrier(bio))
  			req->cmd_flags |= REQ_SOFTBARRIER;
fb2dce862   David Woodhouse   Add 'discard' req...
1034
  		req->q->prepare_discard_fn(req->q, req);
e17fc0a1c   David Woodhouse   Allow elevators t...
1035
  	} else if (unlikely(bio_barrier(bio)))
e4025f6c2   Tejun Heo   block: don't set ...
1036
  		req->cmd_flags |= REQ_HARDBARRIER;
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1037

b31dc66a5   Jens Axboe   [PATCH] Kill PF_S...
1038
  	if (bio_sync(bio))
4aff5e233   Jens Axboe   [PATCH] Split str...
1039
  		req->cmd_flags |= REQ_RW_SYNC;
5404bc7a8   Jens Axboe   [PATCH] Allow fil...
1040
1041
  	if (bio_rw_meta(bio))
  		req->cmd_flags |= REQ_RW_META;
aeb6fafb8   Jens Axboe   block: Add flag f...
1042
1043
  	if (bio_noidle(bio))
  		req->cmd_flags |= REQ_NOIDLE;
b31dc66a5   Jens Axboe   [PATCH] Kill PF_S...
1044

52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1045
1046
  	req->errors = 0;
  	req->hard_sector = req->sector = bio->bi_sector;
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1047
  	req->ioprio = bio_prio(bio);
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1048
  	req->start_time = jiffies;
bc1c56fde   NeilBrown   Share code betwee...
1049
  	blk_rq_bio_prep(req->q, req, bio);
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1050
  }
644b2d99b   Jens Axboe   block: enabling p...
1051
1052
1053
1054
1055
1056
1057
1058
  /*
   * Only disabling plugging for non-rotational devices if it does tagging
   * as well, otherwise we do need the proper merging
   */
  static inline bool queue_should_plug(struct request_queue *q)
  {
  	return !(blk_queue_nonrot(q) && blk_queue_tagged(q));
  }
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1059
  static int __make_request(struct request_queue *q, struct bio *bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
  {
450991bc1   Nick Piggin   [PATCH] blk: __ma...
1061
  	struct request *req;
a7384677b   Tejun Heo   block: remove dup...
1062
  	int el_ret, nr_sectors;
51da90fcb   Jens Axboe   [PATCH] ll_rw_blk...
1063
1064
  	const unsigned short prio = bio_prio(bio);
  	const int sync = bio_sync(bio);
213d9417f   Jens Axboe   block: seperate b...
1065
  	const int unplug = bio_unplug(bio);
7749a8d42   Jens Axboe   [PATCH] Propagate...
1066
  	int rw_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
  	nr_sectors = bio_sectors(bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1069
1070
1071
1072
1073
1074
1075
  
  	/*
  	 * low level driver can indicate that it wants pages above a
  	 * certain limit bounced to low memory (ie for highmem, or even
  	 * ISA dma in theory)
  	 */
  	blk_queue_bounce(q, &bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1076
  	spin_lock_irq(q->queue_lock);
a7384677b   Tejun Heo   block: remove dup...
1077
  	if (unlikely(bio_barrier(bio)) || elv_queue_empty(q))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1078
1079
1080
1081
  		goto get_rq;
  
  	el_ret = elv_merge(q, &req, bio);
  	switch (el_ret) {
6728cb0e6   Jens Axboe   block: make core ...
1082
1083
  	case ELEVATOR_BACK_MERGE:
  		BUG_ON(!rq_mergeable(req));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084

6728cb0e6   Jens Axboe   block: make core ...
1085
1086
  		if (!ll_back_merge_fn(q, req, bio))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1088
  		trace_block_bio_backmerge(q, bio);
2056a782f   Jens Axboe   [PATCH] Block que...
1089

6728cb0e6   Jens Axboe   block: make core ...
1090
1091
1092
1093
  		req->biotail->bi_next = bio;
  		req->biotail = bio;
  		req->nr_sectors = req->hard_nr_sectors += nr_sectors;
  		req->ioprio = ioprio_best(req->ioprio, prio);
ab780f1ec   Jens Axboe   block: inherit CP...
1094
1095
  		if (!blk_rq_cpu_valid(req))
  			req->cpu = bio->bi_comp_cpu;
6728cb0e6   Jens Axboe   block: make core ...
1096
1097
1098
1099
  		drive_stat_acct(req, 0);
  		if (!attempt_back_merge(q, req))
  			elv_merged_request(q, req, el_ret);
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1100

6728cb0e6   Jens Axboe   block: make core ...
1101
1102
  	case ELEVATOR_FRONT_MERGE:
  		BUG_ON(!rq_mergeable(req));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1103

6728cb0e6   Jens Axboe   block: make core ...
1104
1105
  		if (!ll_front_merge_fn(q, req, bio))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1107
  		trace_block_bio_frontmerge(q, bio);
2056a782f   Jens Axboe   [PATCH] Block que...
1108

6728cb0e6   Jens Axboe   block: make core ...
1109
1110
  		bio->bi_next = req->bio;
  		req->bio = bio;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1111

6728cb0e6   Jens Axboe   block: make core ...
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
  		/*
  		 * may not be valid. if the low level driver said
  		 * it didn't need a bounce buffer then it better
  		 * not touch req->buffer either...
  		 */
  		req->buffer = bio_data(bio);
  		req->current_nr_sectors = bio_cur_sectors(bio);
  		req->hard_cur_sectors = req->current_nr_sectors;
  		req->sector = req->hard_sector = bio->bi_sector;
  		req->nr_sectors = req->hard_nr_sectors += nr_sectors;
  		req->ioprio = ioprio_best(req->ioprio, prio);
ab780f1ec   Jens Axboe   block: inherit CP...
1123
1124
  		if (!blk_rq_cpu_valid(req))
  			req->cpu = bio->bi_comp_cpu;
6728cb0e6   Jens Axboe   block: make core ...
1125
1126
1127
1128
1129
1130
1131
1132
  		drive_stat_acct(req, 0);
  		if (!attempt_front_merge(q, req))
  			elv_merged_request(q, req, el_ret);
  		goto out;
  
  	/* ELV_NO_MERGE: elevator says don't/can't merge. */
  	default:
  		;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1133
  	}
450991bc1   Nick Piggin   [PATCH] blk: __ma...
1134
  get_rq:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135
  	/*
7749a8d42   Jens Axboe   [PATCH] Propagate...
1136
1137
1138
1139
1140
1141
1142
1143
1144
  	 * This sync check and mask will be re-done in init_request_from_bio(),
  	 * but we need to set it earlier to expose the sync flag to the
  	 * rq allocator and io schedulers.
  	 */
  	rw_flags = bio_data_dir(bio);
  	if (sync)
  		rw_flags |= REQ_RW_SYNC;
  
  	/*
450991bc1   Nick Piggin   [PATCH] blk: __ma...
1145
  	 * Grab a free request. This is might sleep but can not fail.
d6344532a   Nick Piggin   [PATCH] blk: redu...
1146
  	 * Returns with the queue unlocked.
450991bc1   Nick Piggin   [PATCH] blk: __ma...
1147
  	 */
7749a8d42   Jens Axboe   [PATCH] Propagate...
1148
  	req = get_request_wait(q, rw_flags, bio);
d6344532a   Nick Piggin   [PATCH] blk: redu...
1149

450991bc1   Nick Piggin   [PATCH] blk: __ma...
1150
1151
1152
1153
1154
  	/*
  	 * After dropping the lock and possibly sleeping here, our request
  	 * may now be mergeable after it had proven unmergeable (above).
  	 * We don't worry about that case for efficiency. It won't happen
  	 * often, and the elevators are able to handle it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
  	 */
52d9e6753   Tejun Heo   [BLOCK] ll_rw_blk...
1156
  	init_request_from_bio(req, bio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1157

450991bc1   Nick Piggin   [PATCH] blk: __ma...
1158
  	spin_lock_irq(q->queue_lock);
c7c22e4d5   Jens Axboe   block: add suppor...
1159
1160
1161
  	if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) ||
  	    bio_flagged(bio, BIO_CPU_AFFINE))
  		req->cpu = blk_cpu_to_group(smp_processor_id());
644b2d99b   Jens Axboe   block: enabling p...
1162
  	if (queue_should_plug(q) && elv_queue_empty(q))
450991bc1   Nick Piggin   [PATCH] blk: __ma...
1163
  		blk_plug_device(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1164
1165
  	add_request(q, req);
  out:
644b2d99b   Jens Axboe   block: enabling p...
1166
  	if (unplug || !queue_should_plug(q))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1167
  		__generic_unplug_device(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1168
1169
  	spin_unlock_irq(q->queue_lock);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
1173
1174
1175
1176
1177
  }
  
  /*
   * If bio->bi_dev is a partition, remap the location
   */
  static inline void blk_partition_remap(struct bio *bio)
  {
  	struct block_device *bdev = bio->bi_bdev;
bf2de6f5a   Jens Axboe   block: Initial su...
1178
  	if (bio_sectors(bio) && bdev != bdev->bd_contains) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179
  		struct hd_struct *p = bdev->bd_part;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1180
1181
  		bio->bi_sector += p->start_sect;
  		bio->bi_bdev = bdev->bd_contains;
c7149d6bc   Alan D. Brunelle   Fix remap handlin...
1182

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1183
  		trace_block_remap(bdev_get_queue(bio->bi_bdev), bio,
c7149d6bc   Alan D. Brunelle   Fix remap handlin...
1184
1185
  				    bdev->bd_dev, bio->bi_sector,
  				    bio->bi_sector - p->start_sect);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1186
1187
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
  static void handle_bad_sector(struct bio *bio)
  {
  	char b[BDEVNAME_SIZE];
  
  	printk(KERN_INFO "attempt to access beyond end of device
  ");
  	printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu
  ",
  			bdevname(bio->bi_bdev, b),
  			bio->bi_rw,
  			(unsigned long long)bio->bi_sector + bio_sectors(bio),
  			(long long)(bio->bi_bdev->bd_inode->i_size >> 9));
  
  	set_bit(BIO_EOF, &bio->bi_flags);
  }
c17bb4951   Akinobu Mita   [PATCH] fault-inj...
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
  #ifdef CONFIG_FAIL_MAKE_REQUEST
  
  static DECLARE_FAULT_ATTR(fail_make_request);
  
  static int __init setup_fail_make_request(char *str)
  {
  	return setup_fault_attr(&fail_make_request, str);
  }
  __setup("fail_make_request=", setup_fail_make_request);
  
  static int should_fail_request(struct bio *bio)
  {
eddb2e26b   Tejun Heo   block: kill GENHD...
1215
1216
1217
  	struct hd_struct *part = bio->bi_bdev->bd_part;
  
  	if (part_to_disk(part)->part0.make_it_fail || part->make_it_fail)
c17bb4951   Akinobu Mita   [PATCH] fault-inj...
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
  		return should_fail(&fail_make_request, bio->bi_size);
  
  	return 0;
  }
  
  static int __init fail_make_request_debugfs(void)
  {
  	return init_fault_attr_dentries(&fail_make_request,
  					"fail_make_request");
  }
  
  late_initcall(fail_make_request_debugfs);
  
  #else /* CONFIG_FAIL_MAKE_REQUEST */
  
  static inline int should_fail_request(struct bio *bio)
  {
  	return 0;
  }
  
  #endif /* CONFIG_FAIL_MAKE_REQUEST */
c07e2b412   Jens Axboe   block: factor our...
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
  /*
   * Check whether this bio extends beyond the end of the device.
   */
  static inline int bio_check_eod(struct bio *bio, unsigned int nr_sectors)
  {
  	sector_t maxsector;
  
  	if (!nr_sectors)
  		return 0;
  
  	/* Test device or partition size, when known. */
  	maxsector = bio->bi_bdev->bd_inode->i_size >> 9;
  	if (maxsector) {
  		sector_t sector = bio->bi_sector;
  
  		if (maxsector < nr_sectors || maxsector - nr_sectors < sector) {
  			/*
  			 * This may well happen - the kernel calls bread()
  			 * without checking the size of the device, e.g., when
  			 * mounting a device.
  			 */
  			handle_bad_sector(bio);
  			return 1;
  		}
  	}
  
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
  /**
710027a48   Randy Dunlap   Add some block/ s...
1268
   * generic_make_request - hand a buffer to its device driver for I/O
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
   * @bio:  The bio describing the location in memory and on the device.
   *
   * generic_make_request() is used to make I/O requests of block
   * devices. It is passed a &struct bio, which describes the I/O that needs
   * to be done.
   *
   * generic_make_request() does not return any status.  The
   * success/failure status of the request, along with notification of
   * completion, is delivered asynchronously through the bio->bi_end_io
   * function described (one day) else where.
   *
   * The caller of generic_make_request must make sure that bi_io_vec
   * are set to describe the memory buffer, and that bi_dev and bi_sector are
   * set to describe the device address, and the
   * bi_end_io and optionally bi_private are set to describe how
   * completion notification should be signaled.
   *
   * generic_make_request and the drivers it calls may use bi_next if this
   * bio happens to be merged with someone else, and may change bi_dev and
   * bi_sector for remaps as it sees fit.  So the values of these fields
   * should NOT be depended on after the call to generic_make_request.
   */
d89d87965   Neil Brown   When stacked bloc...
1291
  static inline void __generic_make_request(struct bio *bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1292
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1293
  	struct request_queue *q;
5ddfe9691   NeilBrown   [PATCH] md: check...
1294
  	sector_t old_sector;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1295
  	int ret, nr_sectors = bio_sectors(bio);
2056a782f   Jens Axboe   [PATCH] Block que...
1296
  	dev_t old_dev;
51fd77bd9   Jens Axboe   [BLOCK] Don't all...
1297
  	int err = -EIO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
1299
  
  	might_sleep();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1300

c07e2b412   Jens Axboe   block: factor our...
1301
1302
  	if (bio_check_eod(bio, nr_sectors))
  		goto end_io;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1303
1304
1305
1306
1307
1308
1309
1310
1311
  
  	/*
  	 * Resolve the mapping until finished. (drivers are
  	 * still free to implement/resolve their own stacking
  	 * by explicitly returning 0)
  	 *
  	 * NOTE: we don't repeat the blk_size check for each new device.
  	 * Stacking drivers are expected to know what they are doing.
  	 */
5ddfe9691   NeilBrown   [PATCH] md: check...
1312
  	old_sector = -1;
2056a782f   Jens Axboe   [PATCH] Block que...
1313
  	old_dev = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
1315
1316
1317
  	do {
  		char b[BDEVNAME_SIZE];
  
  		q = bdev_get_queue(bio->bi_bdev);
a7384677b   Tejun Heo   block: remove dup...
1318
  		if (unlikely(!q)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1319
1320
1321
1322
1323
1324
  			printk(KERN_ERR
  			       "generic_make_request: Trying to access "
  				"nonexistent block-device %s (%Lu)
  ",
  				bdevname(bio->bi_bdev, b),
  				(long long) bio->bi_sector);
a7384677b   Tejun Heo   block: remove dup...
1325
  			goto end_io;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1326
  		}
4fa253f33   Jens Axboe   block: ll_rw_blk....
1327
  		if (unlikely(nr_sectors > q->max_hw_sectors)) {
6728cb0e6   Jens Axboe   block: make core ...
1328
1329
  			printk(KERN_ERR "bio too big device %s (%u > %u)
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1330
1331
1332
1333
1334
  				bdevname(bio->bi_bdev, b),
  				bio_sectors(bio),
  				q->max_hw_sectors);
  			goto end_io;
  		}
fde6ad224   Nick Piggin   [PATCH] blk: bran...
1335
  		if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1336
  			goto end_io;
c17bb4951   Akinobu Mita   [PATCH] fault-inj...
1337
1338
  		if (should_fail_request(bio))
  			goto end_io;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1339
1340
1341
1342
1343
  		/*
  		 * If this device has partitions, remap block n
  		 * of partition p to block n+start(p) of the disk.
  		 */
  		blk_partition_remap(bio);
7ba1ba12e   Martin K. Petersen   block: Block laye...
1344
1345
  		if (bio_integrity_enabled(bio) && bio_integrity_prep(bio))
  			goto end_io;
5ddfe9691   NeilBrown   [PATCH] md: check...
1346
  		if (old_sector != -1)
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1347
  			trace_block_remap(q, bio, old_dev, bio->bi_sector,
5ddfe9691   NeilBrown   [PATCH] md: check...
1348
  					    old_sector);
2056a782f   Jens Axboe   [PATCH] Block que...
1349

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1350
  		trace_block_bio_queue(q, bio);
2056a782f   Jens Axboe   [PATCH] Block que...
1351

5ddfe9691   NeilBrown   [PATCH] md: check...
1352
  		old_sector = bio->bi_sector;
2056a782f   Jens Axboe   [PATCH] Block que...
1353
  		old_dev = bio->bi_bdev->bd_dev;
c07e2b412   Jens Axboe   block: factor our...
1354
1355
  		if (bio_check_eod(bio, nr_sectors))
  			goto end_io;
a7384677b   Tejun Heo   block: remove dup...
1356
1357
  
  		if (bio_discard(bio) && !q->prepare_discard_fn) {
51fd77bd9   Jens Axboe   [BLOCK] Don't all...
1358
1359
1360
  			err = -EOPNOTSUPP;
  			goto end_io;
  		}
cec0707e4   Jens Axboe   block: silently e...
1361
1362
1363
1364
1365
  		if (bio_barrier(bio) && bio_has_data(bio) &&
  		    (q->next_ordered == QUEUE_ORDERED_NONE)) {
  			err = -EOPNOTSUPP;
  			goto end_io;
  		}
5ddfe9691   NeilBrown   [PATCH] md: check...
1366

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1367
1368
  		ret = q->make_request_fn(q, bio);
  	} while (ret);
a7384677b   Tejun Heo   block: remove dup...
1369
1370
1371
1372
1373
  
  	return;
  
  end_io:
  	bio_endio(bio, err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1374
  }
d89d87965   Neil Brown   When stacked bloc...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
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
  /*
   * We only want one ->make_request_fn to be active at a time,
   * else stack usage with stacked devices could be a problem.
   * So use current->bio_{list,tail} to keep a list of requests
   * submited by a make_request_fn function.
   * current->bio_tail is also used as a flag to say if
   * generic_make_request is currently active in this task or not.
   * If it is NULL, then no make_request is active.  If it is non-NULL,
   * then a make_request is active, and new requests should be added
   * at the tail
   */
  void generic_make_request(struct bio *bio)
  {
  	if (current->bio_tail) {
  		/* make_request is active */
  		*(current->bio_tail) = bio;
  		bio->bi_next = NULL;
  		current->bio_tail = &bio->bi_next;
  		return;
  	}
  	/* following loop may be a bit non-obvious, and so deserves some
  	 * explanation.
  	 * Before entering the loop, bio->bi_next is NULL (as all callers
  	 * ensure that) so we have a list with a single bio.
  	 * We pretend that we have just taken it off a longer list, so
  	 * we assign bio_list to the next (which is NULL) and bio_tail
  	 * to &bio_list, thus initialising the bio_list of new bios to be
  	 * added.  __generic_make_request may indeed add some more bios
  	 * through a recursive call to generic_make_request.  If it
  	 * did, we find a non-NULL value in bio_list and re-enter the loop
  	 * from the top.  In this case we really did just take the bio
  	 * of the top of the list (no pretending) and so fixup bio_list and
  	 * bio_tail or bi_next, and call into __generic_make_request again.
  	 *
  	 * The loop was structured like this to make only one call to
  	 * __generic_make_request (which is important as it is large and
  	 * inlined) and to keep the structure simple.
  	 */
  	BUG_ON(bio->bi_next);
  	do {
  		current->bio_list = bio->bi_next;
  		if (bio->bi_next == NULL)
  			current->bio_tail = &current->bio_list;
  		else
  			bio->bi_next = NULL;
  		__generic_make_request(bio);
  		bio = current->bio_list;
  	} while (bio);
  	current->bio_tail = NULL; /* deactivate */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1425
1426
1427
  EXPORT_SYMBOL(generic_make_request);
  
  /**
710027a48   Randy Dunlap   Add some block/ s...
1428
   * submit_bio - submit a bio to the block device layer for I/O
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
1430
1431
1432
1433
   * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead)
   * @bio: The &struct bio which describes the I/O
   *
   * submit_bio() is very similar in purpose to generic_make_request(), and
   * uses that function to do most of the work. Both are fairly rough
710027a48   Randy Dunlap   Add some block/ s...
1434
   * interfaces; @bio must be presetup and ready for I/O.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435
1436
1437
1438
1439
   *
   */
  void submit_bio(int rw, struct bio *bio)
  {
  	int count = bio_sectors(bio);
22e2c507c   Jens Axboe   [PATCH] Update cf...
1440
  	bio->bi_rw |= rw;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1441

bf2de6f5a   Jens Axboe   block: Initial su...
1442
1443
1444
1445
  	/*
  	 * If it's a regular read/write or a barrier with data attached,
  	 * go through the normal accounting stuff before submission.
  	 */
a9c701e59   Jens Axboe   block: use bio_ha...
1446
  	if (bio_has_data(bio)) {
bf2de6f5a   Jens Axboe   block: Initial su...
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
  		if (rw & WRITE) {
  			count_vm_events(PGPGOUT, count);
  		} else {
  			task_io_account_read(bio->bi_size);
  			count_vm_events(PGPGIN, count);
  		}
  
  		if (unlikely(block_dump)) {
  			char b[BDEVNAME_SIZE];
  			printk(KERN_DEBUG "%s(%d): %s block %Lu on %s
  ",
ba25f9dcc   Pavel Emelyanov   Use helpers to ob...
1458
  			current->comm, task_pid_nr(current),
bf2de6f5a   Jens Axboe   block: Initial su...
1459
1460
  				(rw & WRITE) ? "WRITE" : "READ",
  				(unsigned long long)bio->bi_sector,
6728cb0e6   Jens Axboe   block: make core ...
1461
  				bdevname(bio->bi_bdev, b));
bf2de6f5a   Jens Axboe   block: Initial su...
1462
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463
1464
1465
1466
  	}
  
  	generic_make_request(bio);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1467
  EXPORT_SYMBOL(submit_bio);
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
1468
  /**
82124d603   Kiyoshi Ueda   block: add reques...
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
   * blk_rq_check_limits - Helper function to check a request for the queue limit
   * @q:  the queue
   * @rq: the request being checked
   *
   * Description:
   *    @rq may have been made based on weaker limitations of upper-level queues
   *    in request stacking drivers, and it may violate the limitation of @q.
   *    Since the block layer and the underlying device driver trust @rq
   *    after it is inserted to @q, it should be checked against @q before
   *    the insertion using this generic function.
   *
   *    This function should also be useful for request stacking drivers
   *    in some cases below, so export this fuction.
   *    Request stacking drivers like request-based dm may change the queue
   *    limits while requests are in the queue (e.g. dm's table swapping).
   *    Such request stacking drivers should check those requests agaist
   *    the new queue limits again when they dispatch those requests,
   *    although such checkings are also done against the old queue limits
   *    when submitting requests.
   */
  int blk_rq_check_limits(struct request_queue *q, struct request *rq)
  {
  	if (rq->nr_sectors > q->max_sectors ||
  	    rq->data_len > q->max_hw_sectors << 9) {
  		printk(KERN_ERR "%s: over max size limit.
  ", __func__);
  		return -EIO;
  	}
  
  	/*
  	 * queue's settings related to segment counting like q->bounce_pfn
  	 * may differ from that of other stacking queues.
  	 * Recalculate it to check the request correctly on this queue's
  	 * limitation.
  	 */
  	blk_recalc_rq_segments(rq);
  	if (rq->nr_phys_segments > q->max_phys_segments ||
  	    rq->nr_phys_segments > q->max_hw_segments) {
  		printk(KERN_ERR "%s: over max segments limit.
  ", __func__);
  		return -EIO;
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(blk_rq_check_limits);
  
  /**
   * blk_insert_cloned_request - Helper for stacking drivers to submit a request
   * @q:  the queue to submit the request
   * @rq: the request being queued
   */
  int blk_insert_cloned_request(struct request_queue *q, struct request *rq)
  {
  	unsigned long flags;
  
  	if (blk_rq_check_limits(q, rq))
  		return -EIO;
  
  #ifdef CONFIG_FAIL_MAKE_REQUEST
  	if (rq->rq_disk && rq->rq_disk->part0.make_it_fail &&
  	    should_fail(&fail_make_request, blk_rq_bytes(rq)))
  		return -EIO;
  #endif
  
  	spin_lock_irqsave(q->queue_lock, flags);
  
  	/*
  	 * Submitting request must be dequeued before calling this function
  	 * because it will be linked to another request_queue
  	 */
  	BUG_ON(blk_queued_rq(rq));
  
  	drive_stat_acct(rq, 1);
  	__elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 0);
  
  	spin_unlock_irqrestore(q->queue_lock, flags);
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(blk_insert_cloned_request);
  
  /**
53a08807c   Tejun Heo   block: internal d...
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
   * blkdev_dequeue_request - dequeue request and start timeout timer
   * @req: request to dequeue
   *
   * Dequeue @req and start timeout timer on it.  This hands off the
   * request to the driver.
   *
   * Block internal functions which don't want to start timer should
   * call elv_dequeue_request().
   */
  void blkdev_dequeue_request(struct request *req)
  {
  	elv_dequeue_request(req->q, req);
  
  	/*
  	 * We are now handing the request to the hardware, add the
  	 * timeout handler.
  	 */
  	blk_add_timer(req);
  }
  EXPORT_SYMBOL(blkdev_dequeue_request);
bc58ba946   Jens Axboe   block: add sysfs ...
1572
1573
  static void blk_account_io_completion(struct request *req, unsigned int bytes)
  {
26308eab6   Jerome Marchand   block: fix incons...
1574
  	if (!blk_do_io_stat(req))
bc58ba946   Jens Axboe   block: add sysfs ...
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
  		return;
  
  	if (blk_fs_request(req)) {
  		const int rw = rq_data_dir(req);
  		struct hd_struct *part;
  		int cpu;
  
  		cpu = part_stat_lock();
  		part = disk_map_sector_rcu(req->rq_disk, req->sector);
  		part_stat_add(cpu, part, sectors[rw], bytes >> 9);
  		part_stat_unlock();
  	}
  }
  
  static void blk_account_io_done(struct request *req)
  {
26308eab6   Jerome Marchand   block: fix incons...
1591
  	if (!blk_do_io_stat(req))
bc58ba946   Jens Axboe   block: add sysfs ...
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
  		return;
  
  	/*
  	 * Account IO completion.  bar_rq isn't accounted as a normal
  	 * IO on queueing nor completion.  Accounting the containing
  	 * request is enough.
  	 */
  	if (blk_fs_request(req) && req != &req->q->bar_rq) {
  		unsigned long duration = jiffies - req->start_time;
  		const int rw = rq_data_dir(req);
  		struct hd_struct *part;
  		int cpu;
  
  		cpu = part_stat_lock();
26308eab6   Jerome Marchand   block: fix incons...
1606
  		part = disk_map_sector_rcu(req->rq_disk, req->sector);
bc58ba946   Jens Axboe   block: add sysfs ...
1607
1608
1609
1610
1611
1612
1613
1614
1615
  
  		part_stat_inc(cpu, part, ios[rw]);
  		part_stat_add(cpu, part, ticks[rw], duration);
  		part_round_stats(cpu, part);
  		part_dec_in_flight(part);
  
  		part_stat_unlock();
  	}
  }
53a08807c   Tejun Heo   block: internal d...
1616
  /**
5efccd17c   Tejun Heo   block: reorder re...
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
   * blk_rq_bytes - Returns bytes left to complete in the entire request
   * @rq: the request being processed
   **/
  unsigned int blk_rq_bytes(struct request *rq)
  {
  	if (blk_fs_request(rq))
  		return rq->hard_nr_sectors << 9;
  
  	return rq->data_len;
  }
  EXPORT_SYMBOL_GPL(blk_rq_bytes);
  
  /**
   * blk_rq_cur_bytes - Returns bytes left to complete in the current segment
   * @rq: the request being processed
   **/
  unsigned int blk_rq_cur_bytes(struct request *rq)
  {
  	if (blk_fs_request(rq))
  		return rq->current_nr_sectors << 9;
  
  	if (rq->bio)
  		return rq->bio->bi_size;
  
  	return rq->data_len;
  }
  EXPORT_SYMBOL_GPL(blk_rq_cur_bytes);
158dbda00   Tejun Heo   block: reorganize...
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
  struct request *elv_next_request(struct request_queue *q)
  {
  	struct request *rq;
  	int ret;
  
  	while ((rq = __elv_next_request(q)) != NULL) {
  		if (!(rq->cmd_flags & REQ_STARTED)) {
  			/*
  			 * This is the first time the device driver
  			 * sees this request (possibly after
  			 * requeueing).  Notify IO scheduler.
  			 */
  			if (blk_sorted_rq(rq))
  				elv_activate_rq(q, rq);
  
  			/*
  			 * just mark as started even if we don't start
  			 * it, a request that has been delayed should
  			 * not be passed by new incoming requests
  			 */
  			rq->cmd_flags |= REQ_STARTED;
  			trace_block_rq_issue(q, rq);
  		}
  
  		if (!q->boundary_rq || q->boundary_rq == rq) {
  			q->end_sector = rq_end_sector(rq);
  			q->boundary_rq = NULL;
  		}
  
  		if (rq->cmd_flags & REQ_DONTPREP)
  			break;
  
  		if (q->dma_drain_size && rq->data_len) {
  			/*
  			 * make sure space for the drain appears we
  			 * know we can do this because max_hw_segments
  			 * has been adjusted to be one fewer than the
  			 * device can handle
  			 */
  			rq->nr_phys_segments++;
  		}
  
  		if (!q->prep_rq_fn)
  			break;
  
  		ret = q->prep_rq_fn(q, rq);
  		if (ret == BLKPREP_OK) {
  			break;
  		} else if (ret == BLKPREP_DEFER) {
  			/*
  			 * the request may have been (partially) prepped.
  			 * we need to keep this request in the front to
  			 * avoid resource deadlock.  REQ_STARTED will
  			 * prevent other fs requests from passing this one.
  			 */
  			if (q->dma_drain_size && rq->data_len &&
  			    !(rq->cmd_flags & REQ_DONTPREP)) {
  				/*
  				 * remove the space for the drain we added
  				 * so that we don't add it again
  				 */
  				--rq->nr_phys_segments;
  			}
  
  			rq = NULL;
  			break;
  		} else if (ret == BLKPREP_KILL) {
  			rq->cmd_flags |= REQ_QUIET;
  			__blk_end_request(rq, -EIO, blk_rq_bytes(rq));
  		} else {
  			printk(KERN_ERR "%s: bad return=%d
  ", __func__, ret);
  			break;
  		}
  	}
  
  	return rq;
  }
  EXPORT_SYMBOL(elv_next_request);
  
  void elv_dequeue_request(struct request_queue *q, struct request *rq)
  {
  	BUG_ON(list_empty(&rq->queuelist));
  	BUG_ON(ELV_ON_HASH(rq));
  
  	list_del_init(&rq->queuelist);
  
  	/*
  	 * the time frame between a request being removed from the lists
  	 * and to it is freed is accounted as io that is in progress at
  	 * the driver side.
  	 */
  	if (blk_account_rq(rq))
  		q->in_flight++;
  }
5efccd17c   Tejun Heo   block: reorder re...
1739
  /**
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
1740
1741
   * __end_that_request_first - end I/O on a request
   * @req:      the request being processed
710027a48   Randy Dunlap   Add some block/ s...
1742
   * @error:    %0 for success, < %0 for error
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
1743
1744
1745
1746
1747
1748
1749
   * @nr_bytes: number of bytes to complete
   *
   * Description:
   *     Ends I/O on a number of bytes attached to @req, and sets it up
   *     for the next range of segments (if any) in the cluster.
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
1750
1751
   *     %0 - we are done with this request, call end_that_request_last()
   *     %1 - still buffers pending for this request
3bcddeac1   Kiyoshi Ueda   blk_end_request: ...
1752
   **/
5450d3e1d   Kiyoshi Ueda   blk_end_request: ...
1753
  static int __end_that_request_first(struct request *req, int error,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1754
1755
  				    int nr_bytes)
  {
5450d3e1d   Kiyoshi Ueda   blk_end_request: ...
1756
  	int total_bytes, bio_nbytes, next_idx = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1757
  	struct bio *bio;
5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
1758
  	trace_block_rq_complete(req->q, req);
2056a782f   Jens Axboe   [PATCH] Block que...
1759

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1760
  	/*
924cec778   Tejun Heo   block: clear req-...
1761
1762
1763
1764
1765
1766
  	 * For fs requests, rq is just carrier of independent bio's
  	 * and each partial completion should be handled separately.
  	 * Reset per-request error on each partial completion.
  	 *
  	 * TODO: tj: This is too subtle.  It would be better to let
  	 * low level drivers do what they see fit.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1767
  	 */
924cec778   Tejun Heo   block: clear req-...
1768
  	if (blk_fs_request(req))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1769
  		req->errors = 0;
6728cb0e6   Jens Axboe   block: make core ...
1770
1771
1772
  	if (error && (blk_fs_request(req) && !(req->cmd_flags & REQ_QUIET))) {
  		printk(KERN_ERR "end_request: I/O error, dev %s, sector %llu
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1773
1774
1775
  				req->rq_disk ? req->rq_disk->disk_name : "?",
  				(unsigned long long)req->sector);
  	}
bc58ba946   Jens Axboe   block: add sysfs ...
1776
  	blk_account_io_completion(req, nr_bytes);
d72d904a5   Jens Axboe   [BLOCK] Update re...
1777

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1778
1779
1780
1781
1782
1783
1784
  	total_bytes = bio_nbytes = 0;
  	while ((bio = req->bio) != NULL) {
  		int nbytes;
  
  		if (nr_bytes >= bio->bi_size) {
  			req->bio = bio->bi_next;
  			nbytes = bio->bi_size;
5bb23a688   NeilBrown   Don't decrement b...
1785
  			req_bio_endio(req, bio, nbytes, error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1786
1787
1788
1789
1790
1791
1792
  			next_idx = 0;
  			bio_nbytes = 0;
  		} else {
  			int idx = bio->bi_idx + next_idx;
  
  			if (unlikely(bio->bi_idx >= bio->bi_vcnt)) {
  				blk_dump_rq_flags(req, "__end_that");
6728cb0e6   Jens Axboe   block: make core ...
1793
1794
  				printk(KERN_ERR "%s: bio idx %d >= vcnt %d
  ",
24c03d47d   Harvey Harrison   block: remove rem...
1795
  				       __func__, bio->bi_idx, bio->bi_vcnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
  				break;
  			}
  
  			nbytes = bio_iovec_idx(bio, idx)->bv_len;
  			BIO_BUG_ON(nbytes > bio->bi_size);
  
  			/*
  			 * not a complete bvec done
  			 */
  			if (unlikely(nbytes > nr_bytes)) {
  				bio_nbytes += nr_bytes;
  				total_bytes += nr_bytes;
  				break;
  			}
  
  			/*
  			 * advance to the next vector
  			 */
  			next_idx++;
  			bio_nbytes += nbytes;
  		}
  
  		total_bytes += nbytes;
  		nr_bytes -= nbytes;
6728cb0e6   Jens Axboe   block: make core ...
1820
1821
  		bio = req->bio;
  		if (bio) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
  			/*
  			 * end more in this run, or just return 'not-done'
  			 */
  			if (unlikely(nr_bytes <= 0))
  				break;
  		}
  	}
  
  	/*
  	 * completely done
  	 */
  	if (!req->bio)
  		return 0;
  
  	/*
  	 * if the request wasn't completed, update state
  	 */
  	if (bio_nbytes) {
5bb23a688   NeilBrown   Don't decrement b...
1840
  		req_bio_endio(req, bio, bio_nbytes, error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1841
1842
1843
1844
1845
1846
1847
1848
1849
  		bio->bi_idx += next_idx;
  		bio_iovec(bio)->bv_offset += nr_bytes;
  		bio_iovec(bio)->bv_len -= nr_bytes;
  	}
  
  	blk_recalc_rq_sectors(req, total_bytes >> 9);
  	blk_recalc_rq_segments(req);
  	return 1;
  }
5efccd17c   Tejun Heo   block: reorder re...
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
  static int end_that_request_data(struct request *rq, int error,
  				 unsigned int nr_bytes, unsigned int bidi_bytes)
  {
  	if (rq->bio) {
  		if (__end_that_request_first(rq, error, nr_bytes))
  			return 1;
  
  		/* Bidi request must be completed as a whole */
  		if (blk_bidi_rq(rq) &&
  		    __end_that_request_first(rq->next_rq, error, bidi_bytes))
  			return 1;
  	}
  
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1865
1866
1867
  /*
   * queue lock must be held
   */
5450d3e1d   Kiyoshi Ueda   blk_end_request: ...
1868
  static void end_that_request_last(struct request *req, int error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1869
  {
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1870
1871
1872
1873
  	if (blk_rq_tagged(req))
  		blk_queue_end_tag(req->q, req);
  
  	if (blk_queued_rq(req))
53a08807c   Tejun Heo   block: internal d...
1874
  		elv_dequeue_request(req->q, req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1875
1876
1877
  
  	if (unlikely(laptop_mode) && blk_fs_request(req))
  		laptop_io_completion();
e78042e5b   Mike Anderson   blk: move blk_del...
1878
  	blk_delete_timer(req);
bc58ba946   Jens Axboe   block: add sysfs ...
1879
  	blk_account_io_done(req);
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1880

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1881
  	if (req->end_io)
8ffdc6550   Tejun Heo   [BLOCK] add @upto...
1882
  		req->end_io(req, error);
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1883
1884
1885
  	else {
  		if (blk_bidi_rq(req))
  			__blk_put_request(req->next_rq->q, req->next_rq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886
  		__blk_put_request(req->q, req);
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1887
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1888
  }
3b11313a6   Kiyoshi Ueda   blk_end_request: ...
1889
  /**
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1890
1891
   * blk_end_io - Generic end_io function to complete a request.
   * @rq:           the request being processed
710027a48   Randy Dunlap   Add some block/ s...
1892
   * @error:        %0 for success, < %0 for error
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1893
1894
   * @nr_bytes:     number of bytes to complete @rq
   * @bidi_bytes:   number of bytes to complete @rq->next_rq
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1895
1896
   * @drv_callback: function called between completion of bios in the request
   *                and completion of the request.
710027a48   Randy Dunlap   Add some block/ s...
1897
   *                If the callback returns non %0, this helper returns without
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1898
   *                completion of the request.
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1899
1900
   *
   * Description:
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1901
   *     Ends I/O on a number of bytes attached to @rq and @rq->next_rq.
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1902
1903
1904
   *     If @rq has leftover, sets it up for the next range of segments.
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
1905
1906
   *     %0 - we are done with this request
   *     %1 - this request is not freed yet, it still has pending buffers.
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1907
   **/
22b132102   Jens Axboe   block: new end re...
1908
1909
1910
  static int blk_end_io(struct request *rq, int error, unsigned int nr_bytes,
  		      unsigned int bidi_bytes,
  		      int (drv_callback)(struct request *))
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1911
1912
1913
  {
  	struct request_queue *q = rq->q;
  	unsigned long flags = 0UL;
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1914

32fab448e   Kiyoshi Ueda   block: add reques...
1915
1916
  	if (end_that_request_data(rq, error, nr_bytes, bidi_bytes))
  		return 1;
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1917

e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1918
1919
1920
  	/* Special feature for tricky drivers */
  	if (drv_callback && drv_callback(rq))
  		return 1;
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1921
1922
1923
  	add_disk_randomness(rq->rq_disk);
  
  	spin_lock_irqsave(q->queue_lock, flags);
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1924
  	end_that_request_last(rq, error);
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1925
1926
1927
1928
  	spin_unlock_irqrestore(q->queue_lock, flags);
  
  	return 0;
  }
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1929
1930
1931
1932
  
  /**
   * blk_end_request - Helper function for drivers to complete the request.
   * @rq:       the request being processed
710027a48   Randy Dunlap   Add some block/ s...
1933
   * @error:    %0 for success, < %0 for error
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1934
1935
1936
1937
1938
1939
1940
   * @nr_bytes: number of bytes to complete
   *
   * Description:
   *     Ends I/O on a number of bytes attached to @rq.
   *     If @rq has leftover, sets it up for the next range of segments.
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
1941
1942
   *     %0 - we are done with this request
   *     %1 - still buffers pending for this request
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1943
   **/
22b132102   Jens Axboe   block: new end re...
1944
  int blk_end_request(struct request *rq, int error, unsigned int nr_bytes)
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1945
  {
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1946
  	return blk_end_io(rq, error, nr_bytes, 0, NULL);
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1947
  }
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1948
1949
1950
1951
1952
  EXPORT_SYMBOL_GPL(blk_end_request);
  
  /**
   * __blk_end_request - Helper function for drivers to complete the request.
   * @rq:       the request being processed
710027a48   Randy Dunlap   Add some block/ s...
1953
   * @error:    %0 for success, < %0 for error
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1954
1955
1956
1957
1958
1959
   * @nr_bytes: number of bytes to complete
   *
   * Description:
   *     Must be called with queue lock held unlike blk_end_request().
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
1960
1961
   *     %0 - we are done with this request
   *     %1 - still buffers pending for this request
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1962
   **/
22b132102   Jens Axboe   block: new end re...
1963
  int __blk_end_request(struct request *rq, int error, unsigned int nr_bytes)
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1964
  {
605401618   Jens Axboe   block: don't use ...
1965
  	if (rq->bio && __end_that_request_first(rq, error, nr_bytes))
051cc3952   Jens Axboe   block: use bio_ha...
1966
  		return 1;
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1967
1968
  
  	add_disk_randomness(rq->rq_disk);
b8286239d   Kiyoshi Ueda   blk_end_request: ...
1969
  	end_that_request_last(rq, error);
336cdb400   Kiyoshi Ueda   blk_end_request: ...
1970
1971
1972
1973
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(__blk_end_request);
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
1974
  /**
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1975
1976
   * blk_end_bidi_request - Helper function for drivers to complete bidi request.
   * @rq:         the bidi request being processed
710027a48   Randy Dunlap   Add some block/ s...
1977
   * @error:      %0 for success, < %0 for error
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1978
1979
1980
1981
1982
1983
1984
   * @nr_bytes:   number of bytes to complete @rq
   * @bidi_bytes: number of bytes to complete @rq->next_rq
   *
   * Description:
   *     Ends I/O on a number of bytes attached to @rq and @rq->next_rq.
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
1985
1986
   *     %0 - we are done with this request
   *     %1 - still buffers pending for this request
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1987
   **/
22b132102   Jens Axboe   block: new end re...
1988
1989
  int blk_end_bidi_request(struct request *rq, int error, unsigned int nr_bytes,
  			 unsigned int bidi_bytes)
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
1990
1991
1992
1993
1994
1995
  {
  	return blk_end_io(rq, error, nr_bytes, bidi_bytes, NULL);
  }
  EXPORT_SYMBOL_GPL(blk_end_bidi_request);
  
  /**
5efccd17c   Tejun Heo   block: reorder re...
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
   * end_request - end I/O on the current segment of the request
   * @req:	the request being processed
   * @uptodate:	error value or %0/%1 uptodate flag
   *
   * Description:
   *     Ends I/O on the current segment of a request. If that is the only
   *     remaining segment, the request is also completed and freed.
   *
   *     This is a remnant of how older block drivers handled I/O completions.
   *     Modern drivers typically end I/O on the full request in one go, unless
   *     they have a residual value to account for. For that case this function
   *     isn't really useful, unless the residual just happens to be the
   *     full current segment. In other words, don't use this function in new
   *     code. Use blk_end_request() or __blk_end_request() to end a request.
   **/
  void end_request(struct request *req, int uptodate)
  {
  	int error = 0;
  
  	if (uptodate <= 0)
  		error = uptodate ? uptodate : -EIO;
  
  	__blk_end_request(req, error, req->hard_cur_sectors << 9);
  }
  EXPORT_SYMBOL(end_request);
  
  /**
32fab448e   Kiyoshi Ueda   block: add reques...
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
   * blk_update_request - Special helper function for request stacking drivers
   * @rq:           the request being processed
   * @error:        %0 for success, < %0 for error
   * @nr_bytes:     number of bytes to complete @rq
   *
   * Description:
   *     Ends I/O on a number of bytes attached to @rq, but doesn't complete
   *     the request structure even if @rq doesn't have leftover.
   *     If @rq has leftover, sets it up for the next range of segments.
   *
   *     This special helper function is only for request stacking drivers
   *     (e.g. request-based dm) so that they can handle partial completion.
   *     Actual device drivers should use blk_end_request instead.
   */
  void blk_update_request(struct request *rq, int error, unsigned int nr_bytes)
  {
  	if (!end_that_request_data(rq, error, nr_bytes, 0)) {
  		/*
  		 * These members are not updated in end_that_request_data()
  		 * when all bios are completed.
  		 * Update them so that the request stacking driver can find
  		 * how many bytes remain in the request later.
  		 */
  		rq->nr_sectors = rq->hard_nr_sectors = 0;
  		rq->current_nr_sectors = rq->hard_cur_sectors = 0;
  	}
  }
  EXPORT_SYMBOL_GPL(blk_update_request);
  
  /**
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2053
2054
   * blk_end_request_callback - Special helper function for tricky drivers
   * @rq:           the request being processed
710027a48   Randy Dunlap   Add some block/ s...
2055
   * @error:        %0 for success, < %0 for error
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2056
2057
2058
   * @nr_bytes:     number of bytes to complete
   * @drv_callback: function called between completion of bios in the request
   *                and completion of the request.
710027a48   Randy Dunlap   Add some block/ s...
2059
   *                If the callback returns non %0, this helper returns without
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
   *                completion of the request.
   *
   * Description:
   *     Ends I/O on a number of bytes attached to @rq.
   *     If @rq has leftover, sets it up for the next range of segments.
   *
   *     This special helper function is used only for existing tricky drivers.
   *     (e.g. cdrom_newpc_intr() of ide-cd)
   *     This interface will be removed when such drivers are rewritten.
   *     Don't use this interface in other places anymore.
   *
   * Return:
710027a48   Randy Dunlap   Add some block/ s...
2072
2073
2074
2075
   *     %0 - we are done with this request
   *     %1 - this request is not freed yet.
   *          this request still has pending buffers or
   *          the driver doesn't want to finish this request yet.
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2076
   **/
22b132102   Jens Axboe   block: new end re...
2077
2078
  int blk_end_request_callback(struct request *rq, int error,
  			     unsigned int nr_bytes,
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2079
2080
  			     int (drv_callback)(struct request *))
  {
e3a04fe34   Kiyoshi Ueda   blk_end_request: ...
2081
  	return blk_end_io(rq, error, nr_bytes, 0, drv_callback);
e19a3ab05   Kiyoshi Ueda   blk_end_request: ...
2082
2083
  }
  EXPORT_SYMBOL_GPL(blk_end_request_callback);
86db1e297   Jens Axboe   block: continue l...
2084
2085
  void blk_rq_bio_prep(struct request_queue *q, struct request *rq,
  		     struct bio *bio)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2086
  {
d628eaef3   David Woodhouse   Fix up comments a...
2087
2088
  	/* Bit 0 (R/W) is identical in rq->cmd_flags and bio->bi_rw, and
  	   we want BIO_RW_AHEAD (bit 1) to imply REQ_FAILFAST (bit 1). */
4aff5e233   Jens Axboe   [PATCH] Split str...
2089
  	rq->cmd_flags |= (bio->bi_rw & 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2090

fb2dce862   David Woodhouse   Add 'discard' req...
2091
2092
  	if (bio_has_data(bio)) {
  		rq->nr_phys_segments = bio_phys_segments(q, bio);
fb2dce862   David Woodhouse   Add 'discard' req...
2093
2094
  		rq->buffer = bio_data(bio);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
  	rq->current_nr_sectors = bio_cur_sectors(bio);
  	rq->hard_cur_sectors = rq->current_nr_sectors;
  	rq->hard_nr_sectors = rq->nr_sectors = bio_sectors(bio);
0e75f9063   Mike Christie   [PATCH] block: su...
2098
  	rq->data_len = bio->bi_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2099
2100
  
  	rq->bio = rq->biotail = bio;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2101

66846572b   NeilBrown   Stop exporting bl...
2102
2103
2104
  	if (bio->bi_bdev)
  		rq->rq_disk = bio->bi_bdev->bd_disk;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105

ef9e3facd   Kiyoshi Ueda   block: add lld bu...
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
  /**
   * blk_lld_busy - Check if underlying low-level drivers of a device are busy
   * @q : the queue of the device being checked
   *
   * Description:
   *    Check if underlying low-level drivers of a device are busy.
   *    If the drivers want to export their busy state, they must set own
   *    exporting function using blk_queue_lld_busy() first.
   *
   *    Basically, this function is used only by request stacking drivers
   *    to stop dispatching requests to underlying devices when underlying
   *    devices are busy.  This behavior helps more I/O merging on the queue
   *    of the request stacking driver and prevents I/O throughput regression
   *    on burst I/O load.
   *
   * Return:
   *    0 - Not busy (The request stacking driver should dispatch request)
   *    1 - Busy (The request stacking driver should stop dispatching request)
   */
  int blk_lld_busy(struct request_queue *q)
  {
  	if (q->lld_busy_fn)
  		return q->lld_busy_fn(q);
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(blk_lld_busy);
18887ad91   Jens Axboe   block: make kbloc...
2133
  int kblockd_schedule_work(struct request_queue *q, struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2134
2135
2136
  {
  	return queue_work(kblockd_workqueue, work);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2137
  EXPORT_SYMBOL(kblockd_schedule_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2138
2139
2140
2141
2142
2143
2144
2145
  int __init blk_dev_init(void)
  {
  	kblockd_workqueue = create_workqueue("kblockd");
  	if (!kblockd_workqueue)
  		panic("Failed to create kblockd
  ");
  
  	request_cachep = kmem_cache_create("blkdev_requests",
20c2df83d   Paul Mundt   mm: Remove slab d...
2146
  			sizeof(struct request), 0, SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2147

8324aa91d   Jens Axboe   block: split tag ...
2148
  	blk_requestq_cachep = kmem_cache_create("blkdev_queue",
165125e1e   Jens Axboe   [BLOCK] Get rid o...
2149
  			sizeof(struct request_queue), 0, SLAB_PANIC, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2150

d38ecf935   Jens Axboe   io context sharin...
2151
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2152
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2153