| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * 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");
|