/* * elevator noop */ #include #include #include #include #include /* * 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");