aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com>2011-11-30 21:22:56 -0500
committerHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>2012-02-13 15:14:52 -0500
commitc106ec06c60a0eeb07dcf04bba0d7325ad43131c (patch)
treefa9c789f24df1243dfb2b34fa282d4afb1a30f47
parentfeac928e5bd2513fa600a7747244929c775d58d7 (diff)
SCSI: mpt2sas: Release spinlock for the raid device list before blocking it
BugLink: http://bugs.launchpad.net/bugs/922799 commit 30c43282f3d347f47f9e05199d2b14f56f3f2837 upstream. Added code to release the spinlock that is used to protect the raid device list before calling a function that can block. The blocking was causing a reschedule, and subsequently it is tried to acquire the same lock, resulting in a panic (NMI Watchdog detecting a CPU lockup). 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>
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index c79857e439f..2a4719ae688 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -6425,6 +6425,7 @@ _scsih_mark_responding_raid_device(struct MPT2SAS_ADAPTER *ioc, u64 wwid,
6425 } else 6425 } else
6426 sas_target_priv_data = NULL; 6426 sas_target_priv_data = NULL;
6427 raid_device->responding = 1; 6427 raid_device->responding = 1;
6428 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6428 starget_printk(KERN_INFO, raid_device->starget, 6429 starget_printk(KERN_INFO, raid_device->starget,
6429 "handle(0x%04x), wwid(0x%016llx)\n", handle, 6430 "handle(0x%04x), wwid(0x%016llx)\n", handle,
6430 (unsigned long long)raid_device->wwid); 6431 (unsigned long long)raid_device->wwid);
@@ -6435,16 +6436,16 @@ _scsih_mark_responding_raid_device(struct MPT2SAS_ADAPTER *ioc, u64 wwid,
6435 */ 6436 */
6436 _scsih_init_warpdrive_properties(ioc, raid_device); 6437 _scsih_init_warpdrive_properties(ioc, raid_device);
6437 if (raid_device->handle == handle) 6438 if (raid_device->handle == handle)
6438 goto out; 6439 return;
6439 printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", 6440 printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n",
6440 raid_device->handle); 6441 raid_device->handle);
6441 raid_device->handle = handle; 6442 raid_device->handle = handle;
6442 if (sas_target_priv_data) 6443 if (sas_target_priv_data)
6443 sas_target_priv_data->handle = handle; 6444 sas_target_priv_data->handle = handle;
6444 goto out; 6445 return;
6445 } 6446 }
6446 } 6447 }
6447 out: 6448
6448 spin_unlock_irqrestore(&ioc->raid_device_lock, flags); 6449 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6449} 6450}
6450 6451