Skip to content

Commit

Permalink
ide: always ensure that blk_delay_queue() is called if we have pendin…
Browse files Browse the repository at this point in the history
…g 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>
  • Loading branch information
Jens Axboe committed Apr 5, 2011
1 parent f83e826 commit 782b86e
Showing 1 changed file with 21 additions and 21 deletions.
42 changes: 21 additions & 21 deletions drivers/ide/ide-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down Expand Up @@ -550,27 +570,7 @@ void do_ide_request(struct request_queue *q)
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)
Expand Down

0 comments on commit 782b86e

Please sign in to comment.