Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
| 2 | * elevator noop |
| 3 | */ |
| 4 | #include <linux/blkdev.h> |
| 5 | #include <linux/elevator.h> |
| 6 | #include <linux/bio.h> |
| 7 | #include <linux/module.h> |
| 8 | #include <linux/init.h> |
| 9 | |
| 10 | /* |
| 11 | * See if we can find a request that this buffer can be coalesced with. |
| 12 | */ |
| 13 | static int elevator_noop_merge(request_queue_t *q, struct request **req, |
| 14 | struct bio *bio) |
| 15 | { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 | int ret; |
| 17 | |
Jens Axboe | 1181c1f | 2005-05-01 08:59:06 -0700 | [diff] [blame] | 18 | ret = elv_try_last_merge(q, bio); |
| 19 | if (ret != ELEVATOR_NO_MERGE) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 20 | *req = q->last_merge; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 21 | |
Jens Axboe | 1181c1f | 2005-05-01 08:59:06 -0700 | [diff] [blame] | 22 | return ret; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 | } |
| 24 | |
| 25 | static void elevator_noop_merge_requests(request_queue_t *q, struct request *req, |
| 26 | struct request *next) |
| 27 | { |
| 28 | list_del_init(&next->queuelist); |
| 29 | } |
| 30 | |
| 31 | static void elevator_noop_add_request(request_queue_t *q, struct request *rq, |
| 32 | int where) |
| 33 | { |
| 34 | if (where == ELEVATOR_INSERT_FRONT) |
| 35 | list_add(&rq->queuelist, &q->queue_head); |
| 36 | else |
| 37 | list_add_tail(&rq->queuelist, &q->queue_head); |
| 38 | |
| 39 | /* |
| 40 | * new merges must not precede this barrier |
| 41 | */ |
| 42 | if (rq->flags & REQ_HARDBARRIER) |
| 43 | q->last_merge = NULL; |
| 44 | else if (!q->last_merge) |
| 45 | q->last_merge = rq; |
| 46 | } |
| 47 | |
| 48 | static struct request *elevator_noop_next_request(request_queue_t *q) |
| 49 | { |
| 50 | if (!list_empty(&q->queue_head)) |
| 51 | return list_entry_rq(q->queue_head.next); |
| 52 | |
| 53 | return NULL; |
| 54 | } |
| 55 | |
| 56 | static struct elevator_type elevator_noop = { |
| 57 | .ops = { |
| 58 | .elevator_merge_fn = elevator_noop_merge, |
| 59 | .elevator_merge_req_fn = elevator_noop_merge_requests, |
| 60 | .elevator_next_req_fn = elevator_noop_next_request, |
| 61 | .elevator_add_req_fn = elevator_noop_add_request, |
| 62 | }, |
| 63 | .elevator_name = "noop", |
| 64 | .elevator_owner = THIS_MODULE, |
| 65 | }; |
| 66 | |
| 67 | static int __init noop_init(void) |
| 68 | { |
| 69 | return elv_register(&elevator_noop); |
| 70 | } |
| 71 | |
| 72 | static void __exit noop_exit(void) |
| 73 | { |
| 74 | elv_unregister(&elevator_noop); |
| 75 | } |
| 76 | |
| 77 | module_init(noop_init); |
| 78 | module_exit(noop_exit); |
| 79 | |
| 80 | |
| 81 | MODULE_AUTHOR("Jens Axboe"); |
| 82 | MODULE_LICENSE("GPL"); |
| 83 | MODULE_DESCRIPTION("No-op IO scheduler"); |