Re: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off

From: yangxingui
Date: Fri Dec 16 2022 - 02:55:40 EST




On 2022/12/16 11:53, Jason Yan wrote:
Hi Xingui,

On 2022/12/16 11:29, Xingui Yang wrote:
If the ATA device fell off, call sas_ata_device_link_abort() directly and
mark all outstanding QCs as failed and kick-off EH Immediately. This avoids
having to wait for block layer timeouts.


Why does ATA device need this special operation? SAS device does not have to wait for block layer timeouts?
Hi Jason,
Applications that depend on I/O return may be blocked for 30 seconds, and this can be optimized for SATA disks.

Different from SATA disks, I/Os on SAS disks can still be returned if they are quickly plugged in after the SAS disks fall off. So I'm not sure if this is appropriate for a sas disk.
BTW, I wish the sas disk did the same.

Thanks,
Xingui

Thanks,
Jason

Signed-off-by: Xingui Yang <yangxingui@xxxxxxxxxx>
---
  drivers/scsi/libsas/sas_discover.c | 5 +++++
  1 file changed, 5 insertions(+)

diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index d5bc1314c341..bd22741daa99 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -362,6 +362,11 @@ static void sas_destruct_ports(struct asd_sas_port *port)
  void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
  {
+    if (test_bit(SAS_DEV_GONE, &dev->state) &&
+        (dev->dev_type == SAS_SATA_DEV ||
+        (dev->tproto & SAS_PROTOCOL_STP)))
+        sas_ata_device_link_abort(dev, false);
+
      if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
          !list_empty(&dev->disco_list_node)) {
          /* this rphy never saw sas_rphy_add */

.