ide: always ensure that blk_delay_queue() is called if we have pending IO
Just because we are not requeuing a request does not mean that some aren't pending. So always issue a blk_delay_queue() if either we are requeueing OR there's pending IO. This fixes a boot problem for some IDE boxes. Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
f83e826181
commit
782b86e265
|
@ -430,6 +430,26 @@ static inline void ide_unlock_host(struct ide_host *host)
|
|||
}
|
||||
}
|
||||
|
||||
static void __ide_requeue_and_plug(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
if (rq)
|
||||
blk_requeue_request(q, rq);
|
||||
if (rq || blk_peek_request(q)) {
|
||||
/* Use 3ms as that was the old plug delay */
|
||||
blk_delay_queue(q, 3);
|
||||
}
|
||||
}
|
||||
|
||||
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
|
||||
{
|
||||
struct request_queue *q = drive->queue;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
__ide_requeue_and_plug(q, rq);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Issue a new request to a device.
|
||||
*/
|
||||
|
@ -550,27 +570,7 @@ plug_device:
|
|||
ide_unlock_host(host);
|
||||
plug_device_2:
|
||||
spin_lock_irq(q->queue_lock);
|
||||
|
||||
if (rq) {
|
||||
blk_requeue_request(q, rq);
|
||||
blk_delay_queue(q, queue_run_ms);
|
||||
}
|
||||
}
|
||||
|
||||
void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
|
||||
{
|
||||
struct request_queue *q = drive->queue;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
|
||||
if (rq)
|
||||
blk_requeue_request(q, rq);
|
||||
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
|
||||
/* Use 3ms as that was the old plug delay */
|
||||
blk_delay_queue(q, 3);
|
||||
__ide_requeue_and_plug(q, rq);
|
||||
}
|
||||
|
||||
static int drive_is_ready(ide_drive_t *drive)
|
||||
|
|
Loading…
Reference in New Issue