[SCSI] libsas: don't recover 'gone' devices in sas_ata_hard_reset()
authorDan Williams <dan.j.williams@intel.com>
Thu, 22 Dec 2011 22:58:24 +0000 (14:58 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 29 Feb 2012 19:04:59 +0000 (13:04 -0600)
The commands that timeout when a disk is forcibly removed may trigger
libata to attempt recovery of the device.  If libsas has decided to
remove the device don't permit ata to continue to issue resets to its
last known phy.

The primary motivation for this patch is hotplug testing by writing 0 to
/sys/class/sas_phy/phyX/enable.  Without this check this test leads to
libata issuing a reset and re-enabling the device that wants to be torn
down.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/libsas/sas_ata.c

index 92f7e78a096c81126c9e9dca3c7de9753035d374..0cb538f8478ab0f9876604da60f3dafe88291d61 100644 (file)
@@ -326,6 +326,9 @@ static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
        struct domain_device *dev = ap->private_data;
        struct sas_internal *i = dev_to_sas_internal(dev);
 
+       if (test_bit(SAS_DEV_GONE, &dev->state))
+               return -ENODEV;
+
        res = i->dft->lldd_I_T_nexus_reset(dev);
 
        if (res != TMF_RESP_FUNC_COMPLETE)