libata: clear dev->ering in smarter way
dev->ering used to be cleared together with the rest of ata_device in ata_dev_init() which is called whenever a probing event occurs. dev->ering is about to be used to track probing failures so it needs to remain persistent over multiple porbing events. This patch achieves this by doing the following. * Instead of CLEAR_OFFSET, define CLEAR_BEGIN and CLEAR_END and only clear between BEGIN and END. ering is moved after END. The split of persistent area is to allow hotter items remain at the head. * ering is explicitly cleared on ata_dev_disable() and when device attach succeeds. So, ering is persistent throug a device's life time (unless explicitly cleared of course) and also through periods inbetween disablement of an attached device and successful detection of the next one. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
@@ -1194,6 +1194,11 @@ void ata_dev_disable(struct ata_device *dev)
|
||||
ata_acpi_on_disable(dev);
|
||||
ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ATA_DNXFER_QUIET);
|
||||
dev->class++;
|
||||
|
||||
/* From now till the next successful probe, ering is used to
|
||||
* track probe failures. Clear accumulated device error info.
|
||||
*/
|
||||
ata_ering_clear(&dev->ering);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2765,6 +2770,8 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
||||
readid_flags, dev->id);
|
||||
switch (rc) {
|
||||
case 0:
|
||||
/* clear error info accumulated during probe */
|
||||
ata_ering_clear(&dev->ering);
|
||||
new_mask |= 1 << dev->devno;
|
||||
break;
|
||||
case -ENOENT:
|
||||
|
Reference in New Issue
Block a user