aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com>2011-10-21 00:36:33 -0400
committerHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>2011-11-21 12:55:13 -0500
commite5aaabe4d1b1722dae3e5050e4764d89502964d5 (patch)
tree5b2e8111931c4e8244d150337e18072cf35885ae
parent9fd1ab0239852441ba8fdf5effd548ac407a6058 (diff)
mpt2sas: Fix for system hang when discovery in progress
BugLink: http://bugs.launchpad.net/bugs/890952 commit 0167ac67ff6f35bf2364f7672c8012b0cd40277f upstream. Fix for issue : While discovery is in progress, hot unplug and hot plug of enclosure connected to the controller card is causing system to hang. When a device is in the process of being detected at driver load time then if it is removed, the device that is no longer present will not be added to the list. So the code in _scsih_probe_sas() is rearranged as such so the devices that failed to be detected are not added to the list. Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index 8dc2ad4a0a3..5690f09e010 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -7318,22 +7318,27 @@ _scsih_probe_sas(struct MPT2SAS_ADAPTER *ioc)
7318 /* SAS Device List */ 7318 /* SAS Device List */
7319 list_for_each_entry_safe(sas_device, next, &ioc->sas_device_init_list, 7319 list_for_each_entry_safe(sas_device, next, &ioc->sas_device_init_list,
7320 list) { 7320 list) {
7321 spin_lock_irqsave(&ioc->sas_device_lock, flags);
7322 list_move_tail(&sas_device->list, &ioc->sas_device_list);
7323 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7324 7321
7325 if (ioc->hide_drives) 7322 if (ioc->hide_drives)
7326 continue; 7323 continue;
7327 7324
7328 if (!mpt2sas_transport_port_add(ioc, sas_device->handle, 7325 if (!mpt2sas_transport_port_add(ioc, sas_device->handle,
7329 sas_device->sas_address_parent)) { 7326 sas_device->sas_address_parent)) {
7330 _scsih_sas_device_remove(ioc, sas_device); 7327 list_del(&sas_device->list);
7328 kfree(sas_device);
7329 continue;
7331 } else if (!sas_device->starget) { 7330 } else if (!sas_device->starget) {
7332 mpt2sas_transport_port_remove(ioc, 7331 mpt2sas_transport_port_remove(ioc,
7333 sas_device->sas_address, 7332 sas_device->sas_address,
7334 sas_device->sas_address_parent); 7333 sas_device->sas_address_parent);
7335 _scsih_sas_device_remove(ioc, sas_device); 7334 list_del(&sas_device->list);
7335 kfree(sas_device);
7336 continue;
7337
7336 } 7338 }
7339 spin_lock_irqsave(&ioc->sas_device_lock, flags);
7340 list_move_tail(&sas_device->list, &ioc->sas_device_list);
7341 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7337 } 7342 }
7338} 7343}
7339 7344