| From foo@baz Sat Jul 28 12:10:33 CEST 2018 |
| From: Damien Le Moal <damien.lemoal@wdc.com> |
| Date: Wed, 9 May 2018 09:28:12 +0900 |
| Subject: libata: Fix command retry decision |
| |
| From: Damien Le Moal <damien.lemoal@wdc.com> |
| |
| [ Upstream commit 804689ad2d9b66d0d3920b48cf05881049d44589 ] |
| |
| For failed commands with valid sense data (e.g. NCQ commands), |
| scsi_check_sense() is used in ata_analyze_tf() to determine if the |
| command can be retried. In such case, rely on this decision and ignore |
| the command error mask based decision done in ata_worth_retry(). |
| |
| This fixes useless retries of commands such as unaligned writes on zoned |
| disks (TYPE_ZAC). |
| |
| Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> |
| Reviewed-by: Hannes Reinecke <hare@suse.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/ata/libata-eh.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/ata/libata-eh.c |
| +++ b/drivers/ata/libata-eh.c |
| @@ -2198,12 +2198,16 @@ static void ata_eh_link_autopsy(struct a |
| if (qc->err_mask & ~AC_ERR_OTHER) |
| qc->err_mask &= ~AC_ERR_OTHER; |
| |
| - /* SENSE_VALID trumps dev/unknown error and revalidation */ |
| + /* |
| + * SENSE_VALID trumps dev/unknown error and revalidation. Upper |
| + * layers will determine whether the command is worth retrying |
| + * based on the sense data and device class/type. Otherwise, |
| + * determine directly if the command is worth retrying using its |
| + * error mask and flags. |
| + */ |
| if (qc->flags & ATA_QCFLAG_SENSE_VALID) |
| qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); |
| - |
| - /* determine whether the command is worth retrying */ |
| - if (ata_eh_worth_retry(qc)) |
| + else if (ata_eh_worth_retry(qc)) |
| qc->flags |= ATA_QCFLAG_RETRY; |
| |
| /* accumulate error info */ |