ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / block / noop-iosched.c
1 /*
2  * elevator noop
3  */
4 #include <linux/kernel.h>
5 #include <linux/fs.h>
6 #include <linux/blkdev.h>
7 #include <linux/elevator.h>
8 #include <linux/bio.h>
9 #include <linux/config.h>
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/init.h>
13 #include <linux/compiler.h>
14
15 #include <asm/uaccess.h>
16
17 /*
18  * See if we can find a request that this buffer can be coalesced with.
19  */
20 int elevator_noop_merge(request_queue_t *q, struct request **req,
21                         struct bio *bio)
22 {
23         struct list_head *entry = &q->queue_head;
24         struct request *__rq;
25         int ret;
26
27         if ((ret = elv_try_last_merge(q, bio))) {
28                 *req = q->last_merge;
29                 return ret;
30         }
31
32         while ((entry = entry->prev) != &q->queue_head) {
33                 __rq = list_entry_rq(entry);
34
35                 if (__rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER))
36                         break;
37                 else if (__rq->flags & REQ_STARTED)
38                         break;
39
40                 if (!blk_fs_request(__rq))
41                         continue;
42
43                 if ((ret = elv_try_merge(__rq, bio))) {
44                         *req = __rq;
45                         q->last_merge = __rq;
46                         return ret;
47                 }
48         }
49
50         return ELEVATOR_NO_MERGE;
51 }
52
53 void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
54                                   struct request *next)
55 {
56         list_del_init(&next->queuelist);
57 }
58
59 void elevator_noop_add_request(request_queue_t *q, struct request *rq,
60                                int where)
61 {
62         struct list_head *insert = q->queue_head.prev;
63
64         if (where == ELEVATOR_INSERT_FRONT)
65                 insert = &q->queue_head;
66
67         list_add_tail(&rq->queuelist, &q->queue_head);
68
69         /*
70          * new merges must not precede this barrier
71          */
72         if (rq->flags & REQ_HARDBARRIER)
73                 q->last_merge = NULL;
74         else if (!q->last_merge)
75                 q->last_merge = rq;
76 }
77
78 struct request *elevator_noop_next_request(request_queue_t *q)
79 {
80         if (!list_empty(&q->queue_head))
81                 return list_entry_rq(q->queue_head.next);
82
83         return NULL;
84 }
85
86 elevator_t elevator_noop = {
87         .elevator_merge_fn              = elevator_noop_merge,
88         .elevator_merge_req_fn          = elevator_noop_merge_requests,
89         .elevator_next_req_fn           = elevator_noop_next_request,
90         .elevator_add_req_fn            = elevator_noop_add_request,
91         .elevator_name                  = "noop",
92 };
93
94 EXPORT_SYMBOL(elevator_noop);