This allows SCSI to survive the I/O queueing stress harness with AS.
Jens has signed off on it, and Mark Havercamp confirms it also
eliminates the test induced hangs for him too.
* @rq: request to be inserted
* @at_head: insert request at head or tail of queue
* @data: private data
+ * @reinsert: true if request it a reinsertion of previously processed one
*
* Description:
* Many block devices need to execute commands asynchronously, so they don't
* host that is unable to accept a particular command.
*/
void blk_insert_request(request_queue_t *q, struct request *rq,
- int at_head, void *data)
+ int at_head, void *data, int reinsert)
{
unsigned long flags;
/*
* If command is tagged, release the tag
*/
- if (blk_rq_tagged(rq))
- blk_queue_end_tag(q, rq);
+ if(reinsert) {
+ blk_requeue_request(q, rq);
+ } else {
+ if (blk_rq_tagged(rq))
+ blk_queue_end_tag(q, rq);
- drive_stat_acct(rq, rq->nr_sectors, 1);
- __elv_add_request(q, rq, !at_head, 0);
+ drive_stat_acct(rq, rq->nr_sectors, 1);
+ __elv_add_request(q, rq, !at_head, 0);
+ }
q->request_fn(q);
spin_unlock_irqrestore(q->queue_lock, flags);
}
*/
sreq->sr_request->flags &= ~REQ_DONTPREP;
blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request,
- at_head, sreq);
+ at_head, sreq, 0);
return 0;
}
* function. The SCSI request function detects the blocked condition
* and plugs the queue appropriately.
*/
- blk_insert_request(device->request_queue, cmd->request, 1, cmd);
+ blk_insert_request(device->request_queue, cmd->request, 1, cmd, 1);
return 0;
}
static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
{
cmd->request->flags &= ~REQ_DONTPREP;
- blk_insert_request(q, cmd->request, 1, cmd);
+ blk_insert_request(q, cmd->request, 1, cmd, 1);
scsi_run_queue(q);
}
extern void __blk_attempt_remerge(request_queue_t *, struct request *);
extern struct request *blk_get_request(request_queue_t *, int, int);
extern void blk_put_request(struct request *);
-extern void blk_insert_request(request_queue_t *, struct request *, int, void *);
+extern void blk_insert_request(request_queue_t *, struct request *, int, void *, int);
extern void blk_requeue_request(request_queue_t *, struct request *);
extern void blk_plug_device(request_queue_t *);
extern int blk_remove_plug(request_queue_t *);