1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_ELEVATOR_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_ELEVATOR_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_merge_fn) (request_queue_t *, struct request **,
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 struct bio *);
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *);
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_merged_fn) (request_queue_t *, struct request *);
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_dispatch_fn) (request_queue_t *, int);
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_add_req_fn) (request_queue_t *, struct request *);
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_queue_empty_fn) (request_queue_t *);
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *);
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, gfp_t);
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_activate_req_fn) (request_queue_t *, struct request *);
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *);
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void *(elevator_init_fn) (request_queue_t *, elevator_t *);
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_exit_fn) (elevator_t *);
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_ops
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_merge_fn *elevator_merge_fn;
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_merged_fn *elevator_merged_fn;
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_merge_req_fn *elevator_merge_req_fn;
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_dispatch_fn *elevator_dispatch_fn;
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_add_req_fn *elevator_add_req_fn;
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_activate_req_fn *elevator_activate_req_fn;
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_deactivate_req_fn *elevator_deactivate_req_fn;
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_queue_empty_fn *elevator_queue_empty_fn;
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_completed_req_fn *elevator_completed_req_fn;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_request_list_fn *elevator_former_req_fn;
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_request_list_fn *elevator_latter_req_fn;
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_set_req_fn *elevator_set_req_fn;
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_put_req_fn *elevator_put_req_fn;
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_may_queue_fn *elevator_may_queue_fn;
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_init_fn *elevator_init_fn;
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	elevator_exit_fn *elevator_exit_fn;
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*trim)(struct io_context *);
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELV_NAME_MAX	(16)
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elv_fs_entry {
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct attribute attr;
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ssize_t (*show)(elevator_t *, char *);
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ssize_t (*store)(elevator_t *, const char *, size_t);
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * identifies an elevator type, such as AS or deadline
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_type
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head list;
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct elevator_ops ops;
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct elevator_type *elevator_type;
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct elv_fs_entry *elevator_attrs;
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char elevator_name[ELV_NAME_MAX];
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct module *elevator_owner;
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * each queue has an elevator_queue associated with it
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_queue
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct elevator_ops *ops;
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void *elevator_data;
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct kobject kobj;
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct elevator_type *elevator_type;
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct mutex sysfs_lock;
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * block elevator interface
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_dispatch_sort(request_queue_t *, struct request *);
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_add_request(request_queue_t *, struct request *, int, int);
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __elv_add_request(request_queue_t *, struct request *, int, int);
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_insert(request_queue_t *, struct request *, int);
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_merge(request_queue_t *, struct request **, struct bio *);
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_merge_requests(request_queue_t *, struct request *,
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       struct request *);
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_merged_request(request_queue_t *, struct request *);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_dequeue_request(request_queue_t *, struct request *);
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_requeue_request(request_queue_t *, struct request *);
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_queue_empty(request_queue_t *);
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_next_request(struct request_queue *q);
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_former_request(request_queue_t *, struct request *);
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_latter_request(request_queue_t *, struct request *);
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_register_queue(request_queue_t *q);
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_unregister_queue(request_queue_t *q);
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_may_queue(request_queue_t *, int, struct bio *);
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_completed_request(request_queue_t *, struct request *);
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t);
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_put_request(request_queue_t *, struct request *);
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * io scheduler registration
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_register(struct elevator_type *);
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_unregister(struct elevator_type *);
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * io scheduler sysfs switching
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ssize_t elv_iosched_show(request_queue_t *, char *);
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ssize_t elv_iosched_store(request_queue_t *, const char *, size_t);
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elevator_init(request_queue_t *, char *);
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elevator_exit(elevator_t *);
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_rq_merge_ok(struct request *, struct bio *);
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return values from elevator merger
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_NO_MERGE	0
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_FRONT_MERGE	1
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_BACK_MERGE	2
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Insertion selection
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_FRONT	1
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_BACK	2
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_SORT	3
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_REQUEUE	4
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * return values from elevator_may_queue_fn
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum {
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ELV_MQUEUE_MAY,
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ELV_MQUEUE_NO,
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ELV_MQUEUE_MUST,
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define rq_end_sector(rq)	((rq)->sector + (rq)->nr_sectors)
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
154