Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6:
  Revert "ide: improve handling of Power Management requests"
This commit is contained in:
Linus Torvalds 2009-07-06 16:47:15 -07:00
commit e5a7675dd5
1 changed files with 32 additions and 22 deletions

View File

@ -466,14 +466,10 @@ void do_ide_request(struct request_queue *q)
if (!ide_lock_port(hwif)) { if (!ide_lock_port(hwif)) {
ide_hwif_t *prev_port; ide_hwif_t *prev_port;
WARN_ON_ONCE(hwif->rq);
repeat: repeat:
prev_port = hwif->host->cur_port; prev_port = hwif->host->cur_port;
if (drive->dev_flags & IDE_DFLAG_BLOCKED)
rq = hwif->rq;
else
WARN_ON_ONCE(hwif->rq);
if (drive->dev_flags & IDE_DFLAG_SLEEPING && if (drive->dev_flags & IDE_DFLAG_SLEEPING &&
time_after(drive->sleep, jiffies)) { time_after(drive->sleep, jiffies)) {
ide_unlock_port(hwif); ide_unlock_port(hwif);
@ -500,29 +496,43 @@ repeat:
hwif->cur_dev = drive; hwif->cur_dev = drive;
drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED); drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED);
if (rq == NULL) { spin_unlock_irq(&hwif->lock);
spin_unlock_irq(&hwif->lock); spin_lock_irq(q->queue_lock);
spin_lock_irq(q->queue_lock); /*
/* * we know that the queue isn't empty, but this can happen
* we know that the queue isn't empty, but this can * if the q->prep_rq_fn() decides to kill a request
* happen if ->prep_rq_fn() decides to kill a request */
*/ if (!rq)
rq = blk_fetch_request(drive->queue); rq = blk_fetch_request(drive->queue);
spin_unlock_irq(q->queue_lock);
spin_lock_irq(&hwif->lock);
if (rq == NULL) { spin_unlock_irq(q->queue_lock);
ide_unlock_port(hwif); spin_lock_irq(&hwif->lock);
goto out;
} if (!rq) {
ide_unlock_port(hwif);
goto out;
} }
/* /*
* Sanity: don't accept a request that isn't a PM request * Sanity: don't accept a request that isn't a PM request
* if we are currently power managed. * if we are currently power managed. This is very important as
* blk_stop_queue() doesn't prevent the blk_fetch_request()
* above to return us whatever is in the queue. Since we call
* ide_do_request() ourselves, we end up taking requests while
* the queue is blocked...
*
* We let requests forced at head of queue with ide-preempt
* though. I hope that doesn't happen too much, hopefully not
* unless the subdriver triggers such a thing in its own PM
* state machine.
*/ */
BUG_ON((drive->dev_flags & IDE_DFLAG_BLOCKED) && if ((drive->dev_flags & IDE_DFLAG_BLOCKED) &&
blk_pm_request(rq) == 0); blk_pm_request(rq) == 0 &&
(rq->cmd_flags & REQ_PREEMPT) == 0) {
/* there should be no pending command at this point */
ide_unlock_port(hwif);
goto plug_device;
}
hwif->rq = rq; hwif->rq = rq;