Factor out some common code. drivers/block/ll_rw_blk.c | 50 +++++++++++++++++++++------------------------- 1 files changed, 23 insertions(+), 27 deletions(-) diff -puN drivers/block/ll_rw_blk.c~blk-batching-cleanups drivers/block/ll_rw_blk.c --- 25/drivers/block/ll_rw_blk.c~blk-batching-cleanups 2003-06-26 22:14:24.000000000 -0700 +++ 25-akpm/drivers/block/ll_rw_blk.c 2003-06-26 22:18:38.000000000 -0700 @@ -1340,6 +1340,26 @@ void ioc_set_batching(struct io_context ioc->last_waited = jiffies; } +/* + * A request has just been released. Account for it, update the full and + * congestion status, wake up any waiters. Called under q->queue_lock. + */ +static void freed_request(request_queue_t *q, int rw) +{ + struct request_list *rl = &q->rq; + + rl->count[rw]--; + if (rl->count[rw] < queue_congestion_off_threshold(q)) + clear_queue_congested(q, rw); + if (rl->count[rw]+1 <= q->nr_requests) { + smp_mb(); + if (waitqueue_active(&rl->wait[rw])) + wake_up(&rl->wait[rw]); + if (!waitqueue_active(&rl->wait[rw])) + blk_clear_queue_full(q, rw); + } +} + #define blkdev_free_rq(list) list_entry((list)->next, struct request, queuelist) /* * Get a free request, queue_lock must not be held @@ -1389,18 +1409,7 @@ static struct request *get_request(reque * wait queue, but this is pretty rare. */ spin_lock_irq(q->queue_lock); - rl->count[rw]--; - if (rl->count[rw] < queue_congestion_off_threshold(q)) - clear_queue_congested(q, rw); - - if (rl->count[rw]+1 <= q->nr_requests) { - smp_mb(); - if (waitqueue_active(&rl->wait[rw])) - wake_up(&rl->wait[rw]); - if (!waitqueue_active(&rl->wait[rw])) - blk_clear_queue_full(q, rw); - } - + freed_request(q, rw); spin_unlock_irq(q->queue_lock); goto out; } @@ -1628,18 +1637,7 @@ void __blk_put_request(request_queue_t * BUG_ON(!list_empty(&req->queuelist)); blk_free_request(q, req); - - rl->count[rw]--; - if (rl->count[rw] < queue_congestion_off_threshold(q)) - clear_queue_congested(q, rw); - - if (rl->count[rw]+1 <= q->nr_requests) { - smp_mb(); - if (waitqueue_active(&rl->wait[rw])) - wake_up(&rl->wait[rw]); - if (!waitqueue_active(&rl->wait[rw])) - blk_clear_queue_full(q, rw); - } + freed_request(q, rw); } } @@ -1926,13 +1924,12 @@ out: __blk_put_request(q, freereq); if (blk_queue_plugged(q)) { - int nr_queued = q->rq.count[0] + q->rq.count[1]; + int nr_queued = q->rq.count[READ] + q->rq.count[WRITE]; if (nr_queued == q->unplug_thresh) __generic_unplug_device(q); } spin_unlock_irq(q->queue_lock); - return 0; end_io: @@ -1940,7 +1937,6 @@ end_io: return 0; } - /* * If bio->bi_dev is a partition, remap the location */ _