drivers/block/elevator.c  |   10 ++++++++++
 drivers/block/ll_rw_blk.c |    4 ++--
 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	2003-05-28 03:10:42.000000000 -0700
+++ 25-akpm/drivers/block/elevator.c	2003-05-28 03:10:42.000000000 -0700
@@ -361,6 +361,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	2003-05-28 03:10:42.000000000 -0700
+++ 25-akpm/drivers/block/ll_rw_blk.c	2003-05-28 03:10:42.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;
 
 unsigned long blk_max_low_pfn, blk_max_pfn;
 int blk_nohighio = 0;
@@ -1322,7 +1322,7 @@ static struct request *get_request(reque
 	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;
 	}
diff -puN include/linux/elevator.h~cfq-infrastructure include/linux/elevator.h
--- 25/include/linux/elevator.h~cfq-infrastructure	2003-05-28 03:10:42.000000000 -0700
+++ 25-akpm/include/linux/elevator.h	2003-05-28 03:10:42.000000000 -0700
@@ -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;
 
@@ -64,6 +68,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 *);
 

_