summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2003-07-17 02:01:19 -0400
committerJens Axboe <axboe@suse.de>2003-07-17 02:01:19 -0400
commitae625582ba438fdd84a3faaf225bb9aa2f2d7bb1 (patch)
tree76bd850f0da0a5471d1cc7e39d74e7e83eac103b /drivers/block
parenta75b0e155680dcc0804f26928b8cb9c5dee36145 (diff)
[PATCH] Consolidate SCSI requeueing and add blk elevator hook
This patch removes the scsi mid layer dependency on __elv_add_request and introduces a new blk_requeue_request() function so the block layer specificially knows a requeue is in progress. It also adds an elevator hook for elevators like AS which need to hook into the requeue for correct adjustment of internal counters.
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/elevator.c13
-rw-r--r--drivers/block/ll_rw_blk.c18
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c
index 00b56d022b0e..272bcb34195b 100644
--- a/drivers/block/elevator.c
+++ b/drivers/block/elevator.c
@@ -214,6 +214,18 @@ void elv_merge_requests(request_queue_t *q, struct request *rq,
e->elevator_merge_req_fn(q, rq, next);
}
+void elv_requeue_request(request_queue_t *q, struct request *rq)
+{
+ /*
+ * if iosched has an explicit requeue hook, then use that. otherwise
+ * just put the request at the front of the queue
+ */
+ if (q->elevator.elevator_requeue_req_fn)
+ q->elevator.elevator_requeue_req_fn(q, rq);
+ else
+ __elv_add_request(q, rq, 0, 0);
+}
+
void __elv_add_request(request_queue_t *q, struct request *rq, int at_end,
int plug)
{
@@ -405,6 +417,7 @@ EXPORT_SYMBOL(elevator_noop);
EXPORT_SYMBOL(elv_add_request);
EXPORT_SYMBOL(__elv_add_request);
+EXPORT_SYMBOL(elv_requeue_request);
EXPORT_SYMBOL(elv_next_request);
EXPORT_SYMBOL(elv_remove_request);
EXPORT_SYMBOL(elv_queue_empty);
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index 0f11567e5277..db399409909d 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -1355,6 +1355,23 @@ struct request *blk_get_request(request_queue_t *q, int rw, int gfp_mask)
return rq;
}
+/**
+ * blk_requeue_request - put a request back on queue
+ * @q: request queue where request should be inserted
+ * @rq: request to be inserted
+ *
+ * Description:
+ * Drivers often keep queueing requests until the hardware cannot accept
+ * more, when that condition happens we need to put the request back
+ * on the queue. Must be called with queue lock held.
+ */
+void blk_requeue_request(request_queue_t *q, struct request *rq)
+{
+ if (blk_rq_tagged(rq))
+ blk_queue_end_tag(q, rq);
+
+ elv_requeue_request(q, rq);
+}
/**
* blk_insert_request - insert a special request in to a request queue
@@ -2339,6 +2356,7 @@ EXPORT_SYMBOL(blk_hw_contig_segment);
EXPORT_SYMBOL(blk_get_request);
EXPORT_SYMBOL(blk_put_request);
EXPORT_SYMBOL(blk_insert_request);
+EXPORT_SYMBOL(blk_requeue_request);
EXPORT_SYMBOL(blk_queue_prep_rq);
EXPORT_SYMBOL(blk_queue_merge_bvec);