* [REPOST][PATCH 4/6] mpt fusion - fix fibre channel infinite request/response loop
@ 2006-05-24 20:07 Michael Reed
0 siblings, 0 replies; only message in thread
From: Michael Reed @ 2006-05-24 20:07 UTC (permalink / raw)
To: linux-scsi; +Cc: James Bottomley, Moore, Eric Dean
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
While doing board reset testing I was able to put the system in
an infinite request/response loop between the scsi layer and
mptscsih_qcmd() by aborting the reset. This patch installs
a "SETUP RESET" handler which calls fc_remote_port_delete()
for all registered rports. This blocks the target which
prevents the loop. Additionally, should the reset fail to
complete, the transport will now terminate i/o to the target.
(Insertion point changes.)
Signed-off-by: Michael Reed <mdr@sgi.com>
[-- Attachment #2: 04-mptfc_setup_reset.patch --]
[-- Type: text/x-patch, Size: 2930 bytes --]
While doing board reset testing I was able to put the system in
an infinite request/response loop between the scsi layer and
mptscsih_qcmd() by aborting the reset. This patch installs
a "SETUP RESET" handler which calls fc_remote_port_delete()
for all registered rports. This blocks the target which
prevents the loop. Additionally, should the reset fail to
complete, the transport will now terminate i/o to the target.
Signed-off-by: Michael Reed <mdr@sgi.com>
--- rc4u/drivers/message/fusion/mptbase.h 2006-05-24 14:39:18.792259154 -0500
+++ rc4/drivers/message/fusion/mptbase.h 2006-05-24 14:40:39.319168329 -0500
@@ -635,6 +635,7 @@
int num_ports;
struct work_struct mptscsih_persistTask;
+ struct work_struct fc_setup_reset_work;
struct list_head fc_rports;
spinlock_t fc_rescan_work_lock;
int fc_rescan_work_count;
--- rc4u/drivers/message/fusion/mptfc.c 2006-05-24 14:39:18.792259154 -0500
+++ rc4/drivers/message/fusion/mptfc.c 2006-05-24 14:40:39.323167905 -0500
@@ -580,10 +580,10 @@
#ifdef DMPT_DEBUG_FC
if (unlikely(err)) {
dfcprintk ((MYIOC_s_INFO_FMT
- "mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero.\n",
+ "mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n",
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
- SCpnt->device->id,SCpnt->device->lun));
+ SCpnt->device->id,SCpnt->device->lun,err));
}
#endif
return err;
@@ -873,6 +873,31 @@
}
static void
+mptfc_setup_reset(void *arg)
+{
+ MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
+ u64 pn;
+ struct mptfc_rport_info *ri;
+
+ /* reset about to happen, delete (block) all rports */
+ list_for_each_entry(ri, &ioc->fc_rports, list) {
+ if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
+ ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED;
+ fc_remote_port_delete(ri->rport); /* won't sleep */
+ ri->rport = NULL;
+
+ pn = (u64)ri->pg0.WWPN.High << 32 |
+ (u64)ri->pg0.WWPN.Low;
+ dfcprintk ((MYIOC_s_INFO_FMT
+ "mptfc_setup_reset.%d: %llx deleted\n",
+ ioc->name,
+ ioc->sh->host_no,
+ (unsigned long long)pn));
+ }
+ }
+}
+
+static void
mptfc_rescan_devices(void *arg)
{
MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
@@ -1008,6 +1033,7 @@
spin_lock_init(&ioc->fc_rescan_work_lock);
INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices,(void *)ioc);
+ INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset, (void *)ioc);
spin_lock_irqsave(&ioc->FreeQlock, flags);
@@ -1230,6 +1256,12 @@
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
if (reset_phase == MPT_IOC_SETUP_RESET) {
+ spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
+ if (ioc->fc_rescan_work_q) {
+ queue_work(ioc->fc_rescan_work_q,
+ &ioc->fc_setup_reset_work);
+ }
+ spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
}
else if (reset_phase == MPT_IOC_PRE_RESET) {
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-05-24 20:07 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-05-24 20:07 [REPOST][PATCH 4/6] mpt fusion - fix fibre channel infinite request/response loop Michael Reed
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.