Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 782b86e2 authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarJens Axboe <jaxboe@fusionio.com>
parent f83e8261
Loading
Loading
Loading
Loading
+21 −21
Original line number Diff line number Diff line
@@ -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 @@ 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)