Commit 79a55b72 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata: fix handling of port actions in per-dev action mask

libata EH ignores port-wide actions in per-dev action mask.  However,
device resume requests EH_SOFTRESET using per-dev action mask.  Under
certain circumstances, this results in not resetting frozen port after
resuming which causes failure of all commands.

This patch allows port-wide actions to be requested in per-dev action
mask.  Before EH recovery starts, port-wide actions will be collected.
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 501e0c50
...@@ -1979,6 +1979,10 @@ static int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, ...@@ -1979,6 +1979,10 @@ static int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
ehc->tries[dev->devno] = ATA_EH_DEV_TRIES; ehc->tries[dev->devno] = ATA_EH_DEV_TRIES;
/* collect port action mask recorded in dev actions */
ehc->i.action |= ehc->i.dev_action[i] & ~ATA_EH_PERDEV_MASK;
ehc->i.dev_action[i] &= ATA_EH_PERDEV_MASK;
/* process hotplug request */ /* process hotplug request */
if (dev->flags & ATA_DFLAG_DETACH) if (dev->flags & ATA_DFLAG_DETACH)
ata_eh_detach_dev(dev); ata_eh_detach_dev(dev);
......
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