]> err.no Git - linux-2.6/commitdiff
[SCSI] fusion mpt: fix target missing after resetting external raid
authorMichael Reed <mdr@sgi.com>
Thu, 13 Mar 2008 19:53:56 +0000 (14:53 -0500)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Tue, 27 May 2008 15:58:09 +0000 (10:58 -0500)
Following a hard reset of a SAS raid, one of the raid targets is occasionally
missing.  I tracked this down to a pretty obscure little bug.

The LSI fusion drivers for SAS and Fibre Channel both use their respective
transport layers.  Those transport layers increment the target number
assigned to new targets.

The routine __scsi_scan_target uses the "this_id" element of the Scsi_Host
structure to avoid scanning the scsi host adapter.  Both fusion drivers set
"this_id" from a value returned in a firmware PortFacts response.  For my
particular test case (SAS) the firmware id assigned to the initiator was
173.  After enough raid resets to cause the raid targets to go and come a
sufficient number of times, the id assigned by the transport to a raid
target would match the id assigned by the host adapter to the "this_id"
field, resulting in that target not being scanned.

Fix by not assigning this_id and not checking it in slave_configure.

Signed-off-by: Michael Reed <mdr@sgi.com>
Acked-by: "Moore, Eric" <Eric.Moore@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptscsih.c

index 3cdd4e9621150bcfae62c741deadb179040561ff..1e24ab4ac38c4f01f9434f0a0b2f06375c248a9a 100644 (file)
@@ -1238,8 +1238,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        sh->max_id = ioc->pfacts->MaxDevices;
        sh->max_lun = max_lun;
 
-       sh->this_id = ioc->pfacts[0].PortSCSIID;
-
        /* Required entry.
         */
        sh->unique_id = ioc->id;
index 468480771f1304ff5e86b838c3eb3b08b53ebdae..4d492ba232b046ffb424e8fbc864db0dd839eb02 100644 (file)
@@ -3193,8 +3193,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        sh->transportt = mptsas_transport_template;
 
-       sh->this_id = ioc->pfacts[0].PortSCSIID;
-
        /* Required entry.
         */
        sh->unique_id = ioc->id;
index b109bd8a4d199b76a08270b14158d658ba217781..c68ef00c2f92d95472f369d163d02561ae6c8ad6 100644 (file)
@@ -2451,12 +2451,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
                    ioc->name, sdev->sdtr, sdev->wdtr,
                    sdev->ppr, sdev->inquiry_len));
 
-       if (sdev->id > sh->max_id) {
-               /* error case, should never happen */
-               scsi_adjust_queue_depth(sdev, 0, 1);
-               goto slave_configure_exit;
-       }
-
        vdevice->configured_lun = 1;
        mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
 
@@ -2470,8 +2464,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
                    ioc->name, vtarget->negoFlags, vtarget->maxOffset,
                    vtarget->minSyncFactor));
 
-slave_configure_exit:
-
        dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                "tagged %d, simple %d, ordered %d\n",
                ioc->name,sdev->tagged_supported, sdev->simple_tags,