Jeff Garzik wrote:
Tejun Heo wrote:
Implement new EH scheduling from timeout. ata_scsi_timedout() also
takes care of the race condition in which scsi_eh_schedule_qc() sets
ATA_QCFLAG_EH_SCHEDULED but fails to acutally schedule EH for the qc
because it loses to timeout.
A timeout is HSM violation condition. New EH assumes that on a
timeout the state of the controller and devices are unknown and
dangerous. So, all active commands are aborted and the port is
frozen. Note that commands which get aborted this way don't have its
qc->err_mask set and its retries count will be compensated.
Signed-off-by: Tejun Heo <htejun@xxxxxxxxx>
This is not always true: With PCI IDE BMDMA devices, it is presumed
that a DMA error will be handled by timeout. For this case, the
controller is in a known state.
The problem is that the timeout handler doesn't have anyway to determine
whether the timeout is from real timeout or from DMA error, and the
timeout handler is responsible for transferring the ownership the failed
port to EH. EH, on entry, must be guaranteed that it owns the port if
it's not frozen.
One way around this would be making a new callback, say,
->timeout_autopsy and let it decide whether the port needs freezing or
not, but it would be an overkill. The only side effect of being frozen
is that the port will get a softreset to thaw it, which isn't so bad - I
want my controller to get a good spanking in the ass after sitting idle
for 30secs.
--
tejun
-
: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html