25-akpm/drivers/block/elevator.c | 10 ++++++++++ 25-akpm/drivers/block/ll_rw_blk.c | 4 ++-- 25-akpm/include/linux/elevator.h | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff -puN drivers/block/elevator.c~cfq-infrastructure drivers/block/elevator.c --- 25/drivers/block/elevator.c~cfq-infrastructure Wed Apr 30 15:12:03 2003 +++ 25-akpm/drivers/block/elevator.c Wed Apr 30 15:12:03 2003 @@ -427,6 +427,16 @@ void elv_put_request(request_queue_t *q, 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; 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 Wed Apr 30 15:12:03 2003 +++ 25-akpm/drivers/block/ll_rw_blk.c Wed Apr 30 15:16:31 2003 @@ -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; unsigned long blk_max_low_pfn, blk_max_pfn; int blk_nohighio = 0; @@ -1260,7 +1260,7 @@ static struct request *get_request(reque spin_lock_irq(q->queue_lock); BUG_ON(rl->count[rw] < 0); - if (rl->count[rw] == 0) { + if (rl->count[rw] == 0 || !elv_may_queue(q, rw)) { spin_unlock_irq(q->queue_lock); goto out; } diff -puN include/linux/elevator.h~cfq-infrastructure include/linux/elevator.h --- 25/include/linux/elevator.h~cfq-infrastructure Wed Apr 30 15:12:03 2003 +++ 25-akpm/include/linux/elevator.h Wed Apr 30 15:18:35 2003 @@ -15,6 +15,8 @@ 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_set_req_fn) (request_queue_t *, struct request *, int); typedef void (elevator_put_req_fn) (request_queue_t *, struct request *); @@ -39,6 +41,8 @@ struct elevator_s 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; @@ -63,6 +67,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); extern int elv_set_request(request_queue_t *, struct request *, int); extern void elv_put_request(request_queue_t *, struct request *); _