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-17 21:40:44.000000000 -0700
+++ 25-akpm/drivers/block/elevator.c	2003-04-17 21:40: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-17 21:40:44.000000000 -0700
+++ 25-akpm/drivers/block/ll_rw_blk.c	2003-04-17 21:42:37.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
@@ -1309,7 +1309,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;
@@ -1350,7 +1350,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-17 21:40:44.000000000 -0700
+++ 25-akpm/include/linux/elevator.h	2003-04-17 21:42:37.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))

_