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:
@@ -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.
|
* Issue a new request to a device.
|
||||||
*/
|
*/
|
||||||
@@ -550,27 +570,7 @@ plug_device:
|
|||||||
ide_unlock_host(host);
|
ide_unlock_host(host);
|
||||||
plug_device_2:
|
plug_device_2:
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
|
__ide_requeue_and_plug(q, rq);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drive_is_ready(ide_drive_t *drive)
|
static int drive_is_ready(ide_drive_t *drive)
|
||||||
|
Reference in New Issue
Block a user