1
linux/drivers/ata
Niklas Cassel 8e59a2a545 ata: libata: Set DID_TIME_OUT for commands that actually timed out
When ata_qc_complete() schedules a command for EH using
ata_qc_schedule_eh(), blk_abort_request() will be called, which leads to
req->q->mq_ops->timeout() / scsi_timeout() being called.

scsi_timeout(), if the LLDD has no abort handler (libata has no abort
handler), will set host byte to DID_TIME_OUT, and then call
scsi_eh_scmd_add() to add the command to EH.

Thus, when commands first enter libata's EH strategy_handler, all the
commands that have been added to EH will have DID_TIME_OUT set.

Commit e5dd410acb ("ata: libata: Clear DID_TIME_OUT for ATA PT commands
with sense data") clears this bogus DID_TIME_OUT flag for all commands
that reached libata's EH strategy_handler.

libata has its own flag (AC_ERR_TIMEOUT), that it sets for commands that
have not received a completion at the time of entering EH.

ata_eh_worth_retry() has no special handling for AC_ERR_TIMEOUT, so by
default timed out commands will get flag ATA_QCFLAG_RETRY set, and will be
retried after the port has been reset (ata_eh_link_autopsy() always
triggers a port reset if any command has AC_ERR_TIMEOUT set).

For a command that has ATA_QCFLAG_RETRY set, while also having an error
flag set (e.g. AC_ERR_TIMEOUT), ata_eh_finish() will not increment
scmd->allowed, so the command will at most be retried scmd->allowed number
of times (which by default is set to 3).

However, scsi_eh_flush_done_q() will only retry commands for which
scsi_noretry_cmd() returns false.

For a command that has DID_TIME_OUT set, while also having either the
FAILFAST flag set, or the command being a passthrough command,
scsi_noretry_cmd() will return true. Thus, such a command will never be
retried.

Thus, make sure that libata sets SCSI's DID_TIME_OUT flag for commands that
actually timed out (libata's AC_ERR_TIMEOUT flag), such that timed out
commands will once again not be retried if they are also a FAILFAST or
passthrough command.

Cc: stable@vger.kernel.org
Fixes: e5dd410acb ("ata: libata: Clear DID_TIME_OUT for ATA PT commands with sense data")
Reported-by: Lai, Yi <yi1.lai@linux.intel.com>
Closes: https://lore.kernel.org/linux-ide/ZxYz871I3Blsi30F@ly-workstation/
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20241023105540.1070012-2-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
2024-10-24 11:14:00 +02:00
..
pata_parport parport: Remove parport_driver.devmodel 2024-07-03 16:44:22 +02:00
acard-ahci.c
ahci_brcm.c ata: ahci_brcm: Use devm_platform_ioremap_resource_byname() helper function 2024-08-28 10:32:21 +09:00
ahci_ceva.c ata: ahci_ceva: fix error handling for Xilinx GT PHY support 2024-02-19 10:44:37 +01:00
ahci_da850.c
ahci_dm816.c
ahci_dwc.c
ahci_imx.c ata: ahci_imx: Fix error code in probe() 2024-08-15 13:44:33 +02:00
ahci_mtk.c
ahci_mvebu.c
ahci_octeon.c
ahci_platform.c
ahci_qoriq.c
ahci_seattle.c
ahci_st.c ata: ahci_st: Remove an unused field in struct st_ahci_drv_data 2024-04-02 12:18:15 +09:00
ahci_sunxi.c
ahci_tegra.c
ahci_xgene.c
ahci.c ata: ahci: Rephrase comment to not use the term blacklist 2024-07-30 07:10:14 +09:00
ahci.h scsi: libata: Switch to using ->device_configure 2024-04-11 21:37:50 -04:00
ata_generic.c
ata_piix.c ata: ata_piix: Remove useless comment in piix_init_sidpr() 2024-07-30 07:10:25 +09:00
Kconfig ata: Kconfig: Update SATA_MOBILE_LPM_POLICY default to med_power_with_dipm 2024-05-27 11:34:50 +02:00
libahci_platform.c ata: libahci_platform: Simplify code with for_each_child_of_node_scoped() 2024-08-15 13:30:06 +02:00
libahci.c ata: libata-core: Set ATA_QCFLAG_RTF_FILLED in fill_result_tf() 2024-07-03 10:51:41 +02:00
libata-acpi.c
libata-core.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
libata-eh.c ata: libata: Set DID_TIME_OUT for commands that actually timed out 2024-10-24 11:14:00 +02:00
libata-pata-timings.c
libata-pmp.c ata: libata: Move sector_buf from struct ata_port to struct ata_device 2024-09-07 10:16:55 +09:00
libata-sata.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
libata-scsi.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
libata-sff.c ata: libata: Remove ata_noop_qc_prep() 2024-08-02 09:18:42 +09:00
libata-trace.c
libata-transport.c ata: libata: Fix W=1 compilation warning 2024-09-07 11:02:52 +09:00
libata-transport.h ata,scsi: Remove wrappers ata_sas_tport_{add,delete}() 2024-07-04 11:52:31 +02:00
libata-zpodd.c ata: libata: Move sector_buf from struct ata_port to struct ata_device 2024-09-07 10:16:55 +09:00
libata.h ata: libata: Improve CDL resource management 2024-09-07 10:16:56 +09:00
Makefile
pata_acpi.c
pata_ali.c
pata_amd.c
pata_arasan_cf.c
pata_artop.c
pata_atiixp.c
pata_atp867x.c
pata_buddha.c
pata_cmd64x.c
pata_cmd640.c
pata_cs5520.c ata: pata_cs5520: Rephrase file header comment 2024-07-30 07:10:30 +09:00
pata_cs5530.c
pata_cs5535.c
pata_cs5536.c
pata_cypress.c
pata_efar.c
pata_ep93xx.c soc: convert ep93xx to devicetree 2024-09-26 12:00:25 -07:00
pata_falcon.c
pata_ftide010.c ata: pata_ftide010: Enable module autoloading 2024-09-02 08:05:36 +09:00
pata_gayle.c
pata_hpt3x2n.c
pata_hpt3x3.c
pata_hpt37x.c ata: pata_hpt37x: Rename hpt_dma_blacklisted() 2024-07-30 07:10:38 +09:00
pata_hpt366.c ata: pata_hpt366: Rename hpt_dma_blacklisted() 2024-07-30 07:10:34 +09:00
pata_icside.c ata: libata: Remove ata_noop_qc_prep() 2024-08-02 09:18:42 +09:00
pata_imx.c
pata_isapnp.c
pata_it821x.c ata: libata: Use QUIRK instead of HORKAGE 2024-07-30 07:09:54 +09:00
pata_it8213.c
pata_ixp4xx_cf.c ata: pata_ixp4xx: Enable module autoloading 2024-09-02 08:06:04 +09:00
pata_jmicron.c
pata_legacy.c ata: pata_legacy: make legacy_exit() work again 2024-05-07 07:23:31 +09:00
pata_macio.c ata: pata_macio: Use WARN instead of BUG 2024-08-21 14:33:23 +09:00
pata_marvell.c
pata_mpc52xx.c ata: libata: Remove ata_noop_qc_prep() 2024-08-02 09:18:42 +09:00
pata_mpiix.c
pata_netcell.c
pata_ninja32.c
pata_ns87410.c
pata_ns87415.c
pata_octeon_cf.c ata: libata: Remove ata_noop_qc_prep() 2024-08-02 09:18:42 +09:00
pata_of_platform.c
pata_oldpiix.c
pata_opti.c
pata_optidma.c
pata_pcmcia.c
pata_pdc202xx_old.c
pata_pdc2027x.c
pata_piccolo.c
pata_platform.c
pata_pxa.c
pata_radisys.c
pata_rb532_cf.c
pata_rdc.c
pata_rz1000.c
pata_sc1200.c
pata_sch.c
pata_serverworks.c ata: pata_serverworks: Do not use the term blacklist 2024-07-30 07:10:08 +09:00
pata_sil680.c
pata_sis.c
pata_sl82c105.c
pata_triflex.c
pata_via.c
pdc_adma.c
sata_dwc_460ex.c
sata_fsl.c
sata_gemini.c ata: sata_gemini: Enable module autoloading 2024-09-02 08:06:23 +09:00
sata_gemini.h
sata_highbank.c
sata_inic162x.c
sata_mv.c SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
sata_nv.c scsi: libata: Switch to using ->device_configure 2024-04-11 21:37:50 -04:00
sata_promise.c
sata_promise.h
sata_qstor.c
sata_rcar.c
sata_sil24.c scsi: libata: Switch to using ->device_configure 2024-04-11 21:37:50 -04:00
sata_sil.c ata: sata_sil: Rename sil_blacklist to sil_quirks 2024-07-30 07:10:21 +09:00
sata_sis.c
sata_svw.c
sata_sx4.c ata: sata_sx4: fix pdc20621_get_from_dimm() on 64-bit 2024-04-01 07:52:17 +09:00
sata_uli.c
sata_via.c
sata_vsc.c
sis.h