diff options
author | Eric Moore <eric.moore@lsi.com> | 2007-09-29 12:16:53 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-12 14:52:15 -0400 |
commit | e8206381f5842269691f3164ec0d79b7059bd710 (patch) | |
tree | 4d3db0df57f86b34425dcfe929c940d8d06fe614 /drivers/message/fusion/mptsas.c | |
parent | bc6e089a13a5c0ac36247616baecd6fc77405e7f (diff) |
[SCSI] mpt fusion: lock down ScsiLookup
ScsiLookup is an array of pending scmd pointers that the scsi lld
maintains. This array is touched from queuecommand, eh threads, and
interrupt context. This array should put under locks, hence this patch
to synchronize its access. I've added some nice little function
wrappers for this, and moved the ScsiLookup array over to MPT_ADAPTER
struct.
Signed-off-by: Eric Moore <Eric.Moore@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/message/fusion/mptsas.c')
-rw-r--r-- | drivers/message/fusion/mptsas.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 4c641c6f98a6..ba4f5e7fcbc7 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -3221,15 +3221,16 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
3221 | /* SCSI needs scsi_cmnd lookup table! | 3221 | /* SCSI needs scsi_cmnd lookup table! |
3222 | * (with size equal to req_depth*PtrSz!) | 3222 | * (with size equal to req_depth*PtrSz!) |
3223 | */ | 3223 | */ |
3224 | hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); | 3224 | ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); |
3225 | if (!hd->ScsiLookup) { | 3225 | if (!ioc->ScsiLookup) { |
3226 | error = -ENOMEM; | 3226 | error = -ENOMEM; |
3227 | spin_unlock_irqrestore(&ioc->FreeQlock, flags); | 3227 | spin_unlock_irqrestore(&ioc->FreeQlock, flags); |
3228 | goto out_mptsas_probe; | 3228 | goto out_mptsas_probe; |
3229 | } | 3229 | } |
3230 | spin_lock_init(&ioc->scsi_lookup_lock); | ||
3230 | 3231 | ||
3231 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", | 3232 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", |
3232 | ioc->name, hd->ScsiLookup)); | 3233 | ioc->name, ioc->ScsiLookup)); |
3233 | 3234 | ||
3234 | /* Clear the TM flags | 3235 | /* Clear the TM flags |
3235 | */ | 3236 | */ |