mpt fusion: locking down ScsiLookup
Subsystems (2)
PATCH 3/6 mpt fusion: locking 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 <[email protected]>
drivers/message/fusion/mptbase.h +2 -1
@@ -704,6 +704,8 @@ typedef struct _MPT_ADAPTERstruct work_struct fc_rescan_work;char fc_rescan_work_q_name[KOBJ_NAME_LEN ];struct workqueue_struct *fc_rescan_work_q; +struct scsi_cmnd **ScsiLookup; +spinlock_t scsi_lookup_lock; }MPT_ADAPTER ;/*
@@ -817,7 +819,6 @@ typedef struct _MPT_SCSI_HOST {MPT_ADAPTER *ioc;int port;u32 pad0; -struct scsi_cmnd **ScsiLookup;MPT_LOCAL_REPLY *pLocal;/* used for internal commands */ struct timer_list timer;/* Pool of memory for holding SCpnts before doing
drivers/message/fusion/mptfc.c +4 -3
@@ -1282,14 +1282,15 @@ mptfc_probe(struct pci_dev *pdev, const/* SCSI needs scsi_cmnd lookup table! * (with size equal to req_depth*PtrSz!) */ - hd->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); -if (!hd->ScsiLookup) { + ioc->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); +if (!ioc->ScsiLookup) { error = -ENOMEM ; goto out_mptfc_probe; } +spin_lock_init (&ioc->scsi_lookup_lock);dprintk (ioc,printk (MYIOC_s_DEBUG_FMT"ScsiLookup @ %p\n" , - ioc->name, hd->ScsiLookup)); + ioc->name, ioc->ScsiLookup));/* Clear the TM flags */
drivers/message/fusion/mptsas.c +4 -3
@@ -3221,15 +3221,16 @@ mptsas_probe(struct pci_dev *pdev, const/* SCSI needs scsi_cmnd lookup table! * (with size equal to req_depth*PtrSz!) */ - hd->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); -if (!hd->ScsiLookup) { + ioc->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); +if (!ioc->ScsiLookup) { error = -ENOMEM ;spin_unlock_irqrestore (&ioc->FreeQlock, flags); goto out_mptsas_probe; } +spin_lock_init (&ioc->scsi_lookup_lock);dprintk (ioc,printk (MYIOC_s_DEBUG_FMT"ScsiLookup @ %p\n" , - ioc->name, hd->ScsiLookup)); + ioc->name, ioc->ScsiLookup));/* Clear the TM flags */
drivers/message/fusion/mptscsih.c +135 -77
329 lines not on this page · raw message
drivers/message/fusion/mptspi.c +4 -3
@@ -1446,14 +1446,15 @@ mptspi_probe(struct pci_dev *pdev, const/* SCSI needs scsi_cmnd lookup table! * (with size equal to req_depth*PtrSz!) */ - hd->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); -if (!hd->ScsiLookup) { + ioc->ScsiLookup =kcalloc (ioc->req_depth,sizeof (void *),GFP_ATOMIC ); +if (!ioc->ScsiLookup) { error = -ENOMEM ; goto out_mptspi_probe; } +spin_lock_init (&ioc->scsi_lookup_lock);dprintk (ioc,printk (MYIOC_s_DEBUG_FMT"ScsiLookup @ %p\n" , - ioc->name, hd->ScsiLookup)); + ioc->name, ioc->ScsiLookup));/* Clear the TM flags */