aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2018-03-14 18:13:39 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2018-03-15 00:52:33 -0400
commit09dd15e0d9547ca424de4043bcd429bab6f285c8 (patch)
tree2d7a16fcae97480df815b53ac43853912f24d9a2
parentc3506df85091ab41cf7716244c460e15136100c4 (diff)
scsi: ibmvfc: Avoid unnecessary port relogin
Following an RSCN, ibmvfc will issue an ADISC to determine if the underlying target has changed, comparing the SCSI ID, WWPN, and WWNN to determine how to handle the rport in discovery. However, the comparison of the WWPN and WWNN was performing a memcmp between a big endian field against a CPU endian field, which resulted in the wrong answer on LE systems. This was observed as unexpected errors getting logged at boot time as targets were getting relogins when not needed. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index b1b1d3a3b173..daefe8172b04 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -3579,11 +3579,9 @@ static void ibmvfc_tgt_implicit_logout(struct ibmvfc_target *tgt)
3579static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad, 3579static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad,
3580 struct ibmvfc_target *tgt) 3580 struct ibmvfc_target *tgt)
3581{ 3581{
3582 if (memcmp(&mad->fc_iu.response[2], &tgt->ids.port_name, 3582 if (wwn_to_u64((u8 *)&mad->fc_iu.response[2]) != tgt->ids.port_name)
3583 sizeof(tgt->ids.port_name)))
3584 return 1; 3583 return 1;
3585 if (memcmp(&mad->fc_iu.response[4], &tgt->ids.node_name, 3584 if (wwn_to_u64((u8 *)&mad->fc_iu.response[4]) != tgt->ids.node_name)
3586 sizeof(tgt->ids.node_name)))
3587 return 1; 3585 return 1;
3588 if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id) 3586 if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id)
3589 return 1; 3587 return 1;