| From cebbert@redhat.com Thu Oct 16 15:47:56 2008 |
| From: Tejun Heo <tj@kernel.org> |
| Date: Mon, 13 Oct 2008 19:19:59 -0400 |
| Subject: libata: fix EH action overwriting in ata_eh_reset() |
| To: stable@kernel.org |
| Cc: Tejun Heo <tj@kernel.org> |
| Message-ID: <20081013191959.447d12f6@redhat.com> |
| |
| From: Tejun Heo <tj@kernel.org> |
| |
| Commit a674050e068a2919908730279f0b731ae6d2e005 upstream |
| |
| ehc->i.action got accidentally overwritten to ATA_EH_HARD/SOFTRESET in |
| ata_eh_reset(). The original intention was to clear reset action |
| which wasn't selected. This can cause unexpected behavior when other |
| EH actions are scheduled together with reset. Fix it. |
| |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Cc: Chuck Ebbert <cebbert@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ata/libata-eh.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/ata/libata-eh.c |
| +++ b/drivers/ata/libata-eh.c |
| @@ -2112,10 +2112,10 @@ int ata_eh_reset(struct ata_link *link, |
| ehc->i.action &= ~ATA_EH_RESET; |
| if (hardreset) { |
| reset = hardreset; |
| - ehc->i.action = ATA_EH_HARDRESET; |
| + ehc->i.action |= ATA_EH_HARDRESET; |
| } else if (softreset) { |
| reset = softreset; |
| - ehc->i.action = ATA_EH_SOFTRESET; |
| + ehc->i.action |= ATA_EH_SOFTRESET; |
| } |
| |
| if (prereset) { |