diff options
author | nagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com> | 2011-11-30 21:22:56 -0500 |
---|---|---|
committer | Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com> | 2012-02-13 15:14:52 -0500 |
commit | c106ec06c60a0eeb07dcf04bba0d7325ad43131c (patch) | |
tree | fa9c789f24df1243dfb2b34fa282d4afb1a30f47 | |
parent | feac928e5bd2513fa600a7747244929c775d58d7 (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.c | 7 |
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 | ||