]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_relogin_fix.patch
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / ibmvfc_relogin_fix.patch
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_relogin_fix.patch b/src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_relogin_fix.patch
new file mode 100644 (file)
index 0000000..5a45fab
--- /dev/null
@@ -0,0 +1,50 @@
+Subject: Fix rport relogin
+From: Brian King <brking@linux.vnet.ibm.com>
+References: 472645 - LTC51429
+
+The ibmvfc driver has a bug in its SCN handling. If it receives
+an ELS event such asn an N-Port SCN event or an unsolicited PLOGI,
+or any other SCN event which causes ibmvfc_reinit_host to be called,
+it is possible that we will call fc_remote_port_add for a target
+that already has an rport added, which can result in duplicate
+rports getting created for the same targets. Fix this by calling
+fc_remote_port_rolechg in this scenario instead to report any possible
+role change that may have occurred.
+
+Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
+Signed-off-by: Olaf Hering <olh@suse.de>
+---
+
+ drivers/scsi/ibmvscsi/ibmvfc.c |   12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/ibmvscsi/ibmvfc.c
++++ b/drivers/scsi/ibmvscsi/ibmvfc.c
+@@ -3315,6 +3315,7 @@ static int ibmvfc_alloc_target(struct ib
+               return -ENOMEM;
+       }
++      memset(tgt, 0, sizeof(*tgt));
+       tgt->scsi_id = scsi_id;
+       tgt->new_scsi_id = scsi_id;
+       tgt->vhost = vhost;
+@@ -3625,9 +3626,18 @@ static void ibmvfc_log_ae(struct ibmvfc_
+ static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
+ {
+       struct ibmvfc_host *vhost = tgt->vhost;
+-      struct fc_rport *rport;
++      struct fc_rport *rport = tgt->rport;
+       unsigned long flags;
++      if (rport) {
++              tgt_dbg(tgt, "Setting rport roles\n");
++              fc_remote_port_rolechg(rport, tgt->ids.roles);
++              spin_lock_irqsave(vhost->host->host_lock, flags);
++              ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
++              spin_unlock_irqrestore(vhost->host->host_lock, flags);
++              return;
++      }
++
+       tgt_dbg(tgt, "Adding rport\n");
+       rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
+       spin_lock_irqsave(vhost->host->host_lock, flags);