--- /dev/null
+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);