Input: wistron - fix section reference mismatches
[linux-2.6] / block / elevator.c
1 /*
2  *  Block device elevator/IO-scheduler.
3  *
4  *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
5  *
6  * 30042000 Jens Axboe <axboe@suse.de> :
7  *
8  * Split the elevator a bit so that it is possible to choose a different
9  * one or even write a new "plug in". There are three pieces:
10  * - elevator_fn, inserts a new request in the queue list
11  * - elevator_merge_fn, decides whether a new buffer can be merged with
12  *   an existing request
13  * - elevator_dequeue_fn, called when a request is taken off the active list
14  *
15  * 20082000 Dave Jones <davej@suse.de> :
16  * Removed tests for max-bomb-segments, which was breaking elvtune
17  *  when run without -bN
18  *
19  * Jens:
20  * - Rework again to work with bio instead of buffer_heads
21  * - loose bi_dev comparisons, partition handling is right now
22  * - completely modularize elevator setup and teardown
23  *
24  */
25 #include <linux/kernel.h>
26 #include <linux/fs.h>
27 #include <linux/blkdev.h>
28 #include <linux/elevator.h>
29 #include <linux/bio.h>
30 #include <linux/module.h>
31 #include <linux/slab.h>
32 #include <linux/init.h>
33 #include <linux/compiler.h>
34 #include <linux/delay.h>
35 #include <linux/blktrace_api.h>
36
37 #include <asm/uaccess.h>
38
39 static DEFINE_SPINLOCK(elv_list_lock);
40 static LIST_HEAD(elv_list);
41
42 /*
43  * can we safely merge with this request?
44  */
45 inline int elv_rq_merge_ok(struct request *rq, struct bio *bio)
46 {
47         if (!rq_mergeable(rq))
48                 return 0;
49
50         /*
51          * different data direction or already started, don't merge
52          */
53         if (bio_data_dir(bio) != rq_data_dir(rq))
54                 return 0;
55
56         /*
57          * same device and no special stuff set, merge is ok
58          */
59         if (rq->rq_disk == bio->bi_bdev->bd_disk &&
60             !rq->waiting && !rq->special)
61                 return 1;
62
63         return 0;
64 }
65 EXPORT_SYMBOL(elv_rq_merge_ok);
66
67 static inline int elv_try_merge(struct request *__rq, struct bio *bio)
68 {
69         int ret = ELEVATOR_NO_MERGE;
70
71         /*
72          * we can merge and sequence is ok, check if it's possible
73          */
74         if (elv_rq_merge_ok(__rq, bio)) {
75                 if (__rq->sector + __rq->nr_sectors == bio->bi_sector)
76                         ret = ELEVATOR_BACK_MERGE;
77                 else if (__rq->sector - bio_sectors(bio) == bio->bi_sector)
78                         ret = ELEVATOR_FRONT_MERGE;
79         }
80
81         return ret;
82 }
83
84 static struct elevator_type *elevator_find(const char *name)
85 {
86         struct elevator_type *e = NULL;
87         struct list_head *entry;
88
89         list_for_each(entry, &elv_list) {
90                 struct elevator_type *__e;
91
92                 __e = list_entry(entry, struct elevator_type, list);
93
94                 if (!strcmp(__e->elevator_name, name)) {
95                         e = __e;
96                         break;
97                 }
98         }
99
100         return e;
101 }
102
103 static void elevator_put(struct elevator_type *e)
104 {
105         module_put(e->elevator_owner);
106 }
107
108 static struct elevator_type *elevator_get(const char *name)
109 {
110         struct elevator_type *e;
111
112         spin_lock_irq(&elv_list_lock);
113
114         e = elevator_find(name);
115         if (e && !try_module_get(e->elevator_owner))
116                 e = NULL;
117
118         spin_unlock_irq(&elv_list_lock);
119
120         return e;
121 }
122
123 static void *elevator_init_queue(request_queue_t *q, struct elevator_queue *eq)
124 {
125         return eq->ops->elevator_init_fn(q, eq);
126 }
127
128 static void elevator_attach(request_queue_t *q, struct elevator_queue *eq,
129                            void *data)
130 {
131         q->elevator = eq;
132         eq->elevator_data = data;
133 }
134
135 static char chosen_elevator[16];
136
137 static int __init elevator_setup(char *str)
138 {
139         /*
140          * Be backwards-compatible with previous kernels, so users
141          * won't get the wrong elevator.
142          */
143         if (!strcmp(str, "as"))
144                 strcpy(chosen_elevator, "anticipatory");
145         else
146                 strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1);
147         return 1;
148 }
149
150 __setup("elevator=", elevator_setup);
151
152 static struct kobj_type elv_ktype;
153
154 static elevator_t *elevator_alloc(struct elevator_type *e)
155 {
156         elevator_t *eq = kmalloc(sizeof(elevator_t), GFP_KERNEL);
157         if (eq) {
158                 memset(eq, 0, sizeof(*eq));
159                 eq->ops = &e->ops;
160                 eq->elevator_type = e;
161                 kobject_init(&eq->kobj);
162                 snprintf(eq->kobj.name, KOBJ_NAME_LEN, "%s", "iosched");
163                 eq->kobj.ktype = &elv_ktype;
164                 mutex_init(&eq->sysfs_lock);
165         } else {
166                 elevator_put(e);
167         }
168         return eq;
169 }
170
171 static void elevator_release(struct kobject *kobj)
172 {
173         elevator_t *e = container_of(kobj, elevator_t, kobj);
174         elevator_put(e->elevator_type);
175         kfree(e);
176 }
177
178 int elevator_init(request_queue_t *q, char *name)
179 {
180         struct elevator_type *e = NULL;
181         struct elevator_queue *eq;
182         int ret = 0;
183         void *data;
184
185         INIT_LIST_HEAD(&q->queue_head);
186         q->last_merge = NULL;
187         q->end_sector = 0;
188         q->boundary_rq = NULL;
189
190         if (name && !(e = elevator_get(name)))
191                 return -EINVAL;
192
193         if (!e && *chosen_elevator && !(e = elevator_get(chosen_elevator)))
194                 printk("I/O scheduler %s not found\n", chosen_elevator);
195
196         if (!e && !(e = elevator_get(CONFIG_DEFAULT_IOSCHED))) {
197                 printk("Default I/O scheduler not found, using no-op\n");
198                 e = elevator_get("noop");
199         }
200
201         eq = elevator_alloc(e);
202         if (!eq)
203                 return -ENOMEM;
204
205         data = elevator_init_queue(q, eq);
206         if (!data) {
207                 kobject_put(&eq->kobj);
208                 return -ENOMEM;
209         }
210
211         elevator_attach(q, eq, data);
212         return ret;
213 }
214
215 void elevator_exit(elevator_t *e)
216 {
217         mutex_lock(&e->sysfs_lock);
218         if (e->ops->elevator_exit_fn)
219                 e->ops->elevator_exit_fn(e);
220         e->ops = NULL;
221         mutex_unlock(&e->sysfs_lock);
222
223         kobject_put(&e->kobj);
224 }
225
226 /*
227  * Insert rq into dispatch queue of q.  Queue lock must be held on
228  * entry.  If sort != 0, rq is sort-inserted; otherwise, rq will be
229  * appended to the dispatch queue.  To be used by specific elevators.
230  */
231 void elv_dispatch_sort(request_queue_t *q, struct request *rq)
232 {
233         sector_t boundary;
234         struct list_head *entry;
235
236         if (q->last_merge == rq)
237                 q->last_merge = NULL;
238         q->nr_sorted--;
239
240         boundary = q->end_sector;
241
242         list_for_each_prev(entry, &q->queue_head) {
243                 struct request *pos = list_entry_rq(entry);
244
245                 if (pos->flags & (REQ_SOFTBARRIER|REQ_HARDBARRIER|REQ_STARTED))
246                         break;
247                 if (rq->sector >= boundary) {
248                         if (pos->sector < boundary)
249                                 continue;
250                 } else {
251                         if (pos->sector >= boundary)
252                                 break;
253                 }
254                 if (rq->sector >= pos->sector)
255                         break;
256         }
257
258         list_add(&rq->queuelist, entry);
259 }
260
261 int elv_merge(request_queue_t *q, struct request **req, struct bio *bio)
262 {
263         elevator_t *e = q->elevator;
264         int ret;
265
266         if (q->last_merge) {
267                 ret = elv_try_merge(q->last_merge, bio);
268                 if (ret != ELEVATOR_NO_MERGE) {
269                         *req = q->last_merge;
270                         return ret;
271                 }
272         }
273
274         if (e->ops->elevator_merge_fn)
275                 return e->ops->elevator_merge_fn(q, req, bio);
276
277         return ELEVATOR_NO_MERGE;
278 }
279
280 void elv_merged_request(request_queue_t *q, struct request *rq)
281 {
282         elevator_t *e = q->elevator;
283
284         if (e->ops->elevator_merged_fn)
285                 e->ops->elevator_merged_fn(q, rq);
286
287         q->last_merge = rq;
288 }
289
290 void elv_merge_requests(request_queue_t *q, struct request *rq,
291                              struct request *next)
292 {
293         elevator_t *e = q->elevator;
294
295         if (e->ops->elevator_merge_req_fn)
296                 e->ops->elevator_merge_req_fn(q, rq, next);
297         q->nr_sorted--;
298
299         q->last_merge = rq;
300 }
301
302 void elv_requeue_request(request_queue_t *q, struct request *rq)
303 {
304         elevator_t *e = q->elevator;
305
306         /*
307          * it already went through dequeue, we need to decrement the
308          * in_flight count again
309          */
310         if (blk_account_rq(rq)) {
311                 q->in_flight--;
312                 if (blk_sorted_rq(rq) && e->ops->elevator_deactivate_req_fn)
313                         e->ops->elevator_deactivate_req_fn(q, rq);
314         }
315
316         rq->flags &= ~REQ_STARTED;
317
318         elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE);
319 }
320
321 static void elv_drain_elevator(request_queue_t *q)
322 {
323         static int printed;
324         while (q->elevator->ops->elevator_dispatch_fn(q, 1))
325                 ;
326         if (q->nr_sorted == 0)
327                 return;
328         if (printed++ < 10) {
329                 printk(KERN_ERR "%s: forced dispatching is broken "
330                        "(nr_sorted=%u), please report this\n",
331                        q->elevator->elevator_type->elevator_name, q->nr_sorted);
332         }
333 }
334
335 void elv_insert(request_queue_t *q, struct request *rq, int where)
336 {
337         struct list_head *pos;
338         unsigned ordseq;
339         int unplug_it = 1;
340
341         blk_add_trace_rq(q, rq, BLK_TA_INSERT);
342
343         rq->q = q;
344
345         switch (where) {
346         case ELEVATOR_INSERT_FRONT:
347                 rq->flags |= REQ_SOFTBARRIER;
348
349                 list_add(&rq->queuelist, &q->queue_head);
350                 break;
351
352         case ELEVATOR_INSERT_BACK:
353                 rq->flags |= REQ_SOFTBARRIER;
354                 elv_drain_elevator(q);
355                 list_add_tail(&rq->queuelist, &q->queue_head);
356                 /*
357                  * We kick the queue here for the following reasons.
358                  * - The elevator might have returned NULL previously
359                  *   to delay requests and returned them now.  As the
360                  *   queue wasn't empty before this request, ll_rw_blk
361                  *   won't run the queue on return, resulting in hang.
362                  * - Usually, back inserted requests won't be merged
363                  *   with anything.  There's no point in delaying queue
364                  *   processing.
365                  */
366                 blk_remove_plug(q);
367                 q->request_fn(q);
368                 break;
369
370         case ELEVATOR_INSERT_SORT:
371                 BUG_ON(!blk_fs_request(rq));
372                 rq->flags |= REQ_SORTED;
373                 q->nr_sorted++;
374                 if (q->last_merge == NULL && rq_mergeable(rq))
375                         q->last_merge = rq;
376                 /*
377                  * Some ioscheds (cfq) run q->request_fn directly, so
378                  * rq cannot be accessed after calling
379                  * elevator_add_req_fn.
380                  */
381                 q->elevator->ops->elevator_add_req_fn(q, rq);
382                 break;
383
384         case ELEVATOR_INSERT_REQUEUE:
385                 /*
386                  * If ordered flush isn't in progress, we do front
387                  * insertion; otherwise, requests should be requeued
388                  * in ordseq order.
389                  */
390                 rq->flags |= REQ_SOFTBARRIER;
391
392                 if (q->ordseq == 0) {
393                         list_add(&rq->queuelist, &q->queue_head);
394                         break;
395                 }
396
397                 ordseq = blk_ordered_req_seq(rq);
398
399                 list_for_each(pos, &q->queue_head) {
400                         struct request *pos_rq = list_entry_rq(pos);
401                         if (ordseq <= blk_ordered_req_seq(pos_rq))
402                                 break;
403                 }
404
405                 list_add_tail(&rq->queuelist, pos);
406                 /*
407                  * most requeues happen because of a busy condition, don't
408                  * force unplug of the queue for that case.
409                  */
410                 unplug_it = 0;
411                 break;
412
413         default:
414                 printk(KERN_ERR "%s: bad insertion point %d\n",
415                        __FUNCTION__, where);
416                 BUG();
417         }
418
419         if (unplug_it && blk_queue_plugged(q)) {
420                 int nrq = q->rq.count[READ] + q->rq.count[WRITE]
421                         - q->in_flight;
422
423                 if (nrq >= q->unplug_thresh)
424                         __generic_unplug_device(q);
425         }
426 }
427
428 void __elv_add_request(request_queue_t *q, struct request *rq, int where,
429                        int plug)
430 {
431         if (q->ordcolor)
432                 rq->flags |= REQ_ORDERED_COLOR;
433
434         if (rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)) {
435                 /*
436                  * toggle ordered color
437                  */
438                 if (blk_barrier_rq(rq))
439                         q->ordcolor ^= 1;
440
441                 /*
442                  * barriers implicitly indicate back insertion
443                  */
444                 if (where == ELEVATOR_INSERT_SORT)
445                         where = ELEVATOR_INSERT_BACK;
446
447                 /*
448                  * this request is scheduling boundary, update
449                  * end_sector
450                  */
451                 if (blk_fs_request(rq)) {
452                         q->end_sector = rq_end_sector(rq);
453                         q->boundary_rq = rq;
454                 }
455         } else if (!(rq->flags & REQ_ELVPRIV) && where == ELEVATOR_INSERT_SORT)
456                 where = ELEVATOR_INSERT_BACK;
457
458         if (plug)
459                 blk_plug_device(q);
460
461         elv_insert(q, rq, where);
462 }
463
464 void elv_add_request(request_queue_t *q, struct request *rq, int where,
465                      int plug)
466 {
467         unsigned long flags;
468
469         spin_lock_irqsave(q->queue_lock, flags);
470         __elv_add_request(q, rq, where, plug);
471         spin_unlock_irqrestore(q->queue_lock, flags);
472 }
473
474 static inline struct request *__elv_next_request(request_queue_t *q)
475 {
476         struct request *rq;
477
478         while (1) {
479                 while (!list_empty(&q->queue_head)) {
480                         rq = list_entry_rq(q->queue_head.next);
481                         if (blk_do_ordered(q, &rq))
482                                 return rq;
483                 }
484
485                 if (!q->elevator->ops->elevator_dispatch_fn(q, 0))
486                         return NULL;
487         }
488 }
489
490 struct request *elv_next_request(request_queue_t *q)
491 {
492         struct request *rq;
493         int ret;
494
495         while ((rq = __elv_next_request(q)) != NULL) {
496                 if (!(rq->flags & REQ_STARTED)) {
497                         elevator_t *e = q->elevator;
498
499                         /*
500                          * This is the first time the device driver
501                          * sees this request (possibly after
502                          * requeueing).  Notify IO scheduler.
503                          */
504                         if (blk_sorted_rq(rq) &&
505                             e->ops->elevator_activate_req_fn)
506                                 e->ops->elevator_activate_req_fn(q, rq);
507
508                         /*
509                          * just mark as started even if we don't start
510                          * it, a request that has been delayed should
511                          * not be passed by new incoming requests
512                          */
513                         rq->flags |= REQ_STARTED;
514                         blk_add_trace_rq(q, rq, BLK_TA_ISSUE);
515                 }
516
517                 if (!q->boundary_rq || q->boundary_rq == rq) {
518                         q->end_sector = rq_end_sector(rq);
519                         q->boundary_rq = NULL;
520                 }
521
522                 if ((rq->flags & REQ_DONTPREP) || !q->prep_rq_fn)
523                         break;
524
525                 ret = q->prep_rq_fn(q, rq);
526                 if (ret == BLKPREP_OK) {
527                         break;
528                 } else if (ret == BLKPREP_DEFER) {
529                         /*
530                          * the request may have been (partially) prepped.
531                          * we need to keep this request in the front to
532                          * avoid resource deadlock.  REQ_STARTED will
533                          * prevent other fs requests from passing this one.
534                          */
535                         rq = NULL;
536                         break;
537                 } else if (ret == BLKPREP_KILL) {
538                         int nr_bytes = rq->hard_nr_sectors << 9;
539
540                         if (!nr_bytes)
541                                 nr_bytes = rq->data_len;
542
543                         blkdev_dequeue_request(rq);
544                         rq->flags |= REQ_QUIET;
545                         end_that_request_chunk(rq, 0, nr_bytes);
546                         end_that_request_last(rq, 0);
547                 } else {
548                         printk(KERN_ERR "%s: bad return=%d\n", __FUNCTION__,
549                                                                 ret);
550                         break;
551                 }
552         }
553
554         return rq;
555 }
556
557 void elv_dequeue_request(request_queue_t *q, struct request *rq)
558 {
559         BUG_ON(list_empty(&rq->queuelist));
560
561         list_del_init(&rq->queuelist);
562
563         /*
564          * the time frame between a request being removed from the lists
565          * and to it is freed is accounted as io that is in progress at
566          * the driver side.
567          */
568         if (blk_account_rq(rq))
569                 q->in_flight++;
570 }
571
572 int elv_queue_empty(request_queue_t *q)
573 {
574         elevator_t *e = q->elevator;
575
576         if (!list_empty(&q->queue_head))
577                 return 0;
578
579         if (e->ops->elevator_queue_empty_fn)
580                 return e->ops->elevator_queue_empty_fn(q);
581
582         return 1;
583 }
584
585 struct request *elv_latter_request(request_queue_t *q, struct request *rq)
586 {
587         elevator_t *e = q->elevator;
588
589         if (e->ops->elevator_latter_req_fn)
590                 return e->ops->elevator_latter_req_fn(q, rq);
591         return NULL;
592 }
593
594 struct request *elv_former_request(request_queue_t *q, struct request *rq)
595 {
596         elevator_t *e = q->elevator;
597
598         if (e->ops->elevator_former_req_fn)
599                 return e->ops->elevator_former_req_fn(q, rq);
600         return NULL;
601 }
602
603 int elv_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
604                     gfp_t gfp_mask)
605 {
606         elevator_t *e = q->elevator;
607
608         if (e->ops->elevator_set_req_fn)
609                 return e->ops->elevator_set_req_fn(q, rq, bio, gfp_mask);
610
611         rq->elevator_private = NULL;
612         return 0;
613 }
614
615 void elv_put_request(request_queue_t *q, struct request *rq)
616 {
617         elevator_t *e = q->elevator;
618
619         if (e->ops->elevator_put_req_fn)
620                 e->ops->elevator_put_req_fn(q, rq);
621 }
622
623 int elv_may_queue(request_queue_t *q, int rw, struct bio *bio)
624 {
625         elevator_t *e = q->elevator;
626
627         if (e->ops->elevator_may_queue_fn)
628                 return e->ops->elevator_may_queue_fn(q, rw, bio);
629
630         return ELV_MQUEUE_MAY;
631 }
632
633 void elv_completed_request(request_queue_t *q, struct request *rq)
634 {
635         elevator_t *e = q->elevator;
636
637         /*
638          * request is released from the driver, io must be done
639          */
640         if (blk_account_rq(rq)) {
641                 q->in_flight--;
642                 if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn)
643                         e->ops->elevator_completed_req_fn(q, rq);
644         }
645
646         /*
647          * Check if the queue is waiting for fs requests to be
648          * drained for flush sequence.
649          */
650         if (unlikely(q->ordseq)) {
651                 struct request *first_rq = list_entry_rq(q->queue_head.next);
652                 if (q->in_flight == 0 &&
653                     blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN &&
654                     blk_ordered_req_seq(first_rq) > QUEUE_ORDSEQ_DRAIN) {
655                         blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0);
656                         q->request_fn(q);
657                 }
658         }
659 }
660
661 #define to_elv(atr) container_of((atr), struct elv_fs_entry, attr)
662
663 static ssize_t
664 elv_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
665 {
666         elevator_t *e = container_of(kobj, elevator_t, kobj);
667         struct elv_fs_entry *entry = to_elv(attr);
668         ssize_t error;
669
670         if (!entry->show)
671                 return -EIO;
672
673         mutex_lock(&e->sysfs_lock);
674         error = e->ops ? entry->show(e, page) : -ENOENT;
675         mutex_unlock(&e->sysfs_lock);
676         return error;
677 }
678
679 static ssize_t
680 elv_attr_store(struct kobject *kobj, struct attribute *attr,
681                const char *page, size_t length)
682 {
683         elevator_t *e = container_of(kobj, elevator_t, kobj);
684         struct elv_fs_entry *entry = to_elv(attr);
685         ssize_t error;
686
687         if (!entry->store)
688                 return -EIO;
689
690         mutex_lock(&e->sysfs_lock);
691         error = e->ops ? entry->store(e, page, length) : -ENOENT;
692         mutex_unlock(&e->sysfs_lock);
693         return error;
694 }
695
696 static struct sysfs_ops elv_sysfs_ops = {
697         .show   = elv_attr_show,
698         .store  = elv_attr_store,
699 };
700
701 static struct kobj_type elv_ktype = {
702         .sysfs_ops      = &elv_sysfs_ops,
703         .release        = elevator_release,
704 };
705
706 int elv_register_queue(struct request_queue *q)
707 {
708         elevator_t *e = q->elevator;
709         int error;
710
711         e->kobj.parent = &q->kobj;
712
713         error = kobject_add(&e->kobj);
714         if (!error) {
715                 struct elv_fs_entry *attr = e->elevator_type->elevator_attrs;
716                 if (attr) {
717                         while (attr->attr.name) {
718                                 if (sysfs_create_file(&e->kobj, &attr->attr))
719                                         break;
720                                 attr++;
721                         }
722                 }
723                 kobject_uevent(&e->kobj, KOBJ_ADD);
724         }
725         return error;
726 }
727
728 static void __elv_unregister_queue(elevator_t *e)
729 {
730         kobject_uevent(&e->kobj, KOBJ_REMOVE);
731         kobject_del(&e->kobj);
732 }
733
734 void elv_unregister_queue(struct request_queue *q)
735 {
736         if (q)
737                 __elv_unregister_queue(q->elevator);
738 }
739
740 int elv_register(struct elevator_type *e)
741 {
742         spin_lock_irq(&elv_list_lock);
743         BUG_ON(elevator_find(e->elevator_name));
744         list_add_tail(&e->list, &elv_list);
745         spin_unlock_irq(&elv_list_lock);
746
747         printk(KERN_INFO "io scheduler %s registered", e->elevator_name);
748         if (!strcmp(e->elevator_name, chosen_elevator) ||
749                         (!*chosen_elevator &&
750                          !strcmp(e->elevator_name, CONFIG_DEFAULT_IOSCHED)))
751                                 printk(" (default)");
752         printk("\n");
753         return 0;
754 }
755 EXPORT_SYMBOL_GPL(elv_register);
756
757 void elv_unregister(struct elevator_type *e)
758 {
759         struct task_struct *g, *p;
760
761         /*
762          * Iterate every thread in the process to remove the io contexts.
763          */
764         if (e->ops.trim) {
765                 read_lock(&tasklist_lock);
766                 do_each_thread(g, p) {
767                         task_lock(p);
768                         e->ops.trim(p->io_context);
769                         task_unlock(p);
770                 } while_each_thread(g, p);
771                 read_unlock(&tasklist_lock);
772         }
773
774         spin_lock_irq(&elv_list_lock);
775         list_del_init(&e->list);
776         spin_unlock_irq(&elv_list_lock);
777 }
778 EXPORT_SYMBOL_GPL(elv_unregister);
779
780 /*
781  * switch to new_e io scheduler. be careful not to introduce deadlocks -
782  * we don't free the old io scheduler, before we have allocated what we
783  * need for the new one. this way we have a chance of going back to the old
784  * one, if the new one fails init for some reason.
785  */
786 static int elevator_switch(request_queue_t *q, struct elevator_type *new_e)
787 {
788         elevator_t *old_elevator, *e;
789         void *data;
790
791         /*
792          * Allocate new elevator
793          */
794         e = elevator_alloc(new_e);
795         if (!e)
796                 return 0;
797
798         data = elevator_init_queue(q, e);
799         if (!data) {
800                 kobject_put(&e->kobj);
801                 return 0;
802         }
803
804         /*
805          * Turn on BYPASS and drain all requests w/ elevator private data
806          */
807         spin_lock_irq(q->queue_lock);
808
809         set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
810
811         elv_drain_elevator(q);
812
813         while (q->rq.elvpriv) {
814                 blk_remove_plug(q);
815                 q->request_fn(q);
816                 spin_unlock_irq(q->queue_lock);
817                 msleep(10);
818                 spin_lock_irq(q->queue_lock);
819                 elv_drain_elevator(q);
820         }
821
822         /*
823          * Remember old elevator.
824          */
825         old_elevator = q->elevator;
826
827         /*
828          * attach and start new elevator
829          */
830         elevator_attach(q, e, data);
831
832         spin_unlock_irq(q->queue_lock);
833
834         __elv_unregister_queue(old_elevator);
835
836         if (elv_register_queue(q))
837                 goto fail_register;
838
839         /*
840          * finally exit old elevator and turn off BYPASS.
841          */
842         elevator_exit(old_elevator);
843         clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
844         return 1;
845
846 fail_register:
847         /*
848          * switch failed, exit the new io scheduler and reattach the old
849          * one again (along with re-adding the sysfs dir)
850          */
851         elevator_exit(e);
852         q->elevator = old_elevator;
853         elv_register_queue(q);
854         clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
855         return 0;
856 }
857
858 ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count)
859 {
860         char elevator_name[ELV_NAME_MAX];
861         size_t len;
862         struct elevator_type *e;
863
864         elevator_name[sizeof(elevator_name) - 1] = '\0';
865         strncpy(elevator_name, name, sizeof(elevator_name) - 1);
866         len = strlen(elevator_name);
867
868         if (len && elevator_name[len - 1] == '\n')
869                 elevator_name[len - 1] = '\0';
870
871         e = elevator_get(elevator_name);
872         if (!e) {
873                 printk(KERN_ERR "elevator: type %s not found\n", elevator_name);
874                 return -EINVAL;
875         }
876
877         if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name)) {
878                 elevator_put(e);
879                 return count;
880         }
881
882         if (!elevator_switch(q, e))
883                 printk(KERN_ERR "elevator: switch to %s failed\n",elevator_name);
884         return count;
885 }
886
887 ssize_t elv_iosched_show(request_queue_t *q, char *name)
888 {
889         elevator_t *e = q->elevator;
890         struct elevator_type *elv = e->elevator_type;
891         struct list_head *entry;
892         int len = 0;
893
894         spin_lock_irq(q->queue_lock);
895         list_for_each(entry, &elv_list) {
896                 struct elevator_type *__e;
897
898                 __e = list_entry(entry, struct elevator_type, list);
899                 if (!strcmp(elv->elevator_name, __e->elevator_name))
900                         len += sprintf(name+len, "[%s] ", elv->elevator_name);
901                 else
902                         len += sprintf(name+len, "%s ", __e->elevator_name);
903         }
904         spin_unlock_irq(q->queue_lock);
905
906         len += sprintf(len+name, "\n");
907         return len;
908 }
909
910 EXPORT_SYMBOL(elv_dispatch_sort);
911 EXPORT_SYMBOL(elv_add_request);
912 EXPORT_SYMBOL(__elv_add_request);
913 EXPORT_SYMBOL(elv_next_request);
914 EXPORT_SYMBOL(elv_dequeue_request);
915 EXPORT_SYMBOL(elv_queue_empty);
916 EXPORT_SYMBOL(elevator_exit);
917 EXPORT_SYMBOL(elevator_init);