| /* |
| * elevator noop |
| */ |
| #include <linux/blkdev.h> |
| #include <linux/elevator.h> |
| #include <linux/bio.h> |
| #include <linux/module.h> |
| #include <linux/init.h> |
| |
| /* |
| * See if we can find a request that this buffer can be coalesced with. |
| */ |
| static int elevator_noop_merge(request_queue_t *q, struct request **req, |
| struct bio *bio) |
| { |
| struct list_head *entry = &q->queue_head; |
| struct request *__rq; |
| int ret; |
| |
| if ((ret = elv_try_last_merge(q, bio))) { |
| *req = q->last_merge; |
| return ret; |
| } |
| |
| while ((entry = entry->prev) != &q->queue_head) { |
| __rq = list_entry_rq(entry); |
| |
| if (__rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)) |
| break; |
| else if (__rq->flags & REQ_STARTED) |
| break; |
| |
| if (!blk_fs_request(__rq)) |
| continue; |
| |
| if ((ret = elv_try_merge(__rq, bio))) { |
| *req = __rq; |
| q->last_merge = __rq; |
| return ret; |
| } |
| } |
| |
| return ELEVATOR_NO_MERGE; |
| } |
| |
| static void elevator_noop_merge_requests(request_queue_t *q, struct request *req, |
| struct request *next) |
| { |
| list_del_init(&next->queuelist); |
| } |
| |
| static void elevator_noop_add_request(request_queue_t *q, struct request *rq, |
| int where) |
| { |
| if (where == ELEVATOR_INSERT_FRONT) |
| list_add(&rq->queuelist, &q->queue_head); |
| else |
| list_add_tail(&rq->queuelist, &q->queue_head); |
| |
| /* |
| * new merges must not precede this barrier |
| */ |
| if (rq->flags & REQ_HARDBARRIER) |
| q->last_merge = NULL; |
| else if (!q->last_merge) |
| q->last_merge = rq; |
| } |
| |
| static struct request *elevator_noop_next_request(request_queue_t *q) |
| { |
| if (!list_empty(&q->queue_head)) |
| return list_entry_rq(q->queue_head.next); |
| |
| return NULL; |
| } |
| |
| static struct elevator_type elevator_noop = { |
| .ops = { |
| .elevator_merge_fn = elevator_noop_merge, |
| .elevator_merge_req_fn = elevator_noop_merge_requests, |
| .elevator_next_req_fn = elevator_noop_next_request, |
| .elevator_add_req_fn = elevator_noop_add_request, |
| }, |
| .elevator_name = "noop", |
| .elevator_owner = THIS_MODULE, |
| }; |
| |
| static int __init noop_init(void) |
| { |
| return elv_register(&elevator_noop); |
| } |
| |
| static void __exit noop_exit(void) |
| { |
| elv_unregister(&elevator_noop); |
| } |
| |
| module_init(noop_init); |
| module_exit(noop_exit); |
| |
| |
| MODULE_AUTHOR("Jens Axboe"); |
| MODULE_LICENSE("GPL"); |
| MODULE_DESCRIPTION("No-op IO scheduler"); |