Hi Boaz, Jens,
On Sun, 14 Sep 2008 16:10:58 +0300, Boaz Harrosh wrote:
They might look simlar but don't have much in common actually.
I could refactor them like the attached patch, but I'm not sure
this is a correct way and this is cleaner than the current code.
(e.g. blk_execute_rq_nowait() can't be called with irqs-disabled,
but blk_insert_request() and my blk_submit_request() can be called
with irqs-disabled.)
So I'd leave them as it is unless you or others strongly prefer
the attached patch...
Anyway, I would like to leave the refactoring as a separate patch,
since it's not so straightforward.
blk_insert_request() is in blk-core.c and it is similar to
blk_submit_request(), so I added it to blk-core.c.
But maybe both should be in blk-exec.c.
I don't have any problem on this, I'd like to hear Jens' opinion.
Thanks,
Kiyoshi Ueda
---
block/blk-core.c | 20 +++----------------
block/blk-exec.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 54 insertions(+), 23 deletions(-)
Index: linux-2.6-block/block/blk-core.c
===================================================================
--- linux-2.6-block.orig/block/blk-core.c
+++ linux-2.6-block/block/blk-core.c
@@ -881,7 +881,7 @@ EXPORT_SYMBOL(blk_get_request);
*/
void blk_start_queueing(struct request_queue *q)
{
- if (!blk_queue_plugged(q))
+ if (!blk_queue_plugged(q) && !blk_queue_stopped(q))
q->request_fn(q);
else
__generic_unplug_device(q);
@@ -930,11 +930,10 @@ EXPORT_SYMBOL(blk_requeue_request);
* of the queue for things like a QUEUE_FULL message from a device, or a
* host that is unable to accept a particular command.
*/
-void blk_insert_request(struct request_queue *q, struct request *rq,
- int at_head, void *data)
+void blk_insert_special_request(struct request_queue *q, struct request *rq,
+ int at_head, void *data)
{
int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
- unsigned long flags;
/*
* tell I/O scheduler that this isn't a regular read/write (ie it
@@ -946,18 +945,7 @@ void blk_insert_request(struct request_q
rq->special = data;
- spin_lock_irqsave(q->queue_lock, flags);
-
- /*
- * If command is tagged, release the tag
- */
- if (blk_rq_tagged(rq))
- blk_queue_end_tag(q, rq);
-
- drive_stat_acct(rq, 1);
- __elv_add_request(q, rq, where, 0);
- blk_start_queueing(q);
- spin_unlock_irqrestore(q->queue_lock, flags);
+ blk_insert_request(q, rq, where, 1);
}
EXPORT_SYMBOL(blk_insert_request);
Index: linux-2.6-block/block/blk-exec.c
===================================================================
--- linux-2.6-block.orig/block/blk-exec.c
+++ linux-2.6-block/block/blk-exec.c
@@ -33,6 +33,46 @@ static void blk_end_sync_rq(struct reque
}
/**
+ * blk_insert_request - Helper function for inserting a request
+ * @q: request queue where request should be inserted
+ * @rq: request to be inserted
+ * @where: where insert request to
+ * @run_queue: run the queue or not
+ */
+static void blk_insert_request(struct request_queue *q, struct request *rq,
+ int where, int run_queue)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(q->queue_lock, flags);
+
+ /*
+ * Submitting request must be dequeued before calling this function
+ * because it will be linked to another request_queue
+ */
+ BUG_ON(blk_queued_rq(rq));
+
+ /*
+ * If command is tagged, release the tag
+ */
+ if (blk_rq_tagged(rq))
+ blk_queue_end_tag(q, rq);
+
+ drive_stat_acct(rq, 1);
+ __elv_add_request(q, rq, where, 0);
+
+ if (run_queue) {
+ blk_start_queueing(q);
+
+ /* the queue is stopped so it won't be plugged+unplugged */
+ if (blk_pm_resume_request(rq))
+ q->request_fn(q);
+ }
+
+ spin_unlock_irqrestore(q->queue_lock, flags);
+}
+
+/**
* blk_execute_rq_nowait - insert a request into queue for execution
* @q: queue to insert the request in
* @bd_disk: matching gendisk
@@ -54,13 +94,7 @@ void blk_execute_rq_nowait(struct reques
rq->cmd_flags |= REQ_NOMERGE;
rq->end_io = done;
WARN_ON(irqs_disabled());
- spin_lock_irq(q->queue_lock);
- __elv_add_request(q, rq, where, 1);
- __generic_unplug_device(q);
- /* the queue is stopped so it won't be plugged+unplugged */
- if (blk_pm_resume_request(rq))
- q->request_fn(q);
- spin_unlock_irq(q->queue_lock);
+ blk_insert_request(q, rq, where, 1);
}
EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
@@ -104,3 +138,12 @@ int blk_execute_rq(struct request_queue
return err;
}
EXPORT_SYMBOL(blk_execute_rq);
+
+int blk_insert_clone_request(struct request_queue *q, struct request *rq)
+{
+ if (blk_rq_check_limits(q, rq))
+ return -EIO;
+
+ blk_insert_request(q, rq, ELEVATOR_INSERT_BACK, 0);
+}
+EXPORT_SYMBOL_GPL(blk_insert_clone_request);
--