drivers/block/elevator.c | 10 ++++++++++ drivers/block/ll_rw_blk.c | 6 +++--- include/linux/elevator.h | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff -puN drivers/block/elevator.c~cfq-infrastructure drivers/block/elevator.c --- 25/drivers/block/elevator.c~cfq-infrastructure 2003-04-20 18:05:44.000000000 -0700 +++ 25-akpm/drivers/block/elevator.c 2003-04-20 18:05:44.000000000 -0700 @@ -408,6 +408,16 @@ struct request *elv_former_request(reque return NULL; } +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; diff -puN drivers/block/ll_rw_blk.c~cfq-infrastructure drivers/block/ll_rw_blk.c --- 25/drivers/block/ll_rw_blk.c~cfq-infrastructure 2003-04-20 18:05:44.000000000 -0700 +++ 25-akpm/drivers/block/ll_rw_blk.c 2003-04-20 18:05:44.000000000 -0700 @@ -46,7 +46,7 @@ static spinlock_t blk_plug_lock __cachel * Number of requests per queue. This many for reads and for writes (twice * this number, total). */ -static int queue_nr_requests; +int queue_nr_requests; /* * How many free requests must be available before we wake a process which @@ -1296,7 +1296,7 @@ static struct request *get_request(reque struct request *rq = NULL; struct request_list *rl = q->rq + rw; - if (!list_empty(&rl->free)) { + if (!list_empty(&rl->free) && elv_may_queue(q, rw)) { rq = blkdev_free_rq(&rl->free); list_del_init(&rq->queuelist); rq->ref_count = 1; @@ -1337,7 +1337,7 @@ static struct request *get_request_wait( prepare_to_wait_exclusive(&rl->wait, &wait, TASK_UNINTERRUPTIBLE); spin_lock_irq(q->queue_lock); - if (!rl->count) + if (!rl->count || !elv_may_queue(q, rw)) block = 1; spin_unlock_irq(q->queue_lock); diff -puN include/linux/elevator.h~cfq-infrastructure include/linux/elevator.h --- 25/include/linux/elevator.h~cfq-infrastructure 2003-04-20 18:05:44.000000000 -0700 +++ 25-akpm/include/linux/elevator.h 2003-04-20 18:05:44.000000000 -0700 @@ -15,6 +15,7 @@ typedef int (elevator_queue_empty_fn) (r 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_init_fn) (request_queue_t *, elevator_t *); typedef void (elevator_exit_fn) (request_queue_t *, elevator_t *); @@ -34,6 +35,8 @@ struct elevator_s elevator_request_list_fn *elevator_former_req_fn; elevator_request_list_fn *elevator_latter_req_fn; + elevator_may_queue_fn *elevator_may_queue_fn; + elevator_init_fn *elevator_init_fn; elevator_exit_fn *elevator_exit_fn; @@ -58,6 +61,7 @@ extern struct request *elv_former_reques 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); #define __elv_add_request_pos(q, rq, pos) \ (q)->elevator.elevator_add_req_fn((q), (rq), (pos)) _