aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Yan <yanaijie@huawei.com>2019-05-20 10:06:00 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2019-06-18 19:46:23 -0400
commita1b6fb947f92352bc8edab901d773306c5b80b8b (patch)
tree4bf8e49f502f890b307303ec0189d6edc82708e2
parenta5c990eea5ddd587bcd9af6dc973a1653c8d94af (diff)
scsi: libsas: no need to join wide port again in sas_ex_discover_dev()
Since we are processing events synchronously now, the second call of sas_ex_join_wide_port() in sas_ex_discover_dev() is not needed. There will be no races with other works in disco workqueue. So remove the second sas_ex_join_wide_port(). I did not change the return value of 'res' to error when discover failed because we need to continue to discover other phys if one phy discover failed. So let's keep that logic as before and just add a debug log to detect the failure. And directly return if second fanout expander attatched to the parent expander because it has nothing to do after the phy is disabled. Signed-off-by: Jason Yan <yanaijie@huawei.com> Reviewed-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/libsas/sas_expander.c26
1 files changed, 4 insertions, 22 deletions
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index 76ea83ddafa7..fd16a3debef4 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -1090,7 +1090,7 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
1090 SAS_ADDR(dev->sas_addr), 1090 SAS_ADDR(dev->sas_addr),
1091 phy_id); 1091 phy_id);
1092 sas_ex_disable_phy(dev, phy_id); 1092 sas_ex_disable_phy(dev, phy_id);
1093 break; 1093 return res;
1094 } else 1094 } else
1095 memcpy(dev->port->disc.fanout_sas_addr, 1095 memcpy(dev->port->disc.fanout_sas_addr,
1096 ex_phy->attached_sas_addr, SAS_ADDR_SIZE); 1096 ex_phy->attached_sas_addr, SAS_ADDR_SIZE);
@@ -1102,27 +1102,9 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
1102 break; 1102 break;
1103 } 1103 }
1104 1104
1105 if (child) { 1105 if (!child)
1106 int i; 1106 pr_notice("ex %016llx phy%02d failed to discover\n",
1107 1107 SAS_ADDR(dev->sas_addr), phy_id);
1108 for (i = 0; i < ex->num_phys; i++) {
1109 if (ex->ex_phy[i].phy_state == PHY_VACANT ||
1110 ex->ex_phy[i].phy_state == PHY_NOT_PRESENT)
1111 continue;
1112 /*
1113 * Due to races, the phy might not get added to the
1114 * wide port, so we add the phy to the wide port here.
1115 */
1116 if (SAS_ADDR(ex->ex_phy[i].attached_sas_addr) ==
1117 SAS_ADDR(child->sas_addr)) {
1118 ex->ex_phy[i].phy_state= PHY_DEVICE_DISCOVERED;
1119 if (sas_ex_join_wide_port(dev, i))
1120 pr_debug("Attaching ex phy%02d to wide port %016llx\n",
1121 i, SAS_ADDR(ex->ex_phy[i].attached_sas_addr));
1122 }
1123 }
1124 }
1125
1126 return res; 1108 return res;
1127} 1109}
1128 1110