summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2003-07-04 19:36:23 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-07-04 19:36:23 -0700
commit104e6fdc6f35ea08e1c6ed03158b336b2e9983ed (patch)
tree1a71ac3ab118e44192fe9aa38a6aec11134663b1 /drivers
parent7d2483a936d9012f0a8ed9b61e191d6b827a66d2 (diff)
[PATCH] elevator completion API
From: Nick Piggin <piggin@cyberone.com.au> Introduces an elevator_completed_req() callback with which the generic queueing layer may tell an IO scheduler that a particualr request has finished.
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/elevator.c9
-rw-r--r--drivers/block/ll_rw_blk.c2
2 files changed, 11 insertions, 0 deletions
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c
index bf40a06781d5..406755724e03 100644
--- a/drivers/block/elevator.c
+++ b/drivers/block/elevator.c
@@ -371,6 +371,14 @@ int elv_may_queue(request_queue_t *q, int rw)
return 1;
}
+void elv_completed_request(request_queue_t *q, struct request *rq)
+{
+ elevator_t *e = &q->elevator;
+
+ if (e->elevator_completed_req_fn)
+ e->elevator_completed_req_fn(q, rq);
+}
+
int elv_register_queue(struct gendisk *disk)
{
request_queue_t *q = disk->queue;
@@ -418,5 +426,6 @@ EXPORT_SYMBOL(__elv_add_request);
EXPORT_SYMBOL(elv_next_request);
EXPORT_SYMBOL(elv_remove_request);
EXPORT_SYMBOL(elv_queue_empty);
+EXPORT_SYMBOL(elv_completed_request);
EXPORT_SYMBOL(elevator_exit);
EXPORT_SYMBOL(elevator_init);
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index 1debfebc2f57..71750da0db6d 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -1510,6 +1510,8 @@ void __blk_put_request(request_queue_t *q, struct request *req)
if (unlikely(--req->ref_count))
return;
+ elv_completed_request(req->q, req);
+
req->rq_status = RQ_INACTIVE;
req->q = NULL;
req->rl = NULL;