e->elevator_put_req_fn(q, rq);
}
+int elv_may_queue(request_queue_t *q, int rw)
+{
+ elevator_t *e = &q->elevator;
+
+ if (e->elevator_may_queue_fn)
+ return e->elevator_may_queue_fn(q, rw);
+
+ return 1;
+}
+
int elv_register_queue(struct gendisk *disk)
{
request_queue_t *q = disk->queue;
struct request_list *rl = &q->rq;
spin_lock_irq(q->queue_lock);
- if (rl->count[rw] == BLKDEV_MAX_RQ) {
+ if (rl->count[rw] == BLKDEV_MAX_RQ || !elv_may_queue(q, rw)) {
spin_unlock_irq(q->queue_lock);
goto out;
}
typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
typedef struct list_head *(elevator_get_sort_head_fn) (request_queue_t *, struct request *);
+typedef int (elevator_may_queue_fn) (request_queue_t *, int);
+
typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, int);
typedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
elevator_set_req_fn *elevator_set_req_fn;
elevator_put_req_fn *elevator_put_req_fn;
+ elevator_may_queue_fn *elevator_may_queue_fn;
+
elevator_init_fn *elevator_init_fn;
elevator_exit_fn *elevator_exit_fn;
extern struct request *elv_latter_request(request_queue_t *, struct request *);
extern int elv_register_queue(struct gendisk *);
extern void elv_unregister_queue(struct gendisk *);
+extern int elv_may_queue(request_queue_t *, int);
extern int elv_set_request(request_queue_t *, struct request *, int);
extern void elv_put_request(request_queue_t *, struct request *);