Commit 02c05a27 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata: factor out ata_eh_schedule_probe()

Factor out ata_eh_schedule_probe() from ata_eh_handle_dev_fail() and
ata_eh_recover().  This is to improve maintainability and make future
changes easier.

In the previous revision, ata_dev_enabled() test was accidentally
dropped while factoring out.  This problem was spotted by Bartlomiej.
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 405e66b3
...@@ -2375,6 +2375,22 @@ static int ata_eh_skip_recovery(struct ata_link *link) ...@@ -2375,6 +2375,22 @@ static int ata_eh_skip_recovery(struct ata_link *link)
return 1; return 1;
} }
static int ata_eh_schedule_probe(struct ata_device *dev)
{
struct ata_eh_context *ehc = &dev->link->eh_context;
if (!(ehc->i.probe_mask & (1 << dev->devno)) ||
(ehc->did_probe_mask & (1 << dev->devno)))
return 0;
ata_eh_detach_dev(dev);
ata_dev_init(dev);
ehc->did_probe_mask |= (1 << dev->devno);
ehc->i.action |= ATA_EH_SOFTRESET;
return 1;
}
static int ata_eh_handle_dev_fail(struct ata_device *dev, int err) static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
{ {
struct ata_eh_context *ehc = &dev->link->eh_context; struct ata_eh_context *ehc = &dev->link->eh_context;
...@@ -2406,16 +2422,9 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err) ...@@ -2406,16 +2422,9 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
if (ata_link_offline(dev->link)) if (ata_link_offline(dev->link))
ata_eh_detach_dev(dev); ata_eh_detach_dev(dev);
/* probe if requested */ /* schedule probe if necessary */
if ((ehc->i.probe_mask & (1 << dev->devno)) && if (ata_eh_schedule_probe(dev))
!(ehc->did_probe_mask & (1 << dev->devno))) {
ata_eh_detach_dev(dev);
ata_dev_init(dev);
ehc->tries[dev->devno] = ATA_EH_DEV_TRIES; ehc->tries[dev->devno] = ATA_EH_DEV_TRIES;
ehc->did_probe_mask |= (1 << dev->devno);
ehc->i.action |= ATA_EH_SOFTRESET;
}
return 1; return 1;
} else { } else {
...@@ -2492,14 +2501,9 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, ...@@ -2492,14 +2501,9 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
if (dev->flags & ATA_DFLAG_DETACH) if (dev->flags & ATA_DFLAG_DETACH)
ata_eh_detach_dev(dev); ata_eh_detach_dev(dev);
if (!ata_dev_enabled(dev) && /* schedule probe if necessary */
((ehc->i.probe_mask & (1 << dev->devno)) && if (!ata_dev_enabled(dev))
!(ehc->did_probe_mask & (1 << dev->devno)))) { ata_eh_schedule_probe(dev);
ata_eh_detach_dev(dev);
ata_dev_init(dev);
ehc->did_probe_mask |= (1 << dev->devno);
ehc->i.action |= ATA_EH_SOFTRESET;
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment