111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/****************************************************************************
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   This header was automatically generated from a Linux kernel header
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   of the same name, to make information necessary for userspace to
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   call into the kernel available to libc.  It contains only constants,
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   structures, and macros generated from the original header, and thus,
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   contains no copyrightable information.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LINUX_ELEVATOR_H
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LINUX_ELEVATOR_H
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (elevator_merge_fn) (request_queue_t *, struct request **,
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio *);
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *);
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_merged_fn) (request_queue_t *, struct request *);
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (elevator_dispatch_fn) (request_queue_t *, int);
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_add_req_fn) (request_queue_t *, struct request *);
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (elevator_queue_empty_fn) (request_queue_t *);
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *);
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, gfp_t);
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_activate_req_fn) (request_queue_t *, struct request *);
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *);
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void *(elevator_init_fn) (request_queue_t *, elevator_t *);
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (elevator_exit_fn) (elevator_t *);
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct elevator_ops
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_merge_fn *elevator_merge_fn;
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_merged_fn *elevator_merged_fn;
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_merge_req_fn *elevator_merge_req_fn;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_dispatch_fn *elevator_dispatch_fn;
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_add_req_fn *elevator_add_req_fn;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_activate_req_fn *elevator_activate_req_fn;
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_deactivate_req_fn *elevator_deactivate_req_fn;
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_queue_empty_fn *elevator_queue_empty_fn;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_completed_req_fn *elevator_completed_req_fn;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_request_list_fn *elevator_former_req_fn;
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_request_list_fn *elevator_latter_req_fn;
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_set_req_fn *elevator_set_req_fn;
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_put_req_fn *elevator_put_req_fn;
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_may_queue_fn *elevator_may_queue_fn;
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_init_fn *elevator_init_fn;
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elevator_exit_fn *elevator_exit_fn;
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*trim)(struct io_context *);
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELV_NAME_MAX (16)
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct elv_fs_entry {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(elevator_t *, char *);
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(elevator_t *, const char *, size_t);
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct elevator_type
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head list;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct elevator_ops ops;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct elevator_type *elevator_type;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct elv_fs_entry *elevator_attrs;
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char elevator_name[ELV_NAME_MAX];
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct module *elevator_owner;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct elevator_queue
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct elevator_ops *ops;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *elevator_data;
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj;
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct elevator_type *elevator_type;
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mutex sysfs_lock;
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_NO_MERGE 0
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_FRONT_MERGE 1
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_BACK_MERGE 2
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_INSERT_FRONT 1
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_INSERT_BACK 2
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_INSERT_SORT 3
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ELEVATOR_INSERT_REQUEUE 4
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertenum {
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ELV_MQUEUE_MAY,
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ELV_MQUEUE_NO,
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ELV_MQUEUE_MUST,
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define rq_end_sector(rq) ((rq)->sector + (rq)->nr_sectors)
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
110